[关闭]
@cdmonkey 2014-11-24T10:13:24.000000Z 字数 1467 阅读 1752

MySQL主从同步-故障解决

数据库 主从同步


一、从库数据冲突导致同步停止

1、出现错误

我们模拟下一事故现场。首先,在从库上创建一个数据库:

  1. mysql> create database butongbu;
  2. mysql> show slave status\G
  3. ...
  4. Slave_IO_Running: Yes
  5. Slave_SQL_Running: Yes #从库目前仍旧处于同步状态,没有任何问题。

接下来,我们在主库上创建同样的库:

  1. mysql> create database butongbu;

然后查看从库的同步状态信息,会发现报错:

  1. mysql> show slave status\G
  2. ...
  3. Slave_IO_Running: Yes
  4. Slave_SQL_Running: NO
  5. Last_Errno: 1007
  6. Last_Error: Error 'Can't create database 'butongbu'; database exists' on query. Default database: butongbu'. Query: 'create database butongbu'
  7. ...
  8. Seconds_Behind_Master: NULL
  9. Last_IO_Errno: 0
  10. Last_IO_Error:
  11. Last_SQL_Errno: 1007
  12. Last_SQL_Error: Error 'Can't create database 'butongbu'; database exists' on query. Default database: butongbu'. Query: 'create database butongbu'
  13. #这种情况就是IO线程还能够收到Binlog日志,而SQL线程却无法再执行下去。那么此时如果读取从库上的数据,很可能得到的是旧的或是不存在的数据。
错误:1007 SQLSTATE: HY000 (ER_DB_CREATE_EXISTS)
消息:无法创建数据库,数据库已存在。

2、解决方法

方法一:调节同步指针

  1. mysql> stop slave; #停止主从同步。
  2. mysql> set global sql_slave_skip_counter =1; #让指针向下走一步,即跳过当前的错误。
  3. mysql> start slave; #重新开启同步。
  4. mysql> show slave status\G
  5. ...
  6. Slave_IO_Running: Yes
  7. Slave_SQL_Running: Yes #主从同步恢复正常。
  • 对于普通的互联网业务,忽略问题不是很大,当然,要确认在不影响公司业务的前提下进行;
  • 企业场景中,解决当前主从同步的故障,比保持主从一致更为重要,然后如果出于主从一致性的需要,再另行对该从库进行必要的恢复;
  • 保持主从数据一致更重要还是保持正常的主从同步状态更重要,需要视具体的业务来决定。

方法二:根据错误码跳过指定的错误
在主从复制中,难免会遇到一些SQL语句错误的问题,我们可以在从库的配置文件中进行相应配以,对某些可以忽略的错误进行忽略。

  1. [root@MySQL-E ~]# vim /etc/my.cnf
  2. [mysqld]
  3. slave-skip-errors = 1032, 1062, 1007 #该配置参数可以指定需要忽略的错误码。
错误:1032 SQLSTATE: HY000 (ER_KEY_NOT_FOUND)
消息:无法找到记录,记录不存在。造成1032错误的根本原因是主从数据库数据不一致,导致同步操作在从库上无法执行。

错误:1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
消息:字段值重复,入库失败。1062的错误是指一些主键重复的错误。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注