如何安全的完成一波儿数据库迁移?

如何安全的完成一波儿数据库迁移?
最新回答
梁小鬼

2026-10-29 23:39:53

安全的数据库迁移可通过停机全量同步(方案1)或在线逻辑导出(方案2)实现,需结合业务停机窗口、磁盘空间及数据一致性要求选择合适方案,并严格遵循操作步骤与验证流程。

方案1:停机全量同步(适合大容量数据且可停机场景)
  1. 停机准备

    停止数据库服务:通过 kill 命令终止所有 MySQL 线程,并检查日志确认无自启动。

    锁定服务状态:确保迁移期间无写入操作,避免数据不一致。

  2. 全量文件传输

    使用 scp -r 命令同步所有数据库文件(如 /var/lib/mysql)至新服务器。

    关键点:

    保持终端活跃(如设置 TMOUT=0 禁用超时),防止传输中断导致重传。

    传输完成后,通过 du -sh /var/lib/mysql 对比新旧服务器磁盘占用,确认数据完整性。

  3. 启动与验证

    在新服务器启动 MySQL 服务,检查错误日志(/var/log/mysql/error.log)确认无报错。

    执行基础查询(如 SHOW DATABASES;)验证数据可读性。

  4. 切换服务

    更新应用配置中的数据库 IP 地址,确保连接指向新服务器。

    在公司内部群同步迁移完成信息,明确新服务器的 IP 和端口变更。

适用场景:数据量极大(如 900GB)、旧服务器磁盘空间不足(无法导出 SQL 文件)、可接受停机(如非业务高峰期)。

方案2:在线逻辑导出(适合需零停机场景)
  1. 准备新数据库

    部署一台独立的新数据库服务器,确保版本与旧库兼容。

  2. 锁定旧库为只读

    执行 FLUSH TABLES WITH READ LOCK; 锁定所有表,防止写入导致导出数据不一致。

    通过 SHOW PROCESSLIST; 确认无活跃写入连接。

  3. 导出数据

    使用 mysqldump 导出全量数据:

    mysqldump -u root -p --all-databases --single-transaction > full_backup.sql

    --single-transaction 确保导出期间数据一致性(适用于 InnoDB)。

    若数据量极大,可分库导出以减少单文件大小。

  4. 传输与恢复

    通过 scp 将 full_backup.sql 传输至新服务器。

    在新服务器执行恢复:

    mysql -u root -p < full_backup.sql

    大文件恢复时,可添加 --verbose 参数监控进度。

  5. 验证与切换

    检查数据完整性:对比关键表的记录数(如 SELECT COUNT(*) FROM table_name;)。

    更新应用配置并同步迁移信息,流程同方案1。

适用场景:业务需零停机、旧服务器磁盘空间充足(可容纳导出文件)、数据量较小或可接受较长的导出时间。

关键注意事项
  1. 数据一致性保障

    方案1需严格停机,方案2依赖 mysqldump 的事务机制或 FLUSH TABLES WITH READ LOCK。

    避免在传输过程中操作数据库文件(如手动删除 .ibd 文件),否则需通过 innodb_force_recovery 参数强制恢复。

  2. 性能优化

    迁移后调整 MySQL 配置参数以提升性能:

    innodb_buffer_pool_size:设为物理内存的 50%-70%。

    max_connections:根据业务并发量调整(如 500-1000)。

    innodb_log_file_size:增大日志文件以减少磁盘 I/O(如 256M-2G)。

  3. 备份与回滚

    迁移前对旧数据库进行快照备份(如使用 xtrabackup 或 LVM 快照)。

    若新库启动失败,可快速回滚至旧服务器,减少业务中断时间。

工具推荐
  • xtrabackup:物理备份工具,支持热备份和增量备份,传输速度优于 scp,适合超大数据量场景。

    参考教程:

    xtrabackup 备份与恢复
    。

通过合理选择方案、严格操作流程及充分验证,可实现数据库迁移的安全性与高效性。