今天在做基于GTID模式的主从复制时,发现一个跳过主从复制的错误日志的方法,希望发表出来对大家能有帮助。
首先在master端配置了复制账号copy并只给了REPLICATION权限。当前状态是主从复制正常。当我在master端删除''@'$hostname',''@'localhost'这样的匿名账号时从端开始复制模式开始报错。
分析应该是copy权限不够,REPLICATION权限应该不能删除mysql库中用户。所以从端会出错。错误信息如下:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.101.200.210
Master_User: copy
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: 210-log-bin.000003
Read_Master_Log_Pos: 2796
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 414
Relay_Master_Log_File: 210-log-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1396
Last_Error: Worker 1 failed executing transaction '' at master log 210-log-bin.000003, end_log_pos 694; Error 'Operation DROP USER failed for ''@'shangjia1.test.com'' on query. Default database: 'mysql'. Query: 'drop user ""@'shangjia1.test.com''
Skip_Counter: 0
Exec_Master_Log_Pos: 537
Relay_Log_Space: 3891
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1396
Last_SQL_Error: Worker 1 failed executing transaction '' at master log 210-log-bin.000003, end_log_pos 694; Error 'Operation DROP USER failed for ''@'shangjia1.test.com'' on query. Default database: 'mysql'. Query: 'drop user ""@'shangjia1.test.com''
Replicate_Ignore_Server_Ids:
Master_Server_Id: 200210
Master_UUID: 4540fbfd-b055-11e5-8b5d-0050568b7072
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 160101 15:37:10
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 4540fbfd-b055-11e5-8b5d-0050568b7072:3-12
Executed_Gtid_Set: 4540fbfd-b055-11e5-8b5d-0050568b7072:1-2:12,
4e555522-b055-11e5-8b5d-0050568b4f5b:1-2
Auto_Position: 1
1 row in set (0.01 sec)
所以我在主端先给了copy用户所有权限,所有权限包括了REPLICATION CLIENT(客户端)、REPLICATION SLAVE(服务端)、SUPER(管理)和RELOAD四个权限。具体权限问题请参阅这位网友的介绍
http://gfsunny.blog.51cto.com/990565/1554627
给了权限后重启slave后还是会报上面1396错误。
此时我就比较郁闷了。后来就想是否可以跳过这个错误呢?
mysql主从复制时跳过指定的错误请认真阅读这位网友的文章
http://blog.csdn.net/wulantian/article/details/38369259
具体操作是,在日志中找到错误代码然后指定跳过的错误代码即可。
我的错误代码是1396.
2016-01-01 15:25:55 28177 [Note] Slave SQL thread initialized, starting replication in log '210-log-bin.000003' at position 537, relay
log '/data/mysql/relay-log/slave-relay-bin.000002' position: 414
2016-01-01 15:25:55 28177 [ERROR] Slave SQL: Worker 1 failed executing transaction '' at master log 210-log-bin.000003, end_log_pos 69
4; Error 'Operation DROP USER failed for ''@'shangjia1.test.com'' on query. Default database: 'mysql'. Query: 'drop user ""@'shangjia1
.test.com'', Error_code: 1396
2016-01-01 15:25:55 28177 [Warning] Slave SQL: ... The slave coordinator and worker threads are stopped, possibly leaving data in inco
nsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables o
r DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: 1756
2016-01-01 15:35:41 28177 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
2016-01-01 15:35:41 28177 [Note] Slave I/O thread killed while reading event
2016-01-01 15:35:41 28177 [Note] Slave I/O thread exiting, read up to log '210-log-bin.000003', position 2796
2016-01-01 15:37:10 28177 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is
therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Synta
x' in the MySQL Manual for more information.
2016-01-01 15:37:10 28177 [Note] Slave I/O thread: connected to master '[email protected]:3306',replication started in log '210-log-
bin.000003' at position 2796
2016-01-01 15:37:10 28177 [Note] Slave SQL thread initialized, starting replication in log '210-log-bin.000003' at position 537, relay
log '/data/mysql/relay-log/slave-relay-bin.000002' position: 414
2016-01-01 15:37:10 28177 [ERROR] Slave SQL: Worker 1 failed executing transaction '' at master log 210-log-bin.000003, end_log_pos 69
4; Error 'Operation DROP USER failed for ''@'shangjia1.test.com'' on query. Default database: 'mysql'. Query: 'drop user ""@'shangjia1
.test.com'', Error_code: 1396
2016-01-01 15:37:10 28177 [Warning] Slave SQL: ... The slave coordinator and worker threads are stopped, possibly leaving data in inco
nsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables o
r DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: 1756
所以在/etc/my.cnf中定义如下
slave-skip-errors = 1396 至于为什么跳过指定的错误代码,请查阅http://blog.csdn.net/wulantian/article/details/38369259的文章。
然后重启mysql服务即可。
如果有错误的地方请各位网友指正。谢谢!