MySQL - 使查询复制更友好

时间:2012-03-30 15:25:08

标签: mysql performance stored-procedures replication

我有一张包含1500万行的表格。在那天的某个时刻,我运行一个查询,删除大约200万行。运行大约需要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 :(得分:0)

我用于此类查询的一种策略是将它们保留在二进制日志之外,并在复制主服务器和复制从服务器上单独运行它们。这样他们就不会阻止复制,假设删除不会导致任何阻止其他语句的锁。

为了做到这一点,您需要以具有SUPER权限的用户身份运行命令,并且您需要小心确保删除主服务器和从服务器上的完全相同的数据以避免不一致但它可能是一种非常有用的技术。

关键是使用SQL_LOG_BIN设置禁用运行删除的会话的二进制日志记录。

例如:

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

或者,如果您使用的是存储过程,仍然可以以相同的方式禁用二进制日志记录:

SET SQL_LOG_BIN = 0;
CALL your_delete_proc();