MySQL主从复制原理与配置指南

清欢
清欢
发布时间:2026-10-14| 5人浏览过
原创

MySQL 主从复制利用二进制日志(Binlog)实现数据异步同步,通过 I/O 线程接收事件、SQL 线程回放更新来保证数据一致性。本文详解其底层原理、状态监控及具体配置操作,适用于数据库灾备、读写分离等场景。

主从复制核心原理

MySQL 复制依赖于主服务器的二进制日志。主服务器记录所有更改数据的 SQL 语句(如 INSERT、UPDATE、DELETE),而每个从服务器从主服务器获取这些已记录的更新,并在本地执行相同的操作以维持数据镜像。

整个过程由三个关键线程驱动:

  1. Binlog Dump 线程(主):当从服务器连接时,主服务器创建此线程,读取二进制日志中的事件并发送至从服务器。
  2. I/O 线程(从):连接至主服务器,请求二进制日志事件,并将接收到的数据写入本地的中继日志(Relay Log)中。
  3. SQL 线程(从):读取中继日志中的事件,在本地重放这些操作,从而实现数据同步。

线程状态监控

在排查复制问题时,理解各线程的状态至关重要。可以通过 SHOW PROCESSLIST 或 SHOW SLAVE STATUS 进行观察。

第1步:检查主服务器 Binlog Dump 线程状态

  • Sending binlog event to slave:正在将事件发送给从服务器。
  • Finished reading one binlog; switching to next binlog:已读完当前日志文件,切换至下一个。
  • Has sent all binlog to slave; waiting for binlog to be updated:已发送所有已知更新,正等待新的写操作产生新事件。

第2步:检查从服务器 I/O 线程状态

  • Connecting to master:尝试建立连接。
  • Waiting for master to send event:连接成功,等待主服务器发送新事件。
  • Queueing master event to the relay log:已读取事件,正准备写入本地中继日志。
  • Waiting to reconnect after a failed master event read:读取失败进入重试等待状态。

第3步:检查从服务器 SQL 线程状态

  • Reading event from the relay log:正在从中继日志读取事件进行处理。
  • Has read all relay log; waiting for the slave I/O thread to update it:处理完现有日志,等待 I/O 线程写入新数据。

复制文件与存储管理

从服务器依赖中继日志(Relay Log)暂存接收的数据,并通过状态文件记录同步进度。常见的状态文件包括 master.info(I/O 线程使用,记录主库位置)和 relay-log.info(SQL 线程使用,记录回放位置)。

注意:master.info 文件的优先级高于配置文件 my.cnf 中的相关参数。若需修改主库连接信息,建议删除 master.info 后重启,或使用 CHANGE MASTER TO 命令直接更新。

配置主从复制步骤

第1步:创建专用复制用户

在主服务器上创建具有复制权限的用户,避免使用 root 账号以提高安全性。

GRANT REPLICATION SLAVE ON *.* TO 'rep'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

若需要使用 LOAD DATA FROM MASTER,还需授予 SUPER 和 RELOAD 权限。

第2步:数据迁移与快照

根据存储引擎不同,数据导出策略有所区别:

  • MyISAM 表:可临时加读锁后打包数据目录。务必排除 master.info、relay-log.info 及日志文件。
  • InnoDB 表:推荐使用 InnoDB Hot Backup 工具或在导出数据前执行 FLUSH TABLES WITH READ LOCK 并记录 SHOW MASTER STATUS 的输出(File 和 Position),以保证一致性。
  • 通用方法:使用 mysqldump --master-data 生成包含主库日志位置的 SQL 转储文件。

第3步:修改配置文件 (my.cnf)

主服务器必须开启二进制日志并设置唯一 ID:

[mysqld]
log_bin = mysql-bin
server_id = 1

从服务器只需设置唯一的 Server ID:

[mysqld]
server_id = 2
read_only = 1  # 防止误写从库

第4步:启动复制进程

在从服务器上,指向主服务器的日志文件和偏移量:

CHANGE MASTER TO
    MASTER_HOST='192.168.1.100',
    MASTER_USER='rep',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000007',
    MASTER_LOG_POS=1234;

START SLAVE;

启动后,通过以下命令检查同步状态:

SHOW SLAVE STATUS\G

关注 Slave_IO_Running 和 Slave_SQL_Running 是否均为 Yes,且 Seconds_Behind_Master 为正常延迟值。

第5步:角色切换(可选)

若需将从库提升为主库,需停止复制线程并重置日志:

STOP SLAVE;
RESET MASTER;

高级选项与排错

部分表复制控制

可通过命令行参数控制同步范围:

  • --replicate-do-db=db_name:仅复制指定数据库。
  • --replicate-ignore-table=db.tbl:忽略特定表的同步。

常见错误处理

  • 字符集不一致:主从服务器应使用相同的全局字符集和校对规则,否则可能导致键值冲突。
  • 版本差异:通常从高版本向低版本复制不支持,升级从库时应先关闭再升级。
  • 跳过错误:若遇到非致命错误导致复制中断,可使用 --slave-skip-errors=all 或 SET GLOBAL sql_slave_skip_counter=1; 强行跳过。

强一致性同步

为确保事务不丢失,可在主服务器配置 innodb_flush_log_at_trx_commit=1 和 sync-binlog=1,但这会增加磁盘 IO 开销。

以上就是 MySQL 主从复制原理及配置的详细内容,更多关于 MySQL 优化与维护的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。