MySQL 数据库复制是构建高可用、可扩展数据库架构的核心技术,通过将主数据库(Master)的数据变更实时或异步同步到从数据库(Slave),实现数据冗余、读写分离和负载均衡,以下是 MySQL 复制相关的核心命令及操作流程,涵盖主从配置、监控和维护等关键环节。

主从复制基础配置命令
主服务器(Master)配置
首先需在主服务器启用二进制日志(binlog),这是复制的核心数据源,编辑 MySQL 配置文件(my.cnf
或 my.ini
),添加以下参数:
[mysqld] server-id = 1 # 唯一标识,主从服务器不能相同 log-bin = mysql-bin # 启用二进制日志,指定日志前缀 binlog-format = ROW # 推荐使用 ROW 模式,记录行级变更,避免主从数据不一致 expire_logs_days = 7 # 二进制日志保留天数,避免日志占满磁盘
配置完成后,重启 MySQL 服务,并执行以下命令创建复制专用用户(需授予 REPLICATION SLAVE 权限):
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; FLUSH PRIVILEGES;
查看主服务器当前二进制日志文件名和位置(后续从服务器需连接至此):
SHOW MASTER STATUS;
返回结果示例: | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | |------------------|----------|--------------|------------------| | mysql-bin.000003 | 107 | | |

从服务器(Slave)配置
从服务器需配置唯一 server-id
,并确保禁用二进制日志(若仅需作为从节点):
[mysqld] server-id = 2 # 与主服务器不同 relay-log = relay-bin # 中继日志文件,用于存储主服务器同步的 SQL 语句 read-only = 1 # 设置为只读(可选,避免误写操作)
重启 MySQL 后,执行 CHANGE REPLICATION
命令连接主服务器:
CHANGE REPLICATION SOURCE TO SOURCE_HOST = '主服务器IP', SOURCE_USER = 'repl_user', SOURCE_PASSWORD = 'password', SOURCE_LOG_FILE = 'mysql-bin.000003', -- 从 SHOW MASTER STATUS 获取 SOURCE_LOG_POS = 107; -- 从 SHOW MASTER STATUS 获取
启动复制线程:
START REPLICA;
复制状态监控与管理命令
查看复制状态
-
检查主从连接状态:
(图片来源网络,侵删)SHOW REPLICA STATUS\G;
关键字段说明:
Source_Log_File
:当前读取的主服务器二进制日志文件Exec_Log_Pos
:从服务器中继日志执行位置Replica_IO_Running
:I/O 线程状态(需为 Yes)Replica_SQL_Running
:SQL 线程状态(需为 Yes)Seconds_Behind_Master
:主从延迟(0 表示无延迟)
-
查看主服务器二进制日志状态:
SHOW MASTER LOGS;
返回所有二进制日志文件列表,可用于清理旧日志或手动同步。
复制线程管理
- 暂停复制:
STOP REPLICA; -- 停止所有线程(I/O 和 SQL) STOP REPLICA IO_THREAD; -- 仅暂停 I/O 线程 STOP REPLICA SQL_THREAD; -- 仅暂停 SQL 线程
- 恢复复制:
START REPLICA;
- 重置复制(危险操作,会清除复制状态):
STOP REPLICA; RESET REPLICA ALL; -- 清除 `CHANGE REPLICATION SOURCE TO` 配置 RESET MASTER; -- 主服务器:清除所有二进制日志
复制故障处理命令
主从数据不一致修复
若因网络或误操作导致主从数据不一致,可通过以下步骤修复:
- 锁定主服务器,禁止写入:
FLUSH TABLES WITH READ LOCK;
- 记录主服务器当前二进制日志位置:
SHOW MASTER STATUS;
- 备份数据并传输到从服务器:
# 主服务器导出数据 mysqldump -u root -p --all-databases --master-data=2 > backup.sql # 从服务器导入数据 mysql -u root -p < backup.sql
- 从服务器重新指向主服务器:
STOP REPLICA; CHANGE REPLICATION SOURCE TO SOURCE_LOG_POS='新位置'; START REPLICA;
- 主服务器解锁:
UNLOCK TABLES;
跳过错误事件
若从服务器 SQL 线程执行失败(如主从数据冲突),可跳过错误继续同步:
STOP REPLICA; SET GLOBAL sql_slave_skip_counter = 1; -- 跳过 1 个错误事件 START REPLICA;
相关问答FAQs
Q1:如何判断 MySQL 主从复制是否延迟?
A:可通过以下方式监控延迟:
- 执行
SHOW REPLICA STATUS\G;
查看Seconds_Behind_Master
字段,值为 0 表示无延迟,数值越大延迟越高。 - 在主服务器上插入时间戳标记,然后在从服务器查询该时间戳的执行状态,对比时间差。
- 使用
pt-heartbeat
(Percona 工具)持续监控延迟,该工具通过专用表记录时间戳,更精准。
Q2:主从复制中,主服务器宕机后如何快速切换为新的主服务器?
A:需执行主从切换操作(以原从服务器 2 为新主为例):
- 原主服务器恢复后配置为从服务器:
- 原主服务器停止复制,导出数据并导入新主服务器(确保数据一致)。
- 执行
CHANGE REPLICATION SOURCE TO
指向新主服务器,启动复制。
- 其他从服务器(如从服务器 3)切换到新主服务器:
- 停止复制,执行
CHANGE REPLICATION SOURCE TO
更新新主服务器信息,启动复制。
- 停止复制,执行
- 验证同步状态:通过
SHOW REPLICA STATUS
确认所有从服务器与新主服务器同步正常。
注:切换前需确保新主服务器数据最新,可通过pt-table-checksum
工具校验数据一致性。