MySQL主从级联复制详解(一主一从一级联)

 更新时间:2025年08月14日 11:00:38   作者:大新屋  
本文介绍三台MySQL服务器主从复制配置流程:主库设置server_id、log_bin并创建复制用户,备份数据后同步至从库slave01;slave01再作为主库同步至级联从库slave02,均需锁表确保数据一致性,最后通过测试验证同步状态

提示:三台MySQL数据库已安装完成,本教程不讲解MySQL数据库安装。

主机规划

主机类型主机名称主机IP操作系统版本MySQL版本备注
MySQL主库master192.168.91.61CentOS 7.9MySQL 8.0.28
MySQL从库slave01192.168.91.62CentOS 7.9MySQL 8.0.28
MySQL级联从库slave02192.168.91.63CentOS 7.9MySQL 8.0.28

一、Master主库配置

1、主库配置MySQL数据库配置文件,添加server_id和log_bin参数即可开启主从复制的主库功能

[root@master ~]# vim /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock

[mysqld]
### 开启主从复制功能并指定二进制日志存放路径,指定的server_id不能与其它从库的server_id重复
server_id=10
log_bin=/usr/local/mysql/logs/mysql-bin
### 设置自动清除binlog二进制日志,保留最近7天bin-log日志,默认保留最近30天,单位秒
binlog_expire_logs_seconds=604800

basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
mysqlx_socket=/usr/local/mysql/data/mysqlx.sock
pid_file=/usr/local/mysql/data/mysqld.pid
log_error=/usr/local/mysql/logs/error.log
log-bin=/usr/local/mysql/logs/mysql.bin
character-set-server=utf8mb4

max_connections=500
max_connect_errors=1000
port=3306
mysqlx_port=33060

2、重启主库MySQL数据库

/etc/init.d/mysqld stop
/etc/init.d/mysqld start

3、主库创建主从复制验证用户

mysql -uroot -p'123456'

create user 'sync'@'%' identified with 'mysql_native_password' by '123456';
grant replication slave on *.* to 'sync'@'%';
flush privileges;

4、主库查看当前二进制日志文件名和位置

注意:查看主库二进制日志文件名和位置之前,需要把主库MySQL数据库进行锁表,防止有写入操作,以免影响二进制日志文件名和位置的同步信息

mysql -uroot -p'123456'

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql.000001
         Position: 157
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

5、主库备份数据库并远程复制一份给salve01从库

注意:如果MySQL数据库过大,可以考虑使用物理备份XtraBackup工具。

mysqldump -uroot -p'123456' -A >/mnt/mysql_bak.sql

scp -rp /mnt/mysql_bak.sql root@192.168.91.62:/mnt/

二、Slave01从库配置

1、slave01从库配置MySQL数据库配置文件,添加log_bin、relay_log、relay_log_index、log_replica_updates参数

[root@slave01 ~]# cat /etc/my.cnf 
[client]
socket=/usr/local/mysql/data/mysql.sock

[mysqld]
### 开启主从复制功能并指定二进制日志存放路径,指定的server_id不能与其它主库或从库的server_id重复
server_id=20
log_bin=/usr/local/mysql/logs/mysql-bin
### 设置自动清除binlog二进制日志,保留最近7天bin-log日志,默认保留最近30天,单位秒
binlog_expire_logs_seconds=604800
### 开启从库记录中继日志功能,命名方式(主机名称-relay-bin),命名可自定义,默认开启
#relay_log=/usr/local/mysql/logs/slave01-relay-bin
#relay_log_index=/usr/local/mysql/logs/slave01-relay-bin.index
### 启动副本更新,从库从主库接收到log-bin更新操作由从库SQL线程执行更新写入到从库自己的log-bin日志中,默认开启
#log_replica_updates=1
#### 设置只允许普通用户写入,只针对普通用户有效(拥有insert、update、delete、drop等权限),但对于超级用户无效(管理员root或者all privileges所有权限用户),默认关闭
read_only=1
#### 设置是否禁止超级管理员写入,针对所有数据库用户,包括超级用户和普通用户,默认关闭
super_read_only=1

basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
mysqlx_socket=/usr/local/mysql/data/mysqlx.sock
pid_file=/usr/local/mysql/data/mysqld.pid
log_error=/usr/local/mysql/logs/error.log
log-bin=/usr/local/mysql/logs/mysql.bin
character-set-server=utf8mb4

max_connections=500
max_connect_errors=1000
port=3306
mysqlx_port=33060

2、slave01从库导入master主库的备份库文件并重启MySQL数据库

mysql -uroot -p'123456'
mysql>source /mnt/mysql_bak.sql

/etc/init.d/mysqld stop
/etc/init.d/mysqld start

3、开启slave01从库同步master主库

mysql -uroot -p'123456'

CHANGE MASTER TO
MASTER_HOST='192.168.91.61',
MASTER_PORT=3306,
MASTER_USER='sync',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=157;

mysql> start slave;

mysql> show slave status\G;

4、slave01从库查看当前二进制日志文件名和位置

注意:查看slave01从库二进制日志文件名和位置之前,需要把slave01从库MySQL数据库锁表,防止有写入操作,以免影响二进制日志文件名和位置的同步信息

mysql -uroot -p'123456'

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql.000002
         Position: 157
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 

5、slave01从库备份数据库并远程复制一份给salve02级联从库

注意:如果MySQL数据库过大,可以考虑使用物理备份XtraBackup工具。

mysqldump -uroot -p'123456' -A >/mnt/mysql_slave_bak.sql

scp -rp /mnt/mysql_slave_bak.sql root@192.168.91.63:/mnt/

三、Slave02级联从库配置

1、slave01从库配置MySQL数据库配置文件,添加log_bin、relay_log、relay_log_index、log_replica_updates参数

[root@slave01 ~]# cat /etc/my.cnf 
[client]
socket=/usr/local/mysql/data/mysql.sock

[mysqld]
### 开启主从复制功能并指定二进制日志存放路径,指定的server_id不能与其它主库或从库的server_id重复
server_id=30
log_bin=/usr/local/mysql/logs/mysql-bin
### 设置自动清除binlog二进制日志,保留最近7天bin-log日志,默认保留最近30天,单位秒
binlog_expire_logs_seconds=604800
### 开启从库记录中继日志功能,命名方式(主机名称-relay-bin),命名可自定义,默认开启
#relay_log=/usr/local/mysql/logs/slave01-relay-bin
#relay_log_index=/usr/local/mysql/logs/slave01-relay-bin.index
### 启动副本更新,从库从主库接收到log-bin更新操作由从库SQL线程执行更新写入到从库自己的log-bin日志中,默认开启
#log_replica_updates=1
#### 设置只允许普通用户写入,只针对普通用户有效(拥有insert、update、delete、drop等权限),但对于超级用户无效(管理员root或者all privileges所有权限用户),默认关闭
read_only=1
#### 设置是否禁止超级管理员写入,针对所有数据库用户,包括超级用户和普通用户,默认关闭
super_read_only=1

basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
mysqlx_socket=/usr/local/mysql/data/mysqlx.sock
pid_file=/usr/local/mysql/data/mysqld.pid
log_error=/usr/local/mysql/logs/error.log
log-bin=/usr/local/mysql/logs/mysql.bin
character-set-server=utf8mb4

max_connections=500
max_connect_errors=1000
port=3306
mysqlx_port=33060

2、slave02级联从库导入slave01从库的备份库文件并重启MySQL数据库

mysql -uroot -p'123456'
mysql> source /mnt/mysql_slave_bak.sql

/etc/init.d/mysqld stop
/etc/init.d/mysqld start

3、开启slave01从库同步master主库

mysql -uroot -p'123456'

CHANGE MASTER TO
MASTER_HOST='192.168.91.62',
MASTER_PORT=3306,
MASTER_USER='sync',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql.000002',
MASTER_LOG_POS=157;

mysql> start slave;

mysql> show slave status\G;

四、测试

