当前位置:嗨网首页>书籍在线阅读

18-从库复制出错的处理

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

mysql> select * from repl_test;

上文提到过,在某些情况下,会出现从库更新失败,这时,首先需要确定是否是从库的表与主库的不同造成的。如果是表结构不同导致的,则修改从库的表使之与主库的相同,然后重新运行START SLAVE语句。

如果不是表结构不同导致的更新失败,则需要确认手动更新是否安全,然后忽视来自主库的更新失败的语句。跳过来自主库的语句的命令为 SET GLOBAL SQLSLAVE SKIP_COUNTER = n,其中 n的取值为 1或者 2。如果来自主库的更新语句不使用 AUTO_INCREMENT 或 LAST_INSERT_ID(),n 值应为 1,否则,值应为 2。原因是使用 AUTO_INCREMENT或LAST_INSERT_ID()的语句需要从二进制日志中取两个事件。以下例子就是在从库端模拟跳过主库的两个更新语句的效果。

(1)首先,在从库端先停止复制进程,并设置跳过两个语句:

mysql> select * from repl_test;

+------+

| id |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL SQL_slave_SKIP_COUNTER = 2;

Query OK, 0 rows affected (0.01 sec)

(2)在主库端插入3条记录:

mysql> select * from repl_test;

+------+

| id |

+------+

| 1|

+------+

1 row in set (0.00 sec)

mysql> insert into repl_test values(2);

Query OK, 1 row affected (0.00 sec)

mysql> insert into repl_test values(3);

Query OK, 1 row affected (0.00 sec)

mysql> insert into repl_test values(4);

Query OK, 1 row affected (0.00 sec)

mysql> select * from repl_test;

+------+

| id |

+------+

| 1|

| 2|

| 3|

| 4|

+------+

4 rows in set (0.00 sec)

(3)从库端启动复制进程,检查测试的表,发现首先插入的两条记录被跳过了,只执行了第3条插入语句:

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

+------+

| id |

+------+

| 1 |

| 4 |

+------+

2 rows in set (0.00 sec)