Type 1 vs Type 2 Hypervisor:有什么区别?
2026-10-14
2026-10-14
2026-10-14
2026-10-14
保持服务器之间的数据一致性是 MySQL 管理员面临的常见挑战。无论你是要迁移到云端、扩展读取能力,还是设置灾难恢复,都需要一种可靠的方式将 MySQL 数据库同步到另一台服务器。
正确的方法取决于你的环境。一次性脚本可能适用于预发布环境,但生产系统通常需要持续、低延迟的复制。
本指南涵盖四种在两个 MySQL 数据库之间同步数据的实用方法,从命令行工具到原生复制和企业级同步解决方案。
正确的方法取决于目标、网络和数据量。以下是最常见的场景。
一次性迁移 完整传输且无持续链接,通常用于迁移到新服务器或云服务商。
只读副本和扩展 将读取查询分流到辅助服务器,使主服务器专注于写入。依赖同步或异步复制来保持更新。
实时分析和报表 将数据复制到单独的服务器,以便 BI 工具可以查询数据而不拖慢生产系统。
灾难恢复 保持备用数据库随时待命,以便在主服务器宕机时接管。

在开始同步前进行几项检查,可以节省大量后续排查时间。
port 3306 端口。SELECT VERSION(); 检查两个版本。从较旧版本复制到较新版本通常没问题,但反过来往往会导致兼容性错误。最佳方法取决于数据库大小、可接受的停机时间和管理员技能水平。下面快速比较这四种方法。
| 方法 | 同步类型 | 最佳使用场景 | 管理员工作量 |
|---|---|---|---|
| mysqldump | 一次性 | 小型迁移、本地备份、小型 schema | 低 |
| MySQL Workbench | 可视化手动同步 | Schema 比较、手动传输 | 低到中 |
| 原生复制 | 持续 | 高可用性、只读副本、生产扩展 | 高 |
| 企业级工具 | 持续 / 实时 | 跨区域、零停机、复杂网络拓扑 | 中到高 |
使用 mysqldump 导出 MySQL 数据库 是一次性迁移中移动数据的标准方式。这个命令行工具会将 schema 和数据导出为包含 SQL 语句的文件。由于它捕获的是静态快照,因此创建 dump 之后所做的任何更改都不会包含在内。
步骤 1. 导出源数据库
在源服务器上运行 mysqldump ,将数据库导出为 .sql 文件。对于 InnoDB 表,建议使用 --single-transaction 标志,以避免锁定正在使用的生产数据。
mysqldump -u root -p --single-transaction --databases my_database > db_dump.sql
步骤 2. 传输 dump 文件
使用安全的传输方式将导出的文件移动到目标服务器。 scp 或 rsync 都适合此操作。
scp db_dump.sql user@target_server_ip:/tmp/
步骤 3. 导入到目标服务器
登录目标服务器,使用 mysql 客户端加载 SQL 文件并重建数据库。
mysql -u root -p < /tmp/db_dump.sql
为慢速网络压缩大型 dump 文件
对于较大的数据库,在传输前压缩 dump 文件可以缩短传输时间。最简单的方法是将输出直接通过 gzip 管道处理:
mysqldump -u root -p --single-transaction --databases my_database | gzip > db_dump.sql.gz
在目标端,可以在单个管道中解压并导入,以节省本地磁盘空间:
gunzip < db_dump.sql.gz | mysql -u root -p
--compress 标志仅在 dump 过程中压缩客户端和服务器之间的流量。它不会缩小输出文件,并且从 MySQL 8.0.18 起已弃用。通过 gzip 管道处理是减小传输文件大小的更可靠方式。何时不要使用此方法
此方法不适合高流量、活跃的生产数据库,因为它无法提供持续更新。大型数据库可能需要数小时才能 dump 和恢复,这意味着迁移切换期间会有显著停机时间。需要持续同步或最小停机的团队应考虑复制。
MySQL Workbench 提供图形界面,无需编写命令行参数即可在两个 MySQL 数据库之间同步数据。其向导会引导你以可视化方式复制 schema 结构和行。此方法最适合较小的数据集和非生产系统。
步骤 1. 设置到两台服务器的连接
步骤 2. 导出源数据库
步骤 3. 导入到目标服务器
步骤 4. 比较并同步后续 schema 更改
ALTER 语句,然后对目标运行该脚本。Compare Schemas 本身只会生成只读差异报告。要生成并运行实际的同步脚本,请改用 Synchronize with Any Source 或 Synchronize Model。MySQL 复制是一项原生功能,可以持续将更改从源服务器流式传输到一个或多个副本服务器。它依赖二进制日志来跟踪更新,因此非常适合扩展读取、构建分析环境或设置灾难恢复。
前提条件 两台服务器都需要在 my.cnf 或 my.ini 文件中设置唯一的 server-id 。源服务器需要启用二进制日志,并且两端都需要通过 port 3306 进行网络访问。
步骤 1. 配置源服务器
/etc/my.cnf )。[mysqld] 块下,分配唯一的 server-id。log-bin 启用二进制日志。binlog_do_db 将复制限制到特定 schema。server-id = 1
log-bin = mysql-bin
binlog_do_db = my_database
保存文件并重启 MySQL 服务以应用更改。
步骤 2. 创建复制用户 登录源服务器,为副本创建专用账户。此用户只需要 REPLICATION SLAVE 权限来连接并读取二进制日志。
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongPassword123';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
步骤 3. 获取一致性快照并记录日志位置
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
mysqldump 导出数据库。UNLOCK TABLES;
步骤 4. 配置副本
CHANGE REPLICATION SOURCE TO 将副本指向源。CHANGE REPLICATION SOURCE TO
SOURCE_HOST = 'primary_server_ip',
SOURCE_USER = 'repl_user',
SOURCE_PASSWORD = 'StrongPassword123',
SOURCE_LOG_FILE = 'mysql-bin.000001',
SOURCE_LOG_POS = 154;
步骤 5. 启动复制并验证
START REPLICA;
SHOW REPLICA STATUS\G
Replica_IO_Running 和 Replica_SQL_Running 都显示 Yes。MySQL 8.0+ 语法与旧术语 MySQL 8.0.22 及更高版本在复制命令中替换了 master 和 slave 等术语。 CHANGE REPLICATION SOURCE TO 取代了 CHANGE MASTER TO, SHOW REPLICA STATUS 取代了 SHOW SLAVE STATUS。旧语法在当前版本中仍可向后兼容,但对于已升级的环境,现代命令是更安全的选择。
原生复制适用于简单的设置,但在跨云区域或异构数据库时可能会吃力,尤其是在高写入负载下。当你需要具有亚秒级 RPO 的零数据丢失同步,或用于合规的详细审计日志时,仅靠原生工具往往不够。
关键评估标准
像 i2Stream 这样的企业级工具如何解决这一问题
i2Stream 专为原生 MySQL 复制能力不足的场景而构建。

