1.主从复制
主从复制 是一种数据复制技术,用于建立一个与主数据库完全一致的数据库环境,称为从数据库。在主从复制架构中,一个服务器被设置为主服务器(Master),充当数据源,其他服务器被设置为从服务器(Slave),用于复制主服务器的数据。
作用:
高可用性:主数据库故障时可快速切换到从数据库,保证系统持续可用
负载均衡:将读请求分散到多个从服务器,减轻主服务器压力
数据备份:通过异步复制实现数据备份和灾难恢复
数据分析:可在从服务器执行数据分析任务,不影响主库性能
1.2.主从复制原理
主库-------开启Binlog日志,授权用户
从库-------开启io线程和sql线程,主库开启dump线程
当主库Binlog日志内容更新后,dump线程会告诉io线程,io线程读取Binlog日志,将内容记录到到从库中继日志,sql线程读取中继日志,并执行,达到数据一致的目的

1.3主从同步模式
|----------|--------------------------------------------|---------------|---------------|
| 类型 | 特点 | 优点 | 缺点 |
| 异步复制(默认) | 主服务器写入binlog日志后立即返回数据给客户,不等待从库任何确认消息 | 性能最佳,主服务器不受影响 | 数据一致性弱,可能丢失数据 |
| 半同步复制 | 主服务器等待至少一个从库确认接收日志并写入到中继日志,并返回确认消息;再执行后续操作 | 数据一致性较好 | 性能略有下降 |
| 全同步复制 | 主服务器等待所有从库确认接收日志到中继日志,且返回确认后,再执行后续操作 | 数据一致性最强 | 性能影响最大,延迟较高 |
[主从同步模式]
1.5主从复制的两种方式(binlog日志方式>ID方式)
1.5.1binlog日志方式
传统的方法是基于从源的二进制日志(binlog)复制事件,并要求日志文件及其中的位置在源(主)和副本(从)之间进行同步。作为源(数据库更改发生的地方)的 MySQL 实例将更新和更改作为"事件"写入二进制日志。根据所记录的数据 库更改,二进制日志中的信息以不同的日志格式存储。副本配置为从源中读取二进制日志,并在副本的本地数据库上执行二进制日志中的事件。
1.5.2GTID方式
GTID (Global Transaction Identifier)是全局事务ID,当事务提交时自动生成,作为事务的唯一标识。GTID复制不需要指定 二进制文件名 和 位置 ,简化了配置管理。
GTID工作原理
主库更新数据时生成GTID,记录到binlog
从库I/O线程将变更写入relay log
从库SQL线程获取GTID,检查本地binlog记录
如有记录则忽略,无记录则执行并记录到binlog
GTID优势 :自动计算复制位置,无需人工干预,运维更友好。

2.主从复制搭建(binlog日志方式)
前置操作
1.三台主机都安装相同版本的MySQL:Linux-安装MySQL-CSDN博客 (此处使用Centos9,MySQL8.0.44)
2.三台主机都设置本地域名解析(vim /etc/hosts)vim /etc/hosts
192.168.189.138 mysql-master
192.168.189.133 mysql-slave1
192.168.189.129 mysql-slave2
3.三台主机都关闭防火墙和SELinuxsystemctl disable --now firewalld
setenforce 0
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
4.三台主机都确保时钟同步dnf -y install chrony
vim /etc/chrony.conf
注释默认的 pool 服务器,添加阿里云 NTP 服务器
pool 2.centos.pool.ntp.org iburst
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
server ntp6.aliyun.com iburst
server ntp7.aliyun.com iburst
systemctl start chronyd
systemctl enable chronyd
2.1主库部署
|--------------------|-----------------|
| mysql-master(主库) | 192.168.189.138 |
| mysql-slave1(从库1) | 192.168.189.133 |
| mysql-slave2 (从库2) | 192.168.189.129 |
[实验环境]
2.1.1主库创建同步用户
CREATE USER 用户名@'主机/IP' IDENTIFIED WITH mysql_native_password BY '密码'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 用户名@'主机/IP';
FLUSH PRIVILEGES; -刷新
CREATE USER jack@'192.168.189.%' IDENTIFIED WITH mysql_native_password BY 'Jack@123'; -创建jack用户
GRANT REPLICATION SLAVE ON *.* TO jack@'192.168.189.%'; -给jack分配reolication slave权限
FLUSH PRIVILEGES; -刷新



