(1)主机操作
1)执行下面命令,进入配置文档
vim /etc/my.cnf
将以下信息修改到配置表
[mysqld]
#开启log-bin二进制日志
log-bin=mysql-bin
#配置唯一的服务器ID
server-id=1
#下面这两个不是必须要配置
#主要是为了使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
2)创建日志目录
mkdir /var/log/mysql
3) 重启数据库
systemctl start mysqld
4)进入数据库
show variables like 'server_id'; -- server_id 必须唯一
show variables like 'log_bin'; -- 为ON状态
show variables like '%skip_networking%';
skip_networking默认是OFF关闭状态,启用后主从将无法通信,若启用后,需要进入 /etc/my.cnf 把 skip_networking 注释掉,然后 service mysqld stop 关闭数据库后再重启,稍等一会儿进入数据库后,就会恢复OFF状态
5)创建用来做主从复制的账号
CREATE USER 'slave'@'%' identified by 'Slave2022;.' ; --创建账号
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'Slave2022;.'; --授予权限
6)查看主库的二进制日志的名称和点位,后面从机设置的时候会用到,该信息必须是最新的
show master status\G
(2)从机操作
1) mysql -u主机数据库备份账号 -p’密码’ -h主机IP地址 从机登入主机的数据库,如:
mysql -uslave -p'Slave2022;.' -h主机IP
2)如果出现连不上的问题,需要在主机和从机都关闭防火墙
systemctl stop firewalld
3)成功连上后,退出,进去 vim /etc/my.cnf 配置文档
添加以下参数,server-id 必须重新赋予新值,且必须唯一
log-bin=mysql-bin
server-id=5
4)重启数据库
systemctl start mysqld
5)登入数据库后,配置以下信息
CHANGE MASTER TO MASTER_HOST='主机IP',MASTER_USER='slave',MASTER_PASSWORD='Slave2022;.',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000009',MASTER_LOG_POS=154,MASTER_AUTO_POSITION=0;
第三步骤 3)如果 server-id 没有重新赋予新值,会一直报下面的错
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.
如果是报以下错误:
ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL ‘’ first
就需要先关闭复制功能
stop slave
6)开启主从复制
start slave
7)查看从机复制信息,会发现主从复制已开启
show slave status\G
8)成功设置之后,主机的数据库操作,从机都会跟着同步复制
9)下次重启服务器的时候,发现 5)步骤报以下错误
This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL ‘’ first
那么 stop slave 先关闭主从复制,然后重新连接即可
10)两台机子的UUID一致问题
若从机是由主机直接克隆,那么,根据以上操作之后,会出现 IO 处于NO状态,那么主机的操作就无法复制到从机,原因是两台机子的UUID是一致的
报错信息可在以下查找到
处理方法:
1)先在数据库找到数据文件的路径
show variables 'datadir'
2)然后随机生成一个UUID号,用来更改后面文档信息
select uuid()
3)退出数据库后,修改该配置文档,将刚刚的UUID复制进去
vim /var/lib/mysql/auto.cnf
4)然后关闭数据库
service mysqld stop
并重启
systemctl start mysqld
5)然后登入数据库,先关闭复制 stop slave ,再按上面的<从机操作(5)步骤>,并 start slave 开启,即可查看从机的复制状态,此时即可完成主从同步复制
两台虚拟机都作为从机或者主机,即可实现双向复制。
1)vim /etc/my.cnf 两台机子都需要进入配置文档,添加以下信息:
log-bin=master-bin #日志文件名称
server-id=144 #唯一标识符
auto_increment_increment= #几台机器就配几
auto_increment_offset= #按顺序即可,例如(第一台:1;第二台:2)
replicate-do-db=数据库名称 #设置双主复制的数据库
2)模块(一)中已经配置了主机的复制权限账号,同理需要在从机也新建授予一个复制账号
CREATE USER 'slave'@'%' identified by 'Slave2022;.' --创建用来做主从复制的账号
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'Slave2022;.' --授予权限
3) 分别查看日志文件名称和点位
show master status
4)登入数据库后,两机子都配置以下信息,内容为对方机子的信息,用来做连接配置
CHANGE MASTER TO MASTER_HOST='主机IP',MASTER_USER='slave',MASTER_PASSWORD='Slave2022;.',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=154,MASTER_AUTO_POSITION=0;
5)两台机子都要开启复制功能
start slave
6)此时两台机子的数据库操作就都会被同步复制到对方机子上
以上,即可实现任意两台机子之间的同步复制,但要实现 多台主机一台从机,需要继续配置
关于一开始就一堆报错,关于我也不知道的错误:两个状态都是NO,百度查的,可以实现问题
stop slave ;
set global sql_slave_skip_counter=1;
start slave;
即可实现两个都是YES
1)首先两台主机都要进行以下信息的配置:vim /etc/my.cnf
#GTID配置
server-id=唯id
log_bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row
2)从机需要进行以下配置:vim /etc/my.cnf
#GTID配置
server-id=唯id
log_bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row
#多源复制从库配置
master_info_repository=table
relay_log_info_repository=table
3)两台主机都需要新建用来做复制的账号并授予权限,具体操作如上,不同主机对应的复制账号必须不同
4)在从机登入数据库,先关闭复制功能 stop slave,然后进行以下配置,将两台主机的信息配置到从机里面
CHANGE MASTER TO MASTER_HOST='主机IP',MASTER_USER='slave',MASTER_PASSWORD='Slave2022;.',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000013',MASTER_LOG_POS=686,MASTER_AUTO_POSITION=0 for channel '300';
CHANGE MASTER TO MASTER_HOST='主机IP',MASTER_USER='slave',MASTER_PASSWORD='Slave2022;.',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000016',MASTER_LOG_POS=154,MASTER_AUTO_POSITION=0 for channel '200';
看到这两句配置和上面一主一从的区别了吗,在最后需要设置独立的 通道名称。
for channel --定义通道名称
若通道没有分别定义,会出现,从机只能和最后一台配置的主机连接,第一台的连接通道会被下一台替换,这个问题折磨了我两个小时,在认真的思考了一下每个关键点的意义之后才找到原因。学习真的是一点都不能偷懒,一个不清楚,就不知道如何下手。
5)然后开启复制功能 start slave 。按照以上步骤,即可实现多源同步复制。