对于需要超越数据库复制的高可用性的团队, i2Availability 将类似的故障转移原则扩展到完整的应用环境。
同步设置往往会遇到一些反复出现的问题。以下是这些问题的原因以及各自的修复方法。
目标服务器无法跟上来自源的传入更改。这通常由单线程执行、高写入负载或目标端磁盘硬件较慢引起。
使用 replica_parallel_workers (在较旧版本上为 slave_parallel_workers )启用多线程复制,并使用 binlog_format = ROW 的行级日志,以便目标端可以更快地应用更改。
大多数批量脚本使用类似 updated_at 的时间戳列查询源,但被删除的行不会留下任何痕迹供脚本捕获。
改用带有 is_deleted 列的软删除,或定期运行全表比较以捕获孤立行。
如果源上添加或删除了列,而副本失去对齐,复制线程一旦遇到引用本地不存在列的查询就会停止。
先在副本上应用匹配的 schema 更改,或使用可避免锁表的在线 schema 迁移工具。
主动-主动设置可能会陷入循环,事务会在两台服务器之间无休止地来回反弹,因为它们无法区分自己的事务和已经接收过的事务。
为每台服务器分配唯一的 server-id 并启用 GTID(全局事务标识符),这样服务器就能识别并跳过已经处理过的事务。
Q1:我可以将 MySQL 同步到不同版本的 MySQL 吗?
在大多数情况下可以。从较旧版本复制到较新版本通常受支持,但从较新版本复制到较旧版本往往会导致兼容性错误。在设置同步之前,使用 SELECT VERSION(); 检查两个版本。
Q2:同步 MySQL 数据库会导致停机吗?
这取决于方法。 mysqldump 导出和导入可能会短暂锁表,并且对于大型数据集会使数据库离线。原生复制和企业级同步工具在后台持续运行,因此源数据库始终保持在线。
Q3:复制和同步有什么区别?
复制是持续且基于日志的,将近乎实时地将更改从源流式传输到一个或多个目标。同步是一个更广泛的术语,根据设置方式,它可以指一次性复制、计划批量作业或持续复制。
Q4:我可以只同步特定表而不是整个数据库吗?
可以。 mysqldump 支持导出单个表,原生复制可以使用 binlog_do_db 或 replicate-do-table 等过滤器限定到特定数据库或表。大多数企业级同步工具也支持表级过滤。
Q5:mysqldump 对生产数据库安全吗?
是的,在与 --single-transaction 一起使用时是安全的,它可以避免在 dump 期间锁定 InnoDB 表。它不会锁定 MyISAM 等非事务性表,也无法防止在 dump 进行期间运行 schema 更改(DDL)。对于非常大的生产数据库,原生复制或企业级工具造成的影响更小。
将 MySQL 数据库同步到另一台服务器,归根结底是根据目标选择方法。一次性的 mysqldump 适用于简单迁移,MySQL Workbench 适合较小的 GUI 驱动传输,原生复制处理持续同步和读扩展,而当需求变得更苛刻时,例如跨区域设置或接近零 RPO,企业级工具就会发挥作用。
无论哪种方法适合你的环境,在进行任何更改之前都要先进行完整备份。如果过程中出现复制延迟、schema 不匹配或其他同步问题,上面介绍的修复方法应该能帮助你回到正轨。
英方软件 为管理 MySQL 和其他数据库环境的团队提供更多类似的数据库保护和复制主题。
公告
邮件
销售