@cdmonkey
2014-11-24T18:13:24.000000Z
字数 1467
阅读 1845
数据库
主从同步
我们模拟下一事故现场。首先,在从库上创建一个数据库:
mysql> create database butongbu;
mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes #从库目前仍旧处于同步状态,没有任何问题。
接下来,我们在主库上创建同样的库:
mysql> create database butongbu;
然后查看从库的同步状态信息,会发现报错:
mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: NO
Last_Errno: 1007
Last_Error: Error 'Can't create database 'butongbu'; database exists' on query. Default database: butongbu'. Query: 'create database butongbu'
...
Seconds_Behind_Master: NULL
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1007
Last_SQL_Error: Error 'Can't create database 'butongbu'; database exists' on query. Default database: butongbu'. Query: 'create database butongbu'
#这种情况就是IO线程还能够收到Binlog日志,而SQL线程却无法再执行下去。那么此时如果读取从库上的数据,很可能得到的是旧的或是不存在的数据。
错误:1007 SQLSTATE: HY000 (ER_DB_CREATE_EXISTS)
消息:无法创建数据库,数据库已存在。
方法一:调节同步指针
mysql> stop slave; #停止主从同步。
mysql> set global sql_slave_skip_counter =1; #让指针向下走一步,即跳过当前的错误。
mysql> start slave; #重新开启同步。
mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes #主从同步恢复正常。
- 对于普通的互联网业务,忽略问题不是很大,当然,要确认在不影响公司业务的前提下进行;
- 企业场景中,解决当前主从同步的故障,比保持主从一致更为重要,然后如果出于主从一致性的需要,再另行对该从库进行必要的恢复;
- 保持主从数据一致更重要还是保持正常的主从同步状态更重要,需要视具体的业务来决定。
方法二:根据错误码跳过指定的错误
在主从复制中,难免会遇到一些SQL语句错误的问题,我们可以在从库的配置文件中进行相应配以,对某些可以忽略的错误进行忽略。
[root@MySQL-E ~]# vim /etc/my.cnf
[mysqld]
slave-skip-errors = 1032, 1062, 1007 #该配置参数可以指定需要忽略的错误码。
错误:1032 SQLSTATE: HY000 (ER_KEY_NOT_FOUND)
消息:无法找到记录,记录不存在。造成1032错误的根本原因是主从数据库数据不一致,导致同步操作在从库上无法执行。
错误:1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
消息:字段值重复,入库失败。1062的错误是指一些主键重复的错误。