MySQL8配置主从同步(同步所有库)

概述

网上的教程大多是配置指定某个库的同步,如果主服务器上新建了数据库,从服务器并不会也跟着创建数据库并同步。

配置主库

在主库的mysql配置文件my.cnf中添加或修改如下参数:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1
binlog-ignore-db=mysql,sys,performance_schema,information_schema

配置项说明:
log-bin:表示启用binlog功能,并指定二进制日志的存储目录
binlog_format:binlog日志格式,mysql默认采用statement,建议使用mixed
server-id:指定唯一的servr ID,主从数据库的server-id必须是不一样的数字,一般线上环境可以用ip地址的最后一段作为server-id。
binlog-ignore-db:binlog日志不记录指定库的更新
binlog-do-db:binlog日志只记录指定库的更新。由于我们需要配置所有库的同步,故不设置该参数。

配置从库

在从库的mysql配置文件my.cnf中添加或修改如下参数:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=2
replicate-ignore-db=mysql,sys,performance_schema,information_schema
log-slave-updates
slave-skip-errors=all

replicate-ignore-db:不进行主从复制的数据库名
log-slave-updates:记录从库更新,允许链式复制( A-B-C )。当该从库作为其他库的主库时,需要添加该参数
replicate-do-db:要进行主从复制的数据库名。由于我们需要配置所有库的同步,故不设置该参数。
slave-skip-errors:从库同步时忽略遇到的错误

配置同步账号

在主库中添加用于读取主库日志的账号:

SET SQL_LOG_BIN=0;
CREATE USER slaveuser@'%' IDENTIFIED WITH mysql_native_password BY 'password';
grant replication slave on *.* to slaveuser@'%';
flush privileges;
SET SQL_LOG_BIN=1;

记录主库信息

登录主库,执行以下语句:

mysql> show master status;


File是同步会使用到的binlog文件
Position是同步时需要读取的位置

重启从库,进入mysql,配置同步

mysql> stop slave;
mysql> change master to master_host='主库的IP',master_port=3306,master_user='slaveuser',master_password='password',master_log_file='mysql-bin.000005', master_log_pos=753117;
mysql> start slave;

master_host:主库的ip地址,这里为127.0.0.1
master_port:主库的端口,默认为3306
master_user:同步账号,这里为slaveuser
master_password:同步账号的密码,这里为password
master_log_file:开始同步的日志文件
master_log_pos:开始同步的日志的开始位置

查看同步状态

登录从库执行以下语句:

mysql> show slave status

如果Slave_IO_RunningSlave_SQL_Running的值都是Yes,说明配置成功。
如果Slave_IO_RunningNo,则查看后面的Last_IO_Error字段,里面会有详细的出错原因。
如果Slave_SQL_RunningNo,则查看后面的Last_SQL_Error字段,里面会有详细的出错原因。

测试同步

在主库中的创建一个新的数据库,然后查看从库中否同步也创建了这个数据库。

更多

主主同步

主主同步,只需要把主库的配置改为:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1
log-slave-updates
slave-skip-errors=all
binlog-ignore-db=mysql,sys,performance_schema,information_schema
replicate-ignore-db=mysql,sys,performance_schema,information_schema

从库的配置改为:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=2
log-slave-updates
slave-skip-errors=all
binlog-ignore-db=mysql,sys,performance_schema,information_schema
replicate-ignore-db=mysql,sys,performance_schema,information_schema

开启GTID

GTID概念

从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

开启GTID的好处

GTID相对于行复制数据安全性更高,故障切换更简单。
1) 根据 GTID 可以快速的确定事务最初是在哪个实例上提交的。
2) 简单的实现 failover,不用以前那样在需要找 log_file 和 log_pos。
3) 更简单的搭建主从复制,确保每个事务只会被执行一次。
4) 比传统的复制更加安全,一个 GTID 在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
5)GTID是连续的没有空洞的,保证数据的一致性,零丢失
6)GTID 用来代替classic的复制方法,不再使用 binlog+pos 开启复制。而是使用 master_auto_postion=1 的方式自动匹配 GTID 断点进行复制。
7) GTID 的引入,让每一个事务在集群事务的海洋中有了秩序,使得 DBA 在运维中做集群变迁时更加方便

如何开启

只需要在my.cnf中添加:

# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true

然后在从库上执行:

stop slave;
change master to master_host='主库的IP',master_port=3306,master_user='slaveuser',master_password='password',master_auto_position = 1;
start slave;

跟之前对比,不需要再去查master_log_filemaster_log_pos,直接用master_auto_position = 1代替即可。

注意事项

如果要开启gtid,需要在主库和从库都开启才有效。

查看GTID是否开启

show variables like 'gtid_mode'

发表评论

邮箱地址不会被公开。 必填项已用*标注