MySQL 主从复制工作过程
1、主库记录二进制日志:
当主库上执行更新操作(如 INSERT、UPDATE、DELETE 等)时,主库会将这些操作记录到二进制日志(Binary Log)中。
2、从库创建 I/O 线程:
从库会创建一个 I/O 线程,该线程连接到主库,并请求主库发送二进制日志。
3、主库创建 Binlog Dump 线程:
主库接收到从库的请求后,会创建一个 Binlog Dump 线程,将二进制日志中的内容发送给从库。
4、从库接收并存储中继日志:
从库的 I/O 线程接收到主库发送的二进制日志内容后,将其存储到本地的中继日志(Relay Log)中。
5、从库创建 SQL 线程:
从库会创建一个 SQL 线程,该线程读取中继日志中的内容,并将其中的 SQL 语句在从库上执行,从而实现数据的同步。
首先准备三台虚拟机
- 主:192.168.1.11(mater)
- 从:192.168.1.13(slave1)
- 从:192.168.1.14(slave2)
建议版本环境干净且相同(成功率高)
一、192.168.1.11(mater)
编辑配置文件
[root@master ~]# vim /etc/my.cnf
server_id=11
也可以写在子配置文件mysqld下
[root@master ~]# vim /etc/my.cnf.d/mysql-server.cnf
重新启动MySQL
[root@master ~]# systemctl restart mysqld.service
或者第一次启动:
[root@master ~]# systemctl enable --now mysqld
授权用户:
mysql> create user rep@'192.168.1.%' identified with mysql_native_password by '123456';
mysql> grant replication slave on *.* to rep@'192.168.1.%';
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 678 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
二、192.168.1.13(slave1)
同理先编辑配置文件和重新启动MySQL
[root@slave1 ~]# vim /etc/my.cnf
server_id=13
[root@slave1 ~]# systemctl restart mysqld.service
或者第一次启动:
[root@slave1 ~]# systemctl enable --now mysqld
与Master(192.168.1.11主机)建立连接
CHANGE MASTER TO
MASTER_HOST = '192.168.1.11',
MASTER_USER = 'rep',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'binlog.000001',
MASTER_LOG_POS = 678;
mysql> start slave;
mysql> show slave status \G #查看是否成功
出现双yes才算成功
三、192.168.1.14(slave2)
同理先编辑配置文件和重新启动MySQL
[root@slave2 ~]# vim /etc/my.cnf
server_id=14
[root@slave2 ~]# systemctl restart mysqld.service
或者第一次启动:
[root@slave2 ~]# systemctl enable --now mysqld
与Master(192.168.1.11主机)建立连接
CHANGE MASTER TO
MASTER_HOST = '192.168.1.11',
MASTER_USER = 'rep',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'binlog.000001',
MASTER_LOG_POS = 678;
mysql> start slave;
mysql> show slave status \G #查看是否成功
如果有报错,部分解决方法可以看我前面的博客MySQL主从同步
测试:
可以在主库创建数据库,从库会立即出现
mysql> create database db1; #主库创建
mysql> show databases; #主从库皆可查看到db1
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)