有一个基于行的复制系统。昨天我不小心在master上执行了一个heavy语句,发现我的slave远远落后于master。我已经中断了master上的查询,但它仍然在slave上运行。所以我得到的slave比master晚了15个小时。
我已经尝试过通过重置slave和增加MASTER_SEARCH_POS来跳过一个位置,但是没有运气:没有找到位置,因为中继日志没有读到比一个重查询事件更远的地方。
Read_Master_Log_Pos == Exec_Master_Log_Pos
字符串
- 有什么方法可以跳过繁重的查询吗?(我不关心必须通过查询更改的数据)
- 有没有一种方法可以杀死从中继日志中获取的从服务器上的查询?
- 是否有办法将从机回滚到1位置,从主机bin日志中删除事件并恢复复制?
6条答案
按热度按时间5ktev3wc1#
在slave上尝试以下操作:
字符串
这将停止从线程并跳过主线程的下一个事件。当你遇到跳过它们的语句问题时,你通常会使用它。
也可以阅读mysql文档的以下部分:set-global-sql-slave-skip-counter
pcrecxhr2#
首先在master上使用以下命令浏览二进制日志,以找到导致问题的SQL语句:
字符串
然后将从服务器设置为只同步到之前的语句,然后在您想要跳过的语句之后恢复。
在这个例子中,我们将跳过日志位置100的事件。我们将salve设置为同步,直到日志位置99,然后从101恢复:
型
根据需要更改主日志文件(mysql-bin. 000 XXX)和位置。
警告:跳过从服务器上的SQL语句将导致主服务器和从服务器之间的数据不同,从而导致数据完整性问题。只有在您完全了解所跳过的SQL查询的作用以及恢复复制可能产生的任何后果的情况下,才能执行此操作。
2o7dmzc53#
对于那些使用Amazon RDS MySQL的用户,您可以使用以下命令在从属服务器上一次跳过一个错误:
字符串
在运行此之前无需停止复制。
yshpjwxd4#
我发现首先启动io_thread
字符串
并使用以下命令检查中继日志
型
这为我节省了很多时间。
u5i3ibmn5#
您可以按以下方式设置跳过计数器:
字符串
要查看进程列表:
型
从特定位置启动从站:
型
参考号:http://dev.mysql.com/doc/refman/5.0/en/start-slave.html
kzipqqlq6#
如果您启用了
GTID_MODE
,则会出现此错误:错误1858(HY 000):当服务器在@@GLOBAL.GTID_MODE = ON的情况下运行时,无法设置sql_slave_skip_counter。相反,对于要跳过的每个事务,请使用与该事务相同的GTID生成一个空事务
您可以使用this method生成空交易。
1.查找故障GTID:
字符串
Last_SQL_Error:协调器已停止,因为工作进程中存在错误。最近的失败是:工作进程4无法在主日志mysql-bin.000033,end_log_pos 11323712处执行事务“47 f34807 - 98 ef-11 ee-ac 0 c-d 00 d1 ad 56 dd 7:409671”。有关此失败或其他失败(如果有)的详细信息,请参阅错误日志和/或performance_schema.replication_applier_status_by_worker表。
1.停止从机并更换故障GTID:
型
1.设置回GTID_NEXT并启动从机
型