12

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

我已经尝试通过重置从站和增加 MASTER_LOG_POS 来跨过一个位置,但没有运气:找不到位置,因为中继日志没有被读取比重查询事件更远。

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

5 回答 5

39

在从站上尝试以下操作:

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

这将停止从属线程并跳过来自主控的下一个事件。当您遇到要跳过它们的语句时,通常会使用此方法。

另请阅读 mysql 文档的以下部分:set-global-sql-slave-skip-counter

于 2013-07-17T14:10:38.717 回答
12

首先在 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;
于 2014-07-08T22:07:29.317 回答
3

对于 Amazon RDS MySQL 上的用户,您可以在从属服务器上一次跳过一个错误:

CALL mysql.rds_skip_repl_error;

在运行此之前无需停止复制。

于 2016-03-18T18:38:42.730 回答
1

我首先找到了启动 io_thread

start slave io_thread;

并使用命令检查中继日志

SHOW RELAYLOG EVENTS IN 'mysql-bin.000XXX' LIMIT 100;

这为我节省了很多时间。

于 2017-02-08T18:00:18.290 回答
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

于 2013-07-17T14:08:31.510 回答