2.1.2备份主库数据同步从节点
备份主库数据
mysqldump -uroot -p'Root@123' \
> --single-transaction \
--source-data=2 \
--routines \
--events \
--triggers \
--all-databases \
--default-character-set=utf8mb4 \
> master_full_backup_`date +%Y%m%d`.sql
将主库数据传到两个从库主机/root目录下
scp master_full_backup_20260121.sql root@mysql-slave1:/root
scp master_full_backup_20260121.sql root@mysql-slave2:/root
--备份主库数据
mysqldump -uroot -p'Root@123' \
> --single-transaction \
--source-data=2 \
--routines \
--events \
--triggers \
--all-databases \
--default-character-set=utf8mb4 \
> master_full_backup_`date +%Y%m%d`.sql

将主库数据传到两个从库主机/root目录下
scp master_full_backup_20260121.sql root@mysql-slave1:/root
scp master_full_backup_20260121.sql root@mysql-slave2:/root

2.1.3修改主库配置文件
vim /etc/my.cnf
server-id=1 #身份标识
log_bin=/var/log/mysql/mysql-bin.log #binlog日志位置
mkdir -p /var/log/mysql -创建目录
chown mysql:mysql /var/log/mysql -修改目录权限
systemctl restart mysqld -重启MySQL
vim /etc/my.cnf
server-id=1 #身份标识
log_bin=/var/log/mysql/mysql-bin.log #binlog日志位置
mkdir -p /var/log/mysql -创建目录
chown mysql:mysql /var/log/mysql -修改目录权限
systemctl restart mysqld -重启MySQL
2.2从库配置
2.2.1导入主库数据
mysql -uroot -p'Root@123' -e 'source /root/master_full_backup_20260121.sql'
或者
mysql -uroot -p'Root@123' < /root/master_full_backup_20260121.sql

2.2.2修改从库配置文件-/etc/my.cnf
从库1
server-id = 2 # 主服务器ID为1,从服务器ID为2或其它唯一值
master-info-repository=TABLE # 主库信息存储到表 8.4不支持
relay-log-info-repository=TABLE # 中继日志信息存储到表 8.4不支持
read_only=ON # 设置从库为只读模式(防止误写) 影响范围:普通用户账户
super_read_only=ON # 超级只读模式 影响范围:所有用户从库2
server-id = 3 # 主服务器ID为1,从服务器ID为2或其它唯一值
master-info-repository=TABLE # 主库信息存储到表 8.4不支持
relay-log-info-repository=TABLE # 中继日志信息存储到表 8.4不支持
read_only=ON # 设置从库为只读模式(防止误写) 影响范围:普通用户账户
super_read_only=ON # 超级只读模式 影响范围:所有用户
vim /etc/my.cnf


2.2.3配置主从同步
使用同步用户测试与主库的连接
mysql -h mysql-master -ujack -p'Jack@123'
在主库查看binlog日志名称、位置(使用root用户登录主库MySQL)
show master status;

从库指定主节点同步信息(使用root用户登录从库MySQL)
第一种写法(MySQL5.7)
\e
CHANGE MASTER TO
MASTER_HOST='主库主机名/IP',
MASTER_PORT=端口号,
MASTER_USER='同步用户',
MASTER_PASSWORD='同步用户密码',
MASTER_LOG_FILE='主库现在的binlog日志文件',
MASTER_LOG_POS=主库现在binlog日志的位置;:wq
;
START SLAVE; --启动同步**(如果输入错误先STOP SLAVE再使用RESET SLAVE重写)**
SHOW SLAVE STATUS\G# 检查Slave线程状态,确保Slave_IO_Running和Slave_SQL_Running都为Yes。
第二种写法(MySQL8.0)
\e
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='mysql-master',
SOURCE_PORT=3306,
SOURCE_USER='jack',
SOURCE_PASSWORD='Jack@123',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=339;:wq
;
START REPLICA; --启动同步**(如果输入错误先STOP SLAVE再使用RESET SLAVE重写)**
SHOW REPLICA STATUS\G# 检查Slave线程状态,确保Slave_IO_Running和Slave_SQL_Running都为Yes。


3.主从复制搭建(GTID方式)
3.1主库配置
3.1.1配置文件-/etc/my.cnf(需重启mysql服务)
server-id=1 # 服务器唯一标识,主从不能重复
log-bin=mysql-bin # 开启二进制日志,主库必须开启【可选】
gtid_mode=ON # 启用GTID模式
enforce_gtid_consistency=ON # 强制GTID一致性

3.1.2创建同步用户
CREATE USER 用户名@'主机/IP' IDENTIFIED WITH mysql_native_password BY '密码'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 用户名@'主机/IP';
FLUSH PRIVILEGES; -刷新
CREATE USER jack@'192.168.189.%' IDENTIFIED WITH mysql_native_password BY 'Jack@123'; -创建jack用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'jack'@'%'; -创建用户
FLUSH PRIVILEGES; -刷新
3.1.3备份主库数据同步到从库
注:如果从库加入时,主库已运行一段时间,已有业务数据,则需要做以下操作
主库备份
mysqldump -u root -p"Root@123" \
--single-transaction \
--source-data=2 \
--routines \
--events \
--triggers \
--all-databases \
--set-gtid-purged=ON \
--default-character-set=utf8mb4 \
> master_full_backup_$(date +%Y%m%d).sql将备份文件拷贝到两个从库服务器
root@mysql-master \~\]# scp master_full_backup_\*.sql root@mysql-slave1:/root/ \[root@mysql-master \~\]# scp master_full_backup_\*.sql root@mysql-slave2:/root/
3.2从库配置
3.2.1配置文件-/etc/my.cnf(需重启mysql服务)
server-id=2 # 从服务器ID,必须唯一
gtid_mode=ON # 启用GTID模式
enforce_gtid_consistency=ON # 强制GTID一致性
master-info-repository=TABLE # 主库信息存储到表 8.4不支持
relay-log-info-repository=TABLE # 中继日志信息存储到表 8.4不支持
read_only=ON # 设置从库为只读模式(防止误写) 影响范围:普通用户账户
super_read_only=ON # 超级只读模式 影响范围:所有用户
#mysql_native_password=ON # 8.4版本
3.2.2配置主从连接
使用root进入从库
第一种写法(MySQL5.7)
\e
CHANGE MASTER TO
MASTER_HOST='mysql-master', -- 主库IP地址
MASTER_USER='jack', -- 复制用户名
MASTER_PASSWORD='Jack@123', -- 复制用户密码
MASTER_AUTO_POSITION=1; -- 启用GTID自动定位
:wq;
回车
START SLAVE; -- 启动复制进程
SHOW SLAVE STATUS\G; -- 检查复制状态
使用root进入从库第二种写法(MySQL8.0)
\e
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='mysql-master',
SOURCE_USER='jack',
SOURCE_PASSWORD='Jack@123',
SOURCE_PORT=3306,
SOURCE_AUTO_POSITION=1mysql> START REPLICA;
mysql> SHOW REPLICA STATUS\G-- 如果主从复制参数需要修改:
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_USER = 'slave',
SOURCE_PASSWORD = 'YANGge456@';
START REPLICA;

4.常用管理命令
|------------|------------------------------------|
| 查看从库状态 | SHOW SLAVE STATUS\G |
| 查看主库状态 | SHOW MASTER STATUS; |
| 查看复制连接 | SHOW PROCESSLIST; |
| 查看GTID执行情况 | SELECT * FROM mysql.gtid_executed |
[监控命令]
|------------|----------------------------------------|
| 停止复制 | STOP SLAVE; |
| 启动复制 | START SLAVE; |
| 重置复制 | RESET SLAVE ALL; |
| 跳过错误(谨慎使用) | SET GLOBAL sql_slave_skip_counter = 1; |
[控制命令]
5.binlog>id的差异
GTID的主配置-/etc/my.cnf中:
log-bin=mysql-bin # 开启二进制日志,主库必须开启【可选】
而不是
log_bin=binlog日志存放位置
GTID的主库配置-/etc/my.cnf与从库配置文件都比binlog的多了两个字段:gtid_mode=ON
enforce_gtid_consistency=ON
GTID的数据库\e内容将binlog的两个字段和为一个字段:MASTER_LOG_FILE='当前binlog日志'
MASTER_LOG_POS='当前binlog里的位置'
变更为
MASYER_AUTO_POSITION=1