码迷,mamicode.com
首页 > 数据库 > 详细

MySQL跳过复制错误

时间:2019-03-08 11:09:21      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:两种   ==   state   show   start   delete   while   --   ESS   

在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”

 

MySQL跳过复制错误

标签:两种   ==   state   show   start   delete   while   --   ESS   

原文地址:https://www.cnblogs.com/gaogao67/p/10494487.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!