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"就停止。

 

 

 

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

posted @ 2021-07-20 15:11  igoodful  阅读(521)  评论(0编辑  收藏  举报