InnoDB: есть ли способ убить обновление и предотвратить откат? - PullRequest
2 голосов
/ 29 августа 2011

В случае, если я запустил очень длинное обновление (которое имеет миллионы записей для обновления и будет занимать несколько часов), мне было интересно, есть ли способ убить обновление без с откатом InnoDB изменения.

Я бы хотел, чтобы записи, которые уже были обновлены, остались такими, как есть (и таблица блокируется как можно скорее), что означает продолжение обновления позже, когда у меня будет время.

Это похоже на то, что MyISAM будет делать при уничтожении обновления.

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Если вы имеете в виду одно UPDATE утверждение, я могу ошибаться, но сомневаюсь, что это возможно.Тем не менее, вы всегда можете разбить ваш запрос на меньшие наборы.Вместо:

UPDATE foo SET bar=gee

... use:

UPDATE foo SET bar=gee WHERE id BETWEEN 1 AND 100;
UPDATE foo SET bar=gee WHERE id BETWEEN 101 AND 200;
UPDATE foo SET bar=gee WHERE id BETWEEN 201 AND 300;
...

Это можно автоматизировать несколькими способами.

0 голосов
/ 29 августа 2011

Я бы предложил создать таблицу black_hole с полями, соответствующими вашим потребностям для оператора update.

CREATE TABLE bh_table1 
 ..field defs
) ENGINE = BLACKHOLE;

Теперь создайте триггер на столе черной дыры.

DELIMITER $$

CREATE TRIGGER ai_bh_table1_each AFTER INSERT ON bh_table1 FOR EACH ROW
BEGIN
  //implicit start transaction happens here.
  UPDATE table1 t1 SET t1.field1 = NEW.field1 WHERE t1.id = NEW.id; 
  //implicit commit happens here.
END $$ 

DELIMITER ;

Вы можете сделать оператор обновления как вставку в черную дыру.

INSERT INTO bh_table1 (id, field1) 
  SELECT id, field1 
  FROM same_table_with_lots_of_rows
  WHERE filter_that_still_leaves_lots_of_rows;

Это все равно будет намного медленнее, чем ваше первоначальное обновление.
Позвольте мне знать, как это получается.

...