GTID模式下的replication,跳过错误日志的解决方法


日志错误:

大多数replication错误都是因为日志错误引起的。

主日志和中继日志都可能出错。

评判日志错误的辨别方法:

mysqlbinlog  master_binlog_file > /dev/null   屏幕有输出则表示这个binlog有错误,如果没有则表示binlog正常、

mysqlbinlog  slave_binlog_file  >/dev/null



跳过日志错误1:

可以使用手动跳过日志错误,可能会造成数据不一致

如果主日志出错,可以再slave上执行(如果有多个错误可能需要多次操作)

mysql>stop slave;

mysql>set global sql_slave_skip_counter=1;

mysql>start slave;


这个方法不适用于DTID模式的replication,GTIDs模式不允许sql_slave_skip_counter


跳过错误日志2:  不支持GTID

如果是中举日志出错,可以再slave上查看replication状态,根据日志信息跳过出错的日志:


mysql>stop slave;

mysql>change master to 

master_log_file='relay_master_log_file';

master_log_pos=<exec_master_log_pos>;

mysql>start slave;


跳过错误日志3 : GDIT的好处是,计算机自行处理,无需像以前的那样繁琐。

如果master上的binlog除了问题,导致slave无法继续,

如果replication工作在GTID模式下,则需要以下操作:

mysql>stop slave;

mysql>set GTID_NEXT='uuid.next_id';  

mysql>begin;

mysql>commit;

mysql>set GTID_NEXT='AUTOCOMMIT';

mysql>start slave;

uuid:nextid 例如:8a1f84c4-9d67-11e4-8a9a-3085a9eb338b:12


into


模拟故障:基于DTID模式

in master:

mysql>use viewdb

 

mysql> select * from t1;

+------+

| id   |

+------+

|  112 |

|  113 |

|  114 |

|  115 |

|  116 |

|  117 |

|  118 |

|  119 |

|  120 |

| 1000 |

|  110 |

|  109 |

mysql>show vaiiables like "%bin%" 找到 sql_bin_log 

sql_log_bin                             | ON       全局参数,当前所发生的操作会记录到二进制日中、


mysql> set sql_log_bin=OFF; 表示不记录当前的操作到二进制日志中。接下来的操作会不会同步到slave,这样就会错误

mysql> insert into t1 values (200);

Query OK, 1 row affected (0.00 sec)


mysql> select * from t1;

+------+

| id   |

+------+

| |

|  200 |

+------+

13 rows in set (0.00 sec

    

mysql> set sql_log_bin=ON; 再次打开,

Query OK, 0 rows affected (0.00 sec)


mysql> insert into t1 values (201); 这是201会被同步到salve,200确不会同步到slave

Query OK, 1 row affected (0.03 sec)

in   master


mysql> select * from t1;

+------+

| id   |

+------+

|  |

   200 

|  201 |


in SLAVE


mysql> select * from t1;

+------+

| id   |

+------+

|  |

|  201 |


 切回到master

mysql>delect from t1 where id=200;  此步骤完了后,此操作记录到binlog,而且会同步到slave,此时slave报错,并指出master的那


个binlog  end_log_pos出错。

 

IN slave;

mysql>show salve status\G;

Last_SQL_Error: Could not execute Delete_rows event on table viewdb.t1; Can't find record in 't1', Error_code: 1032; 


handler error HA_ERR_END_OF_FILE; the event's master log localhost-bin.000006, end_log_pos 1360

并且:

 Retrieved_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-18

 Executed_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-17

不一致


切回到master

mysql>insert into t1 valuses(202); 

in slave

这时由于slave故障,所以slave不再会有任何新的数据同步过来。

Retrieved_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-19

Executed_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-17

这是我们跳过这个error,


mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)


mysql> set gtid_next='61816754-9d68-11e4-8a9f-000c29c1d1ea:18';

mysql> begin;

mysql> commit;

mysql> set gtid_next='automatic';

mysql> start slave;

mysql>show slave status\G;

mysql>select * from t1;  发现数据已经保持一致。   

gtid的好处是,如果有两台slave,只修复一台slave。另一台会自动更新到正常状态。


你可能感兴趣的:(binlog,master,slave,GTID)