Mysql主从机复制同步(单向、双向、多源)

文章目录

        • (一)主机到从机单向同步
        • (二)主机与从机双向同步(双主复制)
        • (三)多源同步复制

搭建两台Linux虚拟机,并独立安装好mysql,一台做主机,一台做从机,主机上的数据库操作会被自动写入从机

(一)主机到从机单向同步

(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 。按照以上步骤,即可实现多源同步复制。
Mysql主从机复制同步(单向、双向、多源)_第1张图片
Mysql主从机复制同步(单向、双向、多源)_第2张图片

你可能感兴趣的:(数据库相关,mysql,数据库,服务器)