7.9 KiB
7.9 KiB
MySQL主从复制配置步骤(数据已一致场景)
📋 前置条件
✅ 数据已同步:两个数据库中的hzdyjs_xg数据库数据已经一致
✅ 网络互通:两台机器可以互相访问
✅ MySQL运行正常:两台机器的MySQL服务都在运行
🚀 配置步骤
第一步:在主库(67)配置主库
# 1. 进入部署脚本目录
cd /path/to/部署脚本/
# 2. 赋予执行权限
chmod +x setup-mysql-replication.sh
# 3. 执行主库配置脚本
./setup-mysql-replication.sh
脚本会自动完成以下操作:
- ✅ 配置主库的
/etc/my.cnf(添加binlog配置) - ✅ 重启MySQL服务
- ✅ 创建复制用户
repl@172.16.0.68 - ✅ 显示
SHOW MASTER STATUS的输出
⚠️ 重要:记录输出的binlog信息
脚本执行后会显示类似以下输出:
File: mysql-bin.000001
Position: 154
请记录这两个值:
MASTER_LOG_FILE:mysql-bin.000001MASTER_LOG_POS:154
第二步:在从库(68)配置从库
# 1. 进入部署脚本目录
cd /path/to/部署脚本/
# 2. 赋予执行权限(如果还没执行过)
chmod +x setup-mysql-replication.sh
# 3. 执行从库配置脚本
./setup-mysql-replication.sh
脚本会提示输入主库的binlog信息:
请输入主库的 MASTER_LOG_FILE 和 MASTER_LOG_POS:
MASTER_LOG_FILE: mysql-bin.000001
MASTER_LOG_POS: 154
输入第一步记录的值后,脚本会自动完成:
- ✅ 配置从库的
/etc/my.cnf(添加从库配置) - ✅ 重启MySQL服务
- ✅ 配置主从复制关系
- ✅ 启动从库复制
- ✅ 显示从库状态
第三步:验证主从复制状态
3.1 在从库检查复制状态
# 检查从库IO和SQL线程是否运行
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "slave_io_running\|slave_sql_running\|seconds_behind_master"
正常输出应该是:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
3.2 在主库检查连接
# 查看主库的连接信息
mysql -u root -p -e "SHOW PROCESSLIST;" | grep repl
应该能看到从库的连接。
3.3 测试数据同步
# 在主库插入测试数据
mysql -u root -p hzdyjs_xg -e "CREATE TABLE IF NOT EXISTS test_replication (id INT PRIMARY KEY, name VARCHAR(50));"
mysql -u root -p hzdyjs_xg -e "INSERT INTO test_replication VALUES (1, 'test');"
# 在从库查询测试数据
mysql -u root -p hzdyjs_xg -e "SELECT * FROM test_replication;"
# 如果能看到数据,说明主从复制正常
# 清理测试数据
mysql -u root -p hzdyjs_xg -e "DROP TABLE test_replication;"
🔧 手动配置方法(如果脚本执行失败)
主库手动配置
1. 编辑主库配置文件
# 编辑 /etc/my.cnf
vi /etc/my.cnf
添加以下配置:
[mysqld]
# 主从复制配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = hzdyjs_xg
expire_logs_days = 7
max_binlog_size = 500M
# 性能优化配置
sync_binlog = 0
binlog_cache_size = 2M
max_binlog_cache_size = 512M
2. 重启MySQL
systemctl restart mysqld
sleep 5
3. 创建复制用户
mysql -u root -p <<EOF
CREATE USER IF NOT EXISTS 'repl'@'172.16.0.68' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.0.68';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
EOF
记录输出的File和Position值。
从库手动配置
1. 编辑从库配置文件
# 编辑 /etc/my.cnf
vi /etc/my.cnf
添加以下配置:
[mysqld]
# 主从复制配置
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
replicate-do-db = hzdyjs_xg
2. 重启MySQL
systemctl restart mysqld
sleep 5
3. 配置主从复制
# 替换下面的值为主库的实际值
MASTER_LOG_FILE="mysql-bin.000001" # 从主库SHOW MASTER STATUS获取
MASTER_LOG_POS=154 # 从主库SHOW MASTER STATUS获取
mysql -u root -p <<EOF
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='172.16.0.67',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='$MASTER_LOG_FILE',
MASTER_LOG_POS=$MASTER_LOG_POS;
START SLAVE;
SHOW SLAVE STATUS\G
EOF
⚠️ 常见问题排查
问题1:从库IO线程未运行(Slave_IO_Running: No)
可能原因:
- 网络不通
- 复制用户密码错误
- 防火墙阻止连接
解决方法:
# 1. 检查网络连通性
ping 172.16.0.67
telnet 172.16.0.67 3306
# 2. 检查复制用户权限
mysql -u root -p -e "SELECT user, host FROM mysql.user WHERE user='repl';"
# 3. 检查防火墙
firewall-cmd --list-all | grep 3306
# 4. 查看详细错误信息
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i error
问题2:从库SQL线程未运行(Slave_SQL_Running: No)
可能原因:
- 数据不一致
- 主从binlog位置不匹配
- 从库有写操作(read-only未生效)
解决方法:
# 1. 查看具体错误
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "last_error\|last_sql_error"
# 2. 如果是因为数据不一致,可以跳过错误(谨慎使用)
mysql -u root -p -e "STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;"
# 3. 检查从库是否可写
mysql -u root -p -e "SHOW VARIABLES LIKE 'read_only';"
问题3:主从延迟较大(Seconds_Behind_Master > 0)
可能原因:
- 从库性能不足
- 网络延迟
- 主库写入压力大
解决方法:
# 1. 检查从库性能
top
iostat -x 1
# 2. 检查网络延迟
ping -c 10 172.16.0.67
# 3. 优化从库配置(增加缓冲)
# 在从库 /etc/my.cnf 中添加:
# relay_log_recovery = 1
# slave_parallel_workers = 4
问题4:binlog位置不匹配
解决方法:
# 1. 在主库获取当前binlog位置
mysql -u root -p -e "SHOW MASTER STATUS;"
# 2. 在从库重新配置
mysql -u root -p <<EOF
STOP SLAVE;
CHANGE MASTER TO
MASTER_LOG_FILE='新的File值',
MASTER_LOG_POS=新的Position值;
START SLAVE;
EOF
📊 主从复制监控命令
日常监控
# 查看从库状态摘要
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Log_File|Read_Master_Log_Pos"
# 查看主库binlog信息
mysql -u root -p -e "SHOW MASTER STATUS;"
# 查看从库延迟
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master"
性能监控
# 查看主库binlog写入情况
mysql -u root -p -e "SHOW VARIABLES LIKE 'binlog%';"
# 查看从库复制线程状态
mysql -u root -p -e "SHOW PROCESSLIST;" | grep -i slave
# 查看主库连接数
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
🔄 主从切换(故障转移)
如果需要将从库切换为主库:
# 1. 在从库停止复制
mysql -u root -p -e "STOP SLAVE;"
# 2. 取消只读模式
mysql -u root -p -e "SET GLOBAL read_only = OFF;"
# 3. 更新应用配置,指向新的主库IP
# 4. 原主库恢复后,可以重新配置为主从关系
📝 配置检查清单
配置完成后,请确认以下项目:
- 主库binlog已开启
- 从库relay-log已配置
- 复制用户已创建并授权
- 从库IO线程运行正常(Slave_IO_Running: Yes)
- 从库SQL线程运行正常(Slave_SQL_Running: Yes)
- 主从延迟为0(Seconds_Behind_Master: 0)
- 测试数据同步正常
- 防火墙规则已配置
- 监控脚本已配置
📚 相关文档
- 生产环境双机部署方案.md - 完整部署方案
- MySQL主从复制性能影响分析.md - 性能分析
- MySQL系统数据库说明.md - 系统数据库处理说明
- 部署脚本/setup-mysql-replication.sh - 自动化配置脚本
📝 文档版本: v1.0
🔄 最后更新: 2025-01-27