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 该值范围【1,232 - 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