1、master主库创建测试数据,查看slave01从库同步状态,查看slave02级联从库同步状态

### master主库写入测试数据
mysql -uroot -p'123456'

create database student;
create table student.test (id int(11),name varchar(25));
insert into student.test values(1,'xiaoming');
insert into student.test values(2,'zhangshang');
insert into student.test values(3,'lishi');
select * from student.test;

### slave01从库查看主从同步状态
mysql -uroot -p'123456'
select * from student.test;
show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

### slave02级联从库查看主从同步状态
mysql -uroot -p'123456'
select * from student.test;
show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

2、master主库大批量写入测试数据,查看slave01从库同步状态,查看slave02级联从库同步状态

### master主库在操作系统使用shell批量写入测试数据
for i in {4..1000}; do mysql -uroot -p'123456' -e "insert into student.test(id,name) values('$i','AAA');";done

### slave01从库查看主从同步状态
mysql -uroot -p'123456'
mysql> select * from student.test;
mysql> show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

### slave02级联从库查看主从同步状态
mysql -uroot -p'123456'
mysql> select * from student.test;
mysql> show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql 连接出现Public Key Retrieval is not allowed的问题解决

    mysql 连接出现Public Key Retrieval is n

    在MySQL连接中出现“Public Key Retrieval is not allowed”错误,通常是因为在使用安全套接字层(SSL)连接时遇到了问题,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2024-03-03
  • MySQL 8.0自增变量的持久化问题小结

    MySQL 8.0自增变量的持久化问题小结

    MySQL5.7中自增主键在重启后会重置,而MySQL8.0中通过重做日志持久化自增变量,避免重启后主键冲突,本文介绍MySQL 8.0自增变量的持久化问题小结,感兴趣的朋友一起看看吧
    2024-11-11
  • mysql利用覆盖索引避免回表优化查询

    mysql利用覆盖索引避免回表优化查询

    这篇文章主要给大家介绍了关于mysql如何利用覆盖索引避免回表优化查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL创建内部临时表的所有场景盘点

    MySQL创建内部临时表的所有场景盘点

    这篇文章主要为大家介绍了MySQL创建内部临时表的所有场景盘点,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • MySQL如何运行sql文件图文详解(以Navicat做演示)

    MySQL如何运行sql文件图文详解(以Navicat做演示)

    Navicat是MySQL非常好用的可视化管理工具,功能非常强大,能满足我们日常数据库开发的所有需求,这篇文章主要给大家介绍了关于MySQL如何运行sql文件(以Navicat做演示)的相关资料,需要的朋友可以参考下
    2024-08-08
  • MySQL数据类型与表操作全指南( 从基础到高级实践)

    MySQL数据类型与表操作全指南( 从基础到高级实践)

    本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与实际应用结合,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-08-08
  • MySQL中聚簇索引与非聚簇索引的实现

    MySQL中聚簇索引与非聚簇索引的实现

    MySQL数据库中,聚簇索引和非聚簇索引是提高查询效率的关键,聚簇索引决定数据的物理存储顺序,通常由主键或UNIQUE索引构成,非聚簇索引则通过指针定位数据行,适合访问数据子集,下面就来具体介绍一下,感兴趣的可以了解一下
    2024-09-09
  • MySQL磁盘碎片整理实例演示

    MySQL磁盘碎片整理实例演示

    这篇文章主要给大家介绍了关于MySQL磁盘碎片整理的相关资料,为什么数据库会产生碎片,以及如何清理磁盘碎片,还有一些清理磁盘碎片的注意事项,需要的朋友可以参考下
    2022-04-04
  • mysql更改引擎(InnoDB,MyISAM)的方法

    mysql更改引擎(InnoDB,MyISAM)的方法

    这篇文章主要介绍了mysql更改引擎(InnoDB,MyISAM)的方法,实例讲述了比较常见的几种更改引擎的方法,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • MySQL与PHP的基础与应用专题之自连接

    MySQL与PHP的基础与应用专题之自连接

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,本系列将带你掌握php与mysql的基础应用,本篇从自连接开始
    2022-02-02

最新评论