数据库主从复制
一、主从复制核心概念
定义:主从复制是一种数据库架构模式,允许一个 MySQL 数据库服务器(主库)将其数据变更自动复制到一个或多个其他 MySQL 服务器(从库)。
目的:
- 高可用:主库故障时,从库可接管服务
- 读写分离:主库处理写操作,从库处理读操作,分担负载
- 数据备份:从库作为实时备份
- 数据分析:在从库运行分析任务,避免影响主库性能
二、主从复制工作原理(理论核心)
MySQL 主从复制基于二进制日志(Binary Log)实现异步复制:
主库(Master)
- 开启二进制日志(
binlog) - 所有数据变更(增删改)会以“事件”形式记录到
binlog - 从库连接主库后,主库启动一个Binlog Dump 线程向从库发送
binlog内容
- 开启二进制日志(
从库(Slave)
- 开启中继日志(
relay log) - I/O 线程:连接主库,读取
binlog并写入本地relay log - SQL 线程:读取
relay log并重放其中的 SQL 事件,实现数据同步
- 开启中继日志(
关键点:
- 复制是异步的(默认),主库提交事务后立即返回,不等待从库确认
- 复制单位可以是语句(Statement-Based)或行(Row-Based),后者更可靠
三、OpenEuler 环境准备(运维实操)
1. 环境说明
- 操作系统:OpenEuler 22.03 LTS
- MySQL 版本:8.0.26(通过
dnf安装) - 服务器规划:
- 主库:192.168.1.100
- 从库:192.168.1.101
2. 安装 MySQL(主从库相同)
# 安装MySQL Server sudo dnf install mysql-server # 启动服务并设置开机自启 sudo systemctl start mysqld sudo systemctl enable mysqld # 获取初始密码(MySQL 8.0默认生成临时密码) sudo grep 'temporary password' /var/log/mysqld.log3. 安全初始化(主从库相同)
mysql_secure_installation # 根据提示设置root密码、移除测试库等四、主库配置(192.168.1.100)
1. 修改配置文件/etc/my.cnf
[mysqld] server-id = 1 # 唯一ID,主从不能重复 log-bin = mysql-bin # 开启二进制日志 binlog-format = ROW # 推荐使用ROW模式 expire_logs_days = 7 # 自动清理7天前的日志 max_binlog_size = 100M # 单个binlog文件大小 bind-address = 0.0.0.0 # 允许所有IP连接(生产环境建议限制)2. 重启 MySQL 服务
sudo systemctl restart mysqld3. 创建复制专用账户
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'StrongPass!123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101'; FLUSH PRIVILEGES;4. 锁定主库并获取状态信息
FLUSH TABLES WITH READ LOCK; -- 锁定所有表,禁止写入 SHOW MASTER STATUS; -- 记录File和Position值输出示例:
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 785 | | | +------------------+----------+--------------+------------------+5. 备份主库数据(可选,若从库无数据)
mysqldump -u root -p --all-databases --master-data > master_db.sql6. 解锁主库
UNLOCK TABLES;五、从库配置(192.168.1.101)
1. 修改配置文件/etc/my.cnf
[mysqld] server-id = 2 # 不同于主库 relay-log = mysql-relay # 中继日志名称 read_only = ON # 从库只读(避免误写)2. 重启 MySQL 服务
sudo systemctl restart mysqld3. 导入主库备份(若已备份)
mysql -u root -p < master_db.sql4. 配置复制链路
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='StrongPass!123', MASTER_LOG_FILE='mysql-bin.000003', -- 主库SHOW MASTER STATUS的值 MASTER_LOG_POS=785; START SLAVE; -- 启动复制5. 检查复制状态
SHOW SLAVE STATUS\G关键指标:
Slave_IO_Running: Yes(I/O线程正常)Slave_SQL_Running: Yes(SQL线程正常)Seconds_Behind_Master: 0(无延迟)
六、故障排查与运维技巧
1. 常见错误处理
- I/O 线程错误(如网络不通):
STOP SLAVE; CHANGE MASTER TO ...; -- 重新配置 START SLAVE; - SQL 线程错误(如主键冲突):
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; -- 跳过1个错误事件 START SLAVE;
2. 延迟监控
SHOW SLAVE STATUS\G # 关注 Seconds_Behind_Master3. 主从切换(Failover)
- 停止主库写入
- 提升从库为主库:
STOP SLAVE; RESET SLAVE; SET GLOBAL read_only=OFF; - 修改应用连接指向新主库
七、高级主题:GTID 复制(可选)
GTID(Global Transaction Identifier)简化了复制管理:
# 主从库均需配置 [mysqld] gtid_mode=ON enforce_gtid_consistency=ON配置命令:
CHANGE MASTER TO MASTER_AUTO_POSITION=1; -- 自动定位同步点八、总结
通过上述步骤,你已在 OpenEuler 系统上成功搭建 MySQL 主从复制环境。关键要点:
- 原理:基于 binlog 的异步复制
- 配置:
server-id、log-bin、relay-log - 运维:
SHOW SLAVE STATUS监控、GTID 进阶
附录:常用命令速查
-- 主库 SHOW MASTER STATUS; SHOW BINARY LOGS; -- 从库 SHOW SLAVE STATUS\G STOP SLAVE; START SLAVE; RESET SLAVE ALL; -- 彻底重置复制