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

  • 相关阅读:
    你真的了解HTML吗?–雅虎面试题
    移动端meta 解释
    PLSQL导入导出表的正确步骤
    Linux命令学习之xargs命令
    python搭建简易Web Server
    python小项目练习之转换像素图片为字符图
    向量空间搜索引擎基本理论
    Elasticsearch 常用基本查询
    Elasticsearch配置参数介绍
    JavaWeb温习之防止表单重复提交
  • 原文地址:https://www.cnblogs.com/gaogao67/p/10494487.html
Copyright © 2020-2023  润新知