MySQL - дружественная репликация запросов - PullRequest
0 голосов
/ 30 марта 2012

У меня есть таблица с 15 миллионами строк. В какой-то момент дня я запускаю запрос, который удаляет около 2 миллионов из этих строк. Запуск занял около 30 минут, что, согласно администратору mysql, замедляло репликацию для всего экземпляра.

Я думал, что смогу преобразовать ее в хранимую процедуру, которая фиксирует каждую 1000 строк, но кажется, что репликация все еще застревает, пока вся моя хранимая процедура не завершится. Было бы возможно сделать за пределами MySQL, но я действительно хотел бы попытаться сделать это внутри MySQL. Это то, что у меня есть .... Есть ли способ сделать это более дружественным для репликации.

BEGIN
   DECLARE rowcount INT;
   REPEAT   
      DELETE FROM tbl_sales_records WHERE salesFileNo = PassedInValue LIMIT 1000;
      SELECT ROW_COUNT() INTO rowcount;
      COMMIT;
   UNTIL rowcount=0
   END REPEAT;
END$$

1 Ответ

0 голосов
/ 30 марта 2012

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

Для этого вам нужно запускать команды как пользователь с привилегией SUPER, и вам нужнобудьте осторожны, чтобы убедиться, что вы удаляете одни и те же данные на главном и подчиненном устройствах, чтобы избежать несоответствия, но это может быть очень полезным методом.

Ключом является использование * 1006.* настройка для отключения двоичного ведения журнала для сеанса, в котором вы запускаете удаление.

Например:

SET SQL_LOG_BIN = 0;
DELETE FROM tbl_sales_records WHERE salesFileNo = PassedInValue;

Или, если вы используете хранимую процедуру, вы все равно можете отключить двоичный файлведение журнала таким же образом:

SET SQL_LOG_BIN = 0;
CALL your_delete_proc();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...