zoukankan      html  css  js  c++  java
  • mysql基于二进制日志文件和位置的复制

    ##############################

    bin log日志要求:

    1,主库必须开启binlog,最好是row格式,
    2,中继节点必须开启log_slave_updates, (mysql8.0中为log_replica_updates)该值默认启用
    3,处于集群中的叶子节点的binlog和log_slave_updates随意

    [mysqld]
    log-bin = /home/work/mysql/log/mysql-bin server-id = 123456 binlog_format=row log_slave_updates

    relay log要求:

    [mysqld]
    
    relay-log = relay-bin

    不要默认,因为默认是hostname前缀作为relay log文件,容易留下坑

    server_id 要求:

    在整个mysql集群中的各个成员必须保证各自的server_id全局唯一,不能出现相同的server_id
    
     该值范围【1232 - 1】:在mysql8.0版本后,该值的默认值为1

    在线更改server_id:(同时需要更改配置文件,时刻保持一致最佳)

    set global server_id = 2;

     创建专用复制账户:

    mysql> create user 'mysqlsync'@'%' identified by  '123456';
    
    mysql> grant  replication slave,replication client  on *.*  to 'mysqlsync'@'%';

    获取主库的一个全量备份:

    1)拷贝主库数据目录:

    1,直接将主库正常关闭,关闭后查看主库的二进制文件名称(比如mysql-bin.000088),
    
    2,然后拷贝主库的data目录到从库节点,拷贝后,要删除数据目录中的auto.cnf文件,以便新副本以不同的生成服务器UUID启动。服务器 UUID 必须是唯一的。
    
    3,拷贝完成后启动主库,这时候主库的二进制文件名称就会是下一个文件了(mysql-bin.000089),聪明如你,应该知道主库的二进制文件名称和位置了吧,因为关闭主库后,你全量拷贝主库,mysql-bin.000089该文件及以后的binlog文件都是在你拷贝之后才写进去的事务,
    
    4,因此从库进行change master to的时候就是mysql-bin.000089文件中最开始的位置进行复制即可,故以--skip-slave-start方式启动从库(避免从库自动建立复制并启动,如果不加上这个启动参数,这可能会导致从库数据破坏而失败)也可以通过在配置文件my.cnf中[mysqld]中添加skip_slave_start配置来启动,这样就不会自动启动复制

    5,然后change master to,(在mysql8.0中请使用:change replication source to)再start slave,(mysql8.0中,请使用start replica)

    2)拷贝从库的数据目录:

    上面是通过停止主库,然后直接拷贝主库数据目录文件,当然了,如果该集群已经有其他从库实例,最佳选择自然是从其他从库实例拷贝数据目录最好,方法也差不多

     3)通过mysqldump逻辑备份:

     详情参考:https://www.cnblogs.com/igoodful/p/11920724.html

     4)通过xtrabackup或innobackupex物理备份:

     详情参考:https://www.cnblogs.com/igoodful/p/13045295.html

     构建主从复制:

    从 MySQL 8.0.23 开

    start slave
      until {
        #1、直到指定的gtid位置停下
        {sql_before_gtids | sql_after_gtids} = gtid_set
    
        #2、直到指定的binlog位置停下
        |   master_log_file = 'log_name', master_log_pos = log_pos
        
        #3、直到指定的relay log位置停下
        |   relay_log_file = 'log_name', relay_log_pos = log_pos
    
        #4、直到slave上多个并行线程之前没有延迟差距了就停下
        #因为多线程复制,不同线程的复制进度不一样,因此有差距
        |   sql_after_mts_gaps  }

     

     

    限制sql线程执行的位点:

    start slave   sql_thread  until   sql_before_gtids='b9d7ea3f-62b0-11ea-b3d0-0242ac110002:124'  ## 此处的gtid是误操作代表的那个gtid,通常是: "SET @@SESSION.GTID_NEXT='b9d7ea3f-62b0-11ea-b3d0-0242ac110002:124'" ,接着就是进行了误操作的sql

    # 这表示,sql线程执行到"b9d7ea3f-62b0-11ea-b3d0-0242ac110002:124"就停止,当然不包含"b9d7ea3f-62b0-11ea-b3d0-0242ac110002:124"这个gtid代表的事务,即执行到"b9d7ea3f-62b0-11ea-b3d0-0242ac110002:123"就停止。

    #############################

    igoodful@qq.com
  • 相关阅读:
    【个人实战】作品展播BI大屏【部分见github主页】
    JAVA设计模式之单例(singleton)
    你所不知道的redis安装方法,穿一手鞋,看一手资料
    zookeeper实现分布式锁总结,看这一篇足矣(设计模式应用实战)
    JAVA设计模式之状态模式(state)
    JAVA设计模式之适配器模式(adapter)
    JAVA设计模式之构建器模式(builder)
    Redis实现分布式锁(设计模式应用实战)
    JAVA设计模式之享元模式(flyweight)
    JAVA设计模式之组合模式(composite)
  • 原文地址:https://www.cnblogs.com/igoodful/p/15035065.html
Copyright © 2011-2022 走看看