MySQL主从复制

发布于:2025-05-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

一:MySQL主从复制原理

MySQL 的主从复制和 MySQL 的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。

1.MySQL支持的复制类型

①基于语句的复制。在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句,MySQL 默认采用基于语句的复制,效率比较高。
②基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
③混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制

2.复制的工作过程

① 在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。
② Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程 ——I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件。I/O 线程将这些事件写入中继日志。
③ SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

二:案例实施

1.配置master主服务器

(1)在 /etc/my.cnf 中修改或者增加下面内容。

log-bin=/usr/local/mysql/data/mysql-bin #启用二进制日志(Binary Log)并指定其存储路径
binlog_format = MIXED #定义二进制日志的记录格式为混合模式
server-id=1 #为 mysql 实例分配一个唯一的服务器标识符

(2)重启 MySQL 服务。

[root@master ~]# systemctl restart mysqld


(3)登录 MySQL 程序,给从服务器授权。

[root@master ~]# mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE USER'myslave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON . TO'myslave'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql>ALTER USER'myslave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#MySQL 8.0 默认使用 caching_sha2_password 认证插件,将 mysql_native_password 替换为旧版认证插件,确保从库能兼容
mysql>FLUSH PRIVILEGES;
mysql>show master status;

2.配置slave从服务器

(1)在 /etc/my.cnf 中修改或者增加下面内容,这里要注意 server-id 不能相同。

[root@localhost ~]# vim /etc/my.cnf
server-id = 2 // 增加,唯一的服务器标识符,集群内不能冲突


(2)重启 MySQL 服务。

​[root@localhost ~]# systemctl restart mysqld

(3)登录 MySQL,配置同步。
按主服务器结果更改下面命令中 master_log_file 和 master_log_pos 参数。

[root@localhost ~]# mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> change master to master_host='192.168.10.101',master_user='myslave', master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)


(4)启动同步。

mysql>start slave;
Query OK, 0 rows affected (0.00 sec)

(5)查看 Slave 状态,确保以下两个值为 YES
 

mysql> show slave status\G
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.10.101
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql - bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File: 
localhost
 - relay - bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql - bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
省略部分内容

3.验证主从复制效果

(1) 在主、从服务器上登录 MySQL,

[root@localhost ~]# mysql -u root -p
mysql>show databases;

两台数据库执行结果应该相同。
(2) 在主服务器上新建数据库 db_test

mysql>create database db_test;

(3) 在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

mysql> show databases;


网站公告

今日签到

点亮在社区的每一天
去签到