最近,我注意到主从复制中从服务器错误日志中出现以下错误.即使复制没有问题,从服务器也可以按主服务器按时运行.实际上,我在从属服务器上执行了一些繁重的报表查询,并将其结果插入到temp / dummy(不是临时表)表中.我需要社区帮助来清除以下2个查询.如果有人帮助我,我将非常感激.
[ERROR] Slave SQL: Could not execute Update_rows event on table DBname.tablename; Lock wait timeout exceeded; try restarting transaction,
Error_code: 1205; handler error HA_ERR_LOCK_WAIT_TIMEOUT; the event's master log mysql-bin.******, end_log_pos *******, Error_code: 1205
>根据我的理解,当我获取报告(从生产表获取并插入到虚拟表中)时,会发生此错误,因为mysql无法获得锁定,并且由于锁可用于mysql,因此更新语句将成功执行,这意味着我的数据将最新的奴隶.
>我们知道select语句不会锁定该表,因此之所以会发生是因为我同时将数据插入到另一个表中以及从生产表中获取数据.
提前致谢.
解决方法:
只要在查询上运行,在从属服务器上运行查询都会在基础表上设置隐式锁.在此期间,必须暂停来自主服务器的并发查询.由于查询持续的时间可能超过(或接近)innodb_lock_wait_timeout
,因此复制超时.
发生这种情况时,您需要做的就是使用简单的START SLAVE;重新启动复制.
为完全避免该问题,您可以在运行报告查询之前显式暂停复制(STOP SLAVE
),然后在完成后恢复复制.
解决方法是,您也可以增加slave_transaction_retries
.