Files
hzdyjs/docs/部署文档/生产环境双机部署方案/MySQL主从复制配置步骤.md
T
2025-11-27 00:02:01 +08:00

7.9 KiB
Raw Blame History

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.000001
  • MASTER_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)
  • 测试数据同步正常
  • 防火墙规则已配置
  • 监控脚本已配置

📚 相关文档


📝 文档版本: v1.0
🔄 最后更新: 2025-01-27