一、MySQL主从复制原理
MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核心组件和三个主要步骤:
核心组件
-
**二进制日志(Binary Log):**位于主服务器上,主服务器会将所有对数据库进行更改的操作(如 INSERT、UPDATE、DELETE 等)以二进制的形式记录到二进制日志文件中。这些日志记录了数据修改的具体内容和执行顺序,是主从复制的基础数据来源。
-
**中继日志(Relay Log):**存在于从服务器上,从服务器通过 I/O 线程从主服务器的二进制日志中读取更新事件,并将这些事件写入到本地的中继日志文件中。中继日志起到了缓存和中转的作用,确保从服务器能够按顺序处理主服务器的更新。
-
**SQL 线程:**从服务器上的 SQL 线程负责读取中继日志中的事件,并将这些事件在从服务器上重新执行一遍,从而实现主从数据的同步。
工作步骤
1. 主服务器记录二进制日志
- 当主服务器上发生数据更改操作(如插入、更新、删除数据)时,MySQL 会将这些更改操作记录到二进制日志中。二进制日志以事件(Event)的形式存储,每个事件对应一个具体的数据库更改操作。例如,当执行一条 INSERT 语句向表中插入数据时,主服务器会将该 INSERT 操作作为一个事件记录到二进制日志中。
2. 从服务器读取主服务器二进制日志
- 从服务器上有一个 I/O 线程,它会与主服务器建立连接,并请求主服务器发送其二进制日志。主服务器接收到请求后,会将二进制日志中的更新事件发送给从服务器的 I/O 线程。从服务器的 I/O 线程将接收到的更新事件写入到本地的中继日志中。
3. 从服务器执行中继日志中的事件
- 从服务器上的 SQL 线程会不断地监控中继日志,当发现中继日志中有新的事件时,会按照事件的顺序依次读取并执行这些事件。例如,如果中继日志中记录了一个 INSERT 事件,SQL 线程会在从服务器的相应表中执行相同的 INSERT 操作,从而保证从服务器的数据与主服务器的数据一致。
二、MySQL主从复制步骤
注意:firewall-cmd和getenforce处于关闭状态
1、基于binlog的主从同步
Master配置
[root@openEuler-1 ~]# yum install -y mysql-server
#配置文件(主机克隆),注意://三台主从库的id必须不同
#查看命令 vim /var/lib/mysql/auto.cnf
[root@openEuler-1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=1
[root@openEuler-1 ~]# systemctl restart mysqld
#授权用户
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';
mysql> show master status; //查看主服务器状态,日志用于从服务器同步,position是当前定位
Slave配置
#配置文件
[root@openEuler-2 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-2 ~]# systemctl restart mysqld
[root@openEuler-3 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-3 ~]# systemctl restart mysqld
[root@openEuler-3 ~]#
#设置复制参数,两个Slave一样的配置
mysql> change master to
-> master_host='192.168.159.133',
-> master_user='rep',
-> master_password='MySQL@123',
-> master_log_file='binlog.000004',
-> master_log_pos=1565;
Query OK, 0 rows affected, 9 warnings (0.03 sec)
#启动复制进程,两个Slave都启动
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
检查从库状态
mysql> show slave status \G

2、 基于gtid的主从同步配置
准备工作,停止从库的复制
stop slave
Master配置
#修改配置文件
[root@Master ~]# vim /etc/my.cnf.d/mysql-server.cnf
#在最后添加
gtid_mode=ON
enforce-gtid-consistency=ON
#重启MySQL服务
[root@Master ~]# systemctl restart mysqld.service
#重置二进制日志和GTID
mysql> reset master;
#创建用户授予权限
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';
#重新加载授权表
mysql> flush privileges;
Slave配置
#修改配置文件
[root@Slave1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
#重启服务
[root@Slave1 ~]# systemctl restart mysqld.service
#配置连接到主库
mysql> change replication source to
-> source_host='192.168.159.133',
-> source_port=3306,
-> source_user='rep',
-> source_password='MySQL@123',
-> source_auto_position=1;
mysql> start replica;
检查从库状态
mysql> show slave status \G