mysql复制跳过语句。可能吗?

时间:2013-07-17 13:47:08

标签: mysql replication

有一个基于ROW复制的系统。 昨天我意外地对我的主人发表了沉重的声明,发现我的奴隶远远落后于主人。我已经中断了master上的查询,但它仍然在slave上运行。 所以我让我的奴隶落后主人15个小时。

我已经尝试通过重置slave并增加MASTER_LOG_POS来跳过一个位置,但没有运气:找不到位置,因为中继日志不比重度查询事件读得更远。

Read_Master_Log_Pos == Exec_Master_Log_Pos
  • 有没有办法跳过沉重的查询? (我不关心必须通过查询更改的数据)
  • 有没有办法杀死从中继日志中获取的从站的查询?
  • 有没有办法将奴隶卷回1个位置,取出 来自主bin-log的事件并恢复复制?

5 个答案:

答案 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

参考:http://dev.mysql.com/doc/refman/5.0/en/start-slave.html