概述
网上的教程大多是配置指定某个库的同步,如果主服务器上新建了数据库,从服务器并不会也跟着创建数据库并同步。
配置主库
在主库的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_Running
和Slave_SQL_Running
的值都是Yes
,说明配置成功。
如果Slave_IO_Running
为No
,则查看后面的Last_IO_Error
字段,里面会有详细的出错原因。
如果Slave_SQL_Running
为No
,则查看后面的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_file
和master_log_pos
,直接用master_auto_position = 1
代替即可。
注意事项
如果要开启gtid,需要在主库和从库都开启才有效。
查看GTID是否开启
show variables like 'gtid_mode'