MySQL Replication

MySQL 主从复制是一种常见的高可用和读写分离解决方案,下面将详细介绍搭建步骤:

1 准备工作

1.1 环境要求

  • 两台或以上 MySQL 服务器(主库和从库)

  • 相同或兼容的 MySQL 版本(建议主从版本一致)

  • 确保网络连通性

  • 足够的磁盘空间

1.2 服务器规划

角色
主机名/IP
端口
说明

主库

master.example.com

3306

写入操作的主要服务器

从库

slave1.example.com

3306

读取操作或备份的服务器

2 主库配置

2.1 修改主库配置文件 (my.cnf/my.ini)

[mysqld]
server-id = 1               # 唯一ID,主库通常为1
log_bin = mysql-bin         # 启用二进制日志
binlog_format = ROW         # 推荐使用ROW格式
binlog_do_db = your_database # 可选:指定要复制的数据库
expire_logs_days = 10       # 二进制日志保留天数
sync_binlog = 1             # 每次事务提交都写入磁盘

2.2 重启 MySQL 服务

2.3 创建复制用户

2.4 获取主库状态

记录输出结果(File 和 Position 值),例如:

2.5 解锁表(可选,如果需要继续写入)

3 从库配置

3.1 修改从库配置文件 (my.cnf/my.ini)

3.2 重启 MySQL 服务

3.3 配置复制

3.4 启动复制

3.5 检查复制状态

关键检查项:

  • Slave_IO_Running: Yes

  • Slave_SQL_Running: Yes

  • Seconds_Behind_Master: 0(或较小值)

Slave_IO_Running: Yes #这个是I/O线程状态,I/O线程负责从从库到主库读取binlog日志,并写入从库的中继日志,状态为Yes表示I/O线程工作正常

Slave_SQL_Running: Yes #这个是SQL线程状态,SQL线程负责读取中继日志(relay-log)中的数据并转换为SQL语句应用到从数据库中,状态为YES表示I/O线程工作正常


执行 stop slave 时:

Slave_IO_Running 和 Slave_SQL_Running 均会变为 No


可以仅停止其中的一个线程:

STOP SLAVE IO_THREAD;

STOP SLAVE SQL_THREAD;

4 验证复制

4.1 在主库创建测试数据

4.2 在从库检查数据

5 常见问题处理

5.1 复制错误处理

  • 查看错误日志:SHOW SLAVE STATUS\G 中的 Last_Error

  • 常见错误及解决:

    • 主键冲突:跳过错误事务(不推荐长期使用)

    • 网络中断:检查网络后自动恢复

    • 数据不一致:可能需要重新同步

5.2 跳过错误事务(谨慎使用)

5.3 重新同步数据

如果复制差异过大,可能需要:

  1. 停止从库复制

  2. 备份主库数据并恢复到从库

  3. 重新配置复制(使用新的主库状态)

5.4 主库状态检查

5.4.1 show master status;

5.4.2 show slave status;

常态下主库查询 slave status 应该返回空

5.4.3 select @@read_only;

  • 返回值为 0(或 OFF)表示非只读模式

  • 返回值为 1(或 ON)表示只读模式

6 高级配置(可选)

6.1 GTID 复制(MySQL 5.6+)

6.2 半同步复制(提高数据安全性)

6.3 多源复制(一个从库复制多个主库)

7 维护建议

  1. 定期监控复制延迟

  2. 定期检查主从数据一致性

  3. 考虑使用工具如 pt-table-checksum 和 pt-table-sync 进行数据校验和修复

  4. 制定故障切换预案

通过以上步骤,您可以成功搭建 MySQL 主从复制环境。根据实际需求,您还可以进一步配置过滤规则、优化复制性能或实现更复杂的高可用架构。

Last updated