在MySQL中,有两种跳过复制错误的方法:
1、对于未使用GTID的复制,可以使用sql_slave_skip_counter来跳过错误
2、对于使用GTID的复制,可以使用GTID_NEXT模拟空事务来跳过错误
================================================
使用sql_slave_skip_counter跳过错误
对于set global sql_slave_skip_counter=N
1>N代表N个event
2>当N=1时,代表跳过下一个事务,无论下一个事务包含多少event
3>当N>1时,代表启动复制后,从当前位置跳过N个event,每跳过一个event,进行N--操作,如果最终跳到一个事务中,则跳过该事务进行复制。
在binlog中上命令以event的形式存在,但由于存储引擎和binlog日志格式的不同,一条命令可能被解析成一个或N个event。
如对于Innodb存储引擎+STATEMENT日志格式,由于支持事务,会有begin和commit事件。
而对于MyISAM存储引擎+STATEMENT日志格式,由于不考虑事务,则不会有begin和commit事件。
## 停止slave进程 STOP SLAVE; ## 跳过N个复制事件 set global sql_slave_skip_counter=N ## 启动slave进程 START SLAVE; ## 查看复制进度 SHOW SLAVE STATUS \G
================================================
使用GTID_NEXT模拟空事务跳过错误
对于使用GTID复制,当在从库上执行主库传递过来的BINLOG时,会先判断根据GTID该事务是否已在从库上执行过。
可以通过在从库上模拟生成空事务,来跳过主库传递来的事务,从而跳过错误。
## 停止slave进程 STOP SLAVE; ## 使用空事务跳过指定GTID SET GTID_NEXT= ‘e0a86c29-f20d-11e8-93c2-04b0e7954a65:104934‘; BEGIN; COMMIT; ## 设置GTID自动增长 SET SESSION GTID_NEXT = AUTOMATIC; ## 启动slave进程 START SLAVE; ## 查看复制进度 SHOW SLAVE STATUS \G
如果需要跳过一批GTID,可以使用下面脚本来生成脚本:
import os script_file = "./skip_file.sql" def write_script(script_content): file_handle = open(script_file, ‘a+‘) file_handle.writelines(script_content + "\n") file_handle.close() def delete_script_file(): if os.path.exists(script_file): os.remove(script_file) def get_skip_script_list(master_uuid, start_tran_id, end_tran_id): script_list = [] current_tran_id = start_tran_id while current_tran_id <= end_tran_id: current_script = """ SET @@SESSION.GTID_NEXT= ‘{master_uuid}:{tran_id}‘; BEGIN; COMMIT; """.format( master_uuid=master_uuid, tran_id=current_tran_id ) current_tran_id = current_tran_id + 1 script_list.append(current_script) script_list.append("SET SESSION GTID_NEXT = AUTOMATIC;") return script_list def main(): master_uuid = "e0a86c29-f20d-11e8-93c2-04b0e7954a65" start_tran_id = 104935 end_tran_id = 105007 script_list = get_skip_script_list(master_uuid, start_tran_id, end_tran_id) write_script("\n".join(script_list)) if __name__ == ‘__main__‘: main()
生成结果如下:
SET @@SESSION.GTID_NEXT= ‘e0a86c29-f20d-11e8-93c2-04b0e7954a65:104935‘; BEGIN; COMMIT; ... SET @@SESSION.GTID_NEXT= ‘e0a86c29-f20d-11e8-93c2-04b0e7954a65:105007‘; BEGIN; COMMIT; SET SESSION GTID_NEXT = AUTOMATIC;
PS: 跳过事务后一定要执行命令“SET SESSION GTID_NEXT = AUTOMATIC”
原文地址:https://www.cnblogs.com/gaogao67/p/10494487.html