有一个基于ROW复制的系统。 昨天我意外地对我的主人发表了沉重的声明,发现我的奴隶远远落后于主人。我已经中断了master上的查询,但它仍然在slave上运行。 所以我让我的奴隶落后主人15个小时。
我已经尝试通过重置slave并增加MASTER_LOG_POS来跳过一个位置,但没有运气:找不到位置,因为中继日志不比重度查询事件读得更远。
Read_Master_Log_Pos == Exec_Master_Log_Pos
答案 0 :(得分:31)
在奴隶上尝试以下操作:
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
这将停止从属线程并从主站跳过下一个事件。通常在语句出现问题时使用它来跳过它们。
另请阅读以下部分mysql文档:set-global-sql-slave-skip-counter
答案 1 :(得分:8)
首先在master上查看二进制日志,找到导致问题的SQL语句,在master上使用以下命令:
SHOW BINLOG EVENTS IN 'mysql-bin.000XXX' LIMIT 100;
然后将slave设置为仅同步到之前的语句:
STOP SLAVE;
START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos;
如果希望它在错误语句之后继续复制(警告,如果语句更改了数据,这可能会很危险),您可以告诉从服务器从主服务器日志中的特定点继续。为此,使用主设备上的第一个命令获取位置,然后将从设备设置为:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000663', MASTER_LOG_POS=4;
START SLAVE;
答案 2 :(得分:1)
对于Amazon RDS MySQL上的用户,您可以使用以下命令一次跳过一个错误:
CALL mysql.rds_skip_repl_error;
在运行之前无需停止复制。
答案 3 :(得分:1)
我发现第一个开始io_thread
start slave io_thread;
并使用命令
检查中继日志SHOW RELAYLOG EVENTS IN 'mysql-bin.000XXX' LIMIT 100;
这为我节省了很多时间。
答案 4 :(得分:0)
您可以设置跳过计数器,如下所示:
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