zoukankan      html  css  js  c++  java
  • MySQL Replication--跳过复制错误

    在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 + "
    ")
        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("
    ".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”

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/gaogao67/p/10494487.html
Copyright © 2011-2022 走看看