Mysql5.7GTID主从错误解决方案

mysql5.7之后的GTID复制模式一旦数据同步出错和之前的解决方案略有差异,这里就详细的记录一下。

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 172.31.7.252
                  Master_User: repl
                  Master_Port: 20101
                Connect_Retry: 60
              Master_Log_File: mysqlbin.000003
          Read_Master_Log_Pos: 2502950
               Relay_Log_File: fe43c62cc3e0-relay-bin.000003
                Relay_Log_Pos: 2482454
        Relay_Master_Log_File: mysqlbin.000003
             Slave_IO_Running: No
            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: 1051
                   Last_Error: Error 'Unknown table 'test.test_table'' on query. Default database: 'test'. Query: 'DROP TABLE `test_table` /* generated by server */'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2482243
              Relay_Log_Space: 5543513
              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: 1051
               Last_SQL_Error: Error 'Unknown table 'test.test_table'' on query. Default database: 'test'. Query: 'DROP TABLE `test_table` /* generated by server */'
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: 14268a44-4eab-11e8-95fb-0242ac120002
             Master_Info_File: /var/lib/mysql/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: 181102 08:08:52
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 14268a44-4eab-11e8-95fb-0242ac120002:1-5338
            Executed_Gtid_Set: 14268a44-4eab-11e8-95fb-0242ac120002:1-5290:5292
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

上面是从库出错的状态,首先就是要拿【Exec_Master_Log_Pos】中的pos去主服务器中通过showlogs方式查询出错的语句分析原因。

mysql> show binary logs;
+-----------------+-----------+
| Log_name        | File_size |
+-----------------+-----------+
| mysqlbin.000001 |       177 |
| mysqlbin.000002 |   3039593 |
| mysqlbin.000003 |   2510198 |
+-----------------+-----------+
3 rows in set (0.00 sec)

mysql> show binlog events in 'mysqlbin.000003'  from 2482243 limit 10;
+-----------------+---------+------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name        | Pos     | Event_type | Server_id | End_log_pos | Info                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+-----------------+---------+------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysqlbin.000003 | 2482243 | Gtid       |         1 |     2482308 | SET @@SESSION.GTID_NEXT= '14268a44-4eab-11e8-95fb-0242ac120002:5291'                                                                                                                                                                                                                                                                                                                                                                  |
| mysqlbin.000003 | 2482308 | Query      |         1 |     2482430 | use `test`; DROP TABLE `test_table` /* generated by server */                                                                                                                                                                                                                                                                                                                                                                         |
| mysqlbin.000003 | 2482430 | Gtid       |         1 |     2482495 | SET @@SESSION.GTID_NEXT= '14268a44-4eab-11e8-95fb-0242ac120002:5292'                                                                                                                                                                                                                                                                                                                                                                  |
| mysqlbin.000003 | 2482495 | Query      |         1 |     2482979 | use `test`; CREATE TABLE `test_table` (`id` int AUTO_INCREMENT,`group_id` bigint,`user_id` bigint,`card` varchar(255),`nickname` varchar(255),`sex` varchar(255),`area` varchar(255),`level` varchar(255),`role` varchar(255),`age` int,`join_time` int,`last_sent_time` int,`unfriendly` boolean,`card_changeable` boolean,`created_at` timestamp NULL,`updated_at` timestamp NULL,`deleted_at` timestamp NULL , PRIMARY KEY (`id`)) |
| mysqlbin.000003 | 2482979 | Gtid       |         1 |     2483044 | SET @@SESSION.GTID_NEXT= '14268a44-4eab-11e8-95fb-0242ac120002:5293'                                                                                                                                                                                                                                                                                                                                                                  |
| mysqlbin.000003 | 2483044 | Query      |         1 |     2483168 | use `test`; CREATE INDEX idx ON `test_table`(group_id, user_id)                                                                                                                                                                                                                                                                                                                                                                       |
| mysqlbin.000003 | 2483168 | Gtid       |         1 |     2483233 | SET @@SESSION.GTID_NEXT= '14268a44-4eab-11e8-95fb-0242ac120002:5294'                                                                                                                                                                                                                                                                                                                                                                  |
| mysqlbin.000003 | 2483233 | Query      |         1 |     2483312 | BEGIN                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| mysqlbin.000003 | 2483312 | Table_map  |         1 |     2483391 | table_id: 149 (test.group_messages)                                                                                                                                                                                                                                                                                                                                                                                                    |
| mysqlbin.000003 | 2483391 | Write_rows |         1 |     2483612 | table_id: 149 flags: STMT_END_F                                                                                                                                                                                                                                                                                                                                                                                                       |
+-----------------+---------+------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)

mysql>

从上面可以看到是在14268a44-4eab-11e8-95fb-0242ac120002:5291中出现的错误,然后就得到了下一行的全局同步点【14268a44-4eab-11e8-95fb-0242ac120002:5292】。
拿到上面的同步点接下来的工作就是去slave进行跳过了。

mysql>stop slave;
mysql>set GTID_NEXT='14268a44-4eab-11e8-95fb-0242ac120002:5292';  
mysql>begin;
mysql>commit;
mysql>set GTID_NEXT='AUTOCOMMIT';
mysql>start slave;

依次执行上面命令就可以了。
不要通过slave status中的[Retrieved_Gtid_Set]字段自己自增猜测下一个同步时间点。两个pos略有不同,直接使用会报错。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code