有一个基于 ROW 的复制系统。 昨天我不小心对我的主人执行了一份重磅声明,发现我的奴隶们远远落后于主人。我已经中断了master上的查询,但它仍在slave上运行。 所以我让我的奴隶比主人晚了15个小时。
我已经尝试通过重置从站并增加 MASTER_LOG_POS 来跨过一个位置,但没有运气:找不到位置,因为中继日志没有比大量查询事件进一步读取。
Read_Master_Log_Pos == Exec_Master_Log_Pos
在从站上尝试以下操作:
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
这将停止从线程并跳过主线程的下一个事件。当您遇到语句问题时通常会使用它来跳过它们。
另请阅读 mysql 文档的以下部分:set-global-sql-slave-skip-counter
首先在主服务器上使用以下命令探索主服务器上的二进制日志以查找导致问题的 SQL 语句:
SHOW BINLOG EVENTS IN 'mysql-bin.000XXX' LIMIT 200;
然后将从站设置为仅同步到之前的语句,然后在要跳过的语句之后恢复。
在此示例中,我们将跳过日志位置 100 中的事件。我们将从站设置为同步,直到日志位置 99,然后从 101 恢复:
STOP SLAVE;
START SLAVE UNTIL MASTER_LOG_FILE='mysql-bin.000XXX', MASTER_LOG_POS=99;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000XXX', MASTER_LOG_POS=101;
START SLAVE;
根据需要更改主日志文件(mysql-bin.000XXX)和位置。
警告:在从机上跳过SQL语句会导致主从之间的数据不同,从而导致数据完整性问题。仅当您完全了解要跳过的 SQL 查询的作用以及恢复复制可能产生的后果时,才可以执行此操作。
对于 Amazon RDS MySQL 上的用户,您可以使用以下命令在从站上一次跳过一个错误:
CALL mysql.rds_skip_repl_error;
运行此命令之前无需停止复制。
我发现首先启动了io_thread
start slave io_thread;
并使用命令检查中继日志
SHOW RELAYLOG EVENTS IN 'mysql-bin.000XXX' LIMIT 100;
这节省了我很多时间。
您可以按如下方式设置跳过计数器:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
查看进程列表:
mysql> show [full] processlist;
kill "number from first col";
从特定位置启动从机:
START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos