介绍:主从同步是一种数据库复制技术,用于将主数据库(Master)中的数据实时或接近实时地复制到一个或多个从数据库(Slave)中 核心流程: 主库(Master) 记录所有数据变更到二进制日志(binlog) 从库(Slave) 通过 I/O 线程拉取主库的 binlog,写入本地中继日志(relay log) 从库的 SQL 线程 解析 relay log 并执行 SQL 操作,保持数据一致性 实现方式: 基于语句的复制(Statement - based Replication,SBR):主数据库将执行的 SQL 语句记录在二进制日志中,从数据库在复制时会重新执行这些语句来实现数据同步。
基于行的复制(Row - based Replication,RBR):主数据库会将每一行数据的更改记录在二进制日志中,从数据库根据这些记录来更新相应的行。
混合模式复制(Mixed - mode Replication):结合了基于语句和基于行的复制方式
mysql主从的应用场景: 读写分离:主库处理写操作,从库处理读请求 数据热备:主库故障时快速切换至从库 负载均衡:分散高并发查询压力
MySQL主从复制操作
- 服务器要求 角色 IP 示例 MySQL 版本 操作系统 主库 192.168.25.141 8+ CentOS 7.9 从库 192.168.25.139 8+ CentOS 7.9
环境注意事项: 主从库 MySQL 版本需一致 确保主从服务器网络互通(禁用防火墙或开放 3306 端口)
主库配置:
- 编辑主库配置文件
sudo vim /etc/my.cnf
在 [mysqld] 段添加以下参数
[mysqld]
server-id = 1 # 主库唯一标识
log-bin = /var/log/mysql/mysql-bin.log # 启用二进制日志
保存后重启 MySQL 服务: sudo systemctl restart mysqld
- 登录数据库修改密码,创建同步专用账号
-- 登录 MySQL 主库
mysql -u root -p
-- 创建同步专用账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'Password123!';
GRANT REPLICATION SLAVE ON . TO 'repl'@'%';
FLUSH PRIVILEGES;
select * from mysql.user where User='repl' \G; #查看账号权限
- 查看主库状态 --mysql 8.4版本前使用这条命令查看 show master status;
--MySQL 8.4版本后使用这条命令查看 SHOW BINARY LOG STATUS;
输出示例: mysql> SHOW BINARY LOG STATUS; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000013 | 158 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
记录 File 和 Position 值(用于从库配置)
从库配置
- 修改配置文件
-- 编辑从库配置文件
sudo vim /etc/my.cnf
--在 [mysqld] 段添加以下参数
[mysqld]
server-id = 2 # 从库唯一标识(需与主库不同)
relay-log = /var/log/mysql/relay-bin.log # 启用中继日志
read_only = 1 # 从库只读(防止误操作)
注意:这里的中继日志可能位置不同或者没有,可以去除该字段,否则在设置主库信息会报错
保存后重启 MySQL 服务 sudo systemctl restart mysqld
- 配置主从连接
-- 登录 MySQL 从库
mysql -u root -p
-- 设置主库信息(替换实际值)
-- MSQL 8.23前
CHANGE MASTER TO
MASTER_HOST = 'IP',
MASTER_USER = 'repl',
MASTER_PASSWORD = '密码',
MASTER_LOG_FILE = ' File',
MASTER_LOG_POS = Position;
--MSQL 8.23后
change replication source to
source_host='主库ip',
source_user='主库上复制用户',
source_password='主库上复制用户的密码',
source_port=3306,
source_log_file='mysql-bin.000002',
source_log_pos=Position,
source_ssl=1; #是否加密
-- 启动同步
start replica ; #8之后
start slave ; #8之前
- 同步设置完成之后 -- 查看状态,\G表示行转列,便于查看 show replica status\G ; #8.0.22之后 show slave status\G ; #8.0.22之前
主要检查的关键指标:
Slave_IO_Running: Yes(I/O 线程运行正常)
Slave_SQL_Running: Yes(SQL 线程运行正常)
若出现错误,查看 Last_IO_Error 或 Last_SQL_Error 字段
验证主从同步是否生效
创建数据库linux
同步成功
配置主从同步的过程中常见的故障和维护 问题 解决方案 主从连接失败 检查防火墙、主库账号权限 主从数据不一致 使用 pt-table-checksum 工具校验 同步延迟过高 优化慢查询,增加从库硬件资源
日常维护需要使用的命令
重置主从关系:
STOP SLAVE;
RESET SLAVE ALL;
跳过指定错误(谨慎使用):
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;