凌峰创科服务平台

MySQL数据库如何跨服务器迁移?

迁移前的准备工作(至关重要)

在执行任何操作之前,请务必完成以下准备工作,可以避免很多后续问题。

MySQL数据库如何跨服务器迁移?-图1
(图片来源网络,侵删)
  1. 信息收集

    • 源服务器 (旧服务器):
      • MySQL 版本 (mysql --version)
      • 数据库名称
      • 数据库用户名和密码(需要足够的权限,如 SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER 等)
      • 数据库存储位置(数据目录路径,如 /var/lib/mysql
    • 目标服务器 (新服务器):
      • 操作系统架构(必须与源服务器一致,x86_64 或 ARM)
      • MySQL 版本(强烈建议与源服务器版本完全相同,至少是主版本号相同,8.0.x)
      • 可用磁盘空间(必须大于源数据库的占用空间)
      • 网络配置(确保新服务器可以从源服务器或应用服务器访问)
  2. 规划停机时间

    • 根据你的业务需求,评估可以接受的停机窗口,对于核心业务,停机时间越短越好。
    • 完全停机迁移:最简单,但停机时间最长。
    • 在线迁移 (零停机):复杂,但可以实现业务无感切换。
  3. 创建备份

    • 在执行任何导出操作前,先对源数据库进行一次完整的备份,这是最后的保险。
    • mysqldump -u [user] -p[password] --all-databases > full_backup.sql
  4. 通知相关人员

    MySQL数据库如何跨服务器迁移?-图2
    (图片来源网络,侵删)

    通知你的团队、运维和应用开发人员,数据库将在预定时间进行迁移,可能会有短暂的服务中断。


迁移方法详解

主要有三种主流方法,你可以根据你的数据量、业务复杂性和停机时间要求来选择。

使用 mysqldumpmysql 命令(最常用、最通用)

这是最经典和推荐的方法,适用于大多数场景,尤其是中小型数据库。

步骤 1:在源服务器上备份数据

MySQL数据库如何跨服务器迁移?-图3
(图片来源网络,侵删)

使用 mysqldump 导出数据库。关键点: 为了保证数据一致性,最好在导出时锁定表。

# 备份单个数据库
mysqldump -u [username] -p[password] --single-transaction --routines --triggers --events [database_name] > [database_name]_$(date +%Y%m%d_%H%M%S).sql
# 备份所有数据库(推荐)
mysqldump -u [username] -p[password] --all-databases --single-transaction --routines --triggers --events > all_databases_$(date +%Y%m%d_%H%M%S).sql

参数解释:

  • -u [username]: 数据库用户名。
  • -p[password]: 密码,注意 -p 和密码之间没有空格,为了安全,也可以只写 -p,然后回车输入密码。
  • --single-transaction: 对于 InnoDB 表,此选项会创建一个一致性快照,而无需锁定表,强烈推荐
  • --routines: 导出存储函数和存储过程。
  • --triggers: 导出触发器。
  • --events: 导出事件调度器中的事件。
  • --all-databases: 导出所有数据库。

步骤 2:将备份文件传输到新服务器

使用 scp (secure copy) 或其他工具(如 rsync, SFTP)将上一步生成的 .sql 文件复制到新服务器。

# 使用 scp
scp [database_name]_YYYYMMDD_HHMMSS.sql [new_server_user]@[new_server_ip]:/path/to/backup/

步骤 3:在新服务器上恢复数据

登录到新服务器的 MySQL,然后执行导入。

# 登录到 MySQL
mysql -u [root_user] -p
# 在 MySQL 命令行中执行
source /path/to/backup/[database_name]_YYYYMMDD_HHMMSS.sql;
# 或者直接在 shell 命令行中导入(推荐,更方便)
mysql -u [root_user] -p < /path/to/backup/[database_name]_YYYYMMDD_HHMMSS.sql

步骤 4:验证数据

在新服务器上连接数据库,检查表、数据、用户和权限是否都已正确恢复。

-- 查看所有数据库
SHOW DATABASES;
-- 切换到目标数据库
USE [database_name];
-- 查看表是否存在
SHOW TABLES;
-- 查看几条数据
SELECT * FROM [table_name] LIMIT 10;

直接复制数据文件(物理备份,速度快,风险高)

这种方法直接复制 MySQL 的数据文件(如 .ibd, .MYD 文件),速度非常快,几乎等同于复制文件,但风险极高,不推荐在生产环境中随意使用。

适用场景

  • 环境完全相同(MySQL 版本、操作系统、架构)。
  • 数据库是静态的,没有写入操作。
  • 用于快速搭建一个测试或开发环境。

步骤 1:在源服务器上停止 MySQL 服务

这是必须的一步,否则数据文件可能不一致,导致损坏。

sudo systemctl stop mysql
# 或者
sudo /etc/init.d/mysql stop

步骤 2:复制数据目录

将整个 MySQL 数据目录复制到新服务器,数据目录的位置通常是 /var/lib/mysql

# 使用 tar 和管道通过 scp 传输(推荐,可以压缩)
sudo tar -czf - -C /var/lib . | ssh [new_server_user]@[new_server_ip] "sudo tar -xzf - -C /var/lib"
# 或者使用 rsync
sudo rsync -avz /var/lib/mysql/ [new_server_user]@[new_server_ip]:/var/lib/mysql/

步骤 3:在新服务器上设置权限和配置

  • 确保新服务器的 mysql 用户和组对数据目录有正确的所有权。
    sudo chown -R mysql:mysql /var/lib/mysql
  • 检查新服务器的 MySQL 配置文件(my.cnfmy.ini)是否与源服务器一致,特别是 datadir 设置。

步骤 4:启动 MySQL 服务

sudo systemctl start mysql

主从复制(在线迁移,零停机)

对于无法停机或数据量非常大的业务,可以使用主从复制来实现平滑迁移,原理是将旧服务器设为主库,新服务器设为从库,待数据同步完成后,再将业务切换到新服务器。

步骤 1:配置主服务器(旧服务器)

  1. 编辑 MySQL 配置文件 my.cnf,在 [mysqld] 部分添加:
    [mysqld]
    server-id = 1
    log-bin = mysql-bin
  2. 重启 MySQL 服务。
  3. 创建一个用于复制的用户,并授予 REPLICATION SLAVE 权限。
    CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_strong_password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
    FLUSH PRIVILEGES;
  4. 锁定主库的写入,并记录二进制日志文件名和位置。
    FLUSH TABLES WITH READ LOCK;
    SHOW MASTER STATUS;

    记下结果中的 File (mysql-bin.000001) 和 Position (154),不要解锁!

步骤 2:配置从服务器(新服务器)

  1. 编辑新服务器的 my.cnf,设置唯一的 server-id
    [mysqld]
    server-id = 2
  2. 重启 MySQL 服务。
  3. 执行 CHANGE REPLICATION SOURCE TO 命令(MySQL 8.0.23+ 语法)或 CHANGE MASTER TO(旧版语法)。
    -- MySQL 8.0.23+
    CHANGE REPLICATION SOURCE TO
        SOURCE_HOST='[master_server_ip]',
        SOURCE_USER='repl_user',
        SOURCE_PASSWORD='your_strong_password',
        SOURCE_LOG_FILE='mysql-bin.000001', -- 步骤1中记录的File
        SOURCE_LOG_POS=154;                 -- 步骤1中记录的Position
  4. 启动复制线程。
    START REPLICA;
    -- 或者旧版
    START SLAVE;
  5. 检查复制状态。
    SHOW REPLICA STATUS\G;

    查看 Slave_IO_RunningSlave_SQL_Running 是否都为 Yes,以及 Seconds_Behind_Master 是否为 0。

步骤 3:执行切换

  1. 当从服务器完全追上主服务器后(Seconds_Behind_Master = 0),在主服务器上解锁。
    UNLOCK TABLES;
  2. 停止应用程序对旧数据库的写入。
  3. 在从服务器上停止复制。
    STOP REPLICA;
  4. 将新服务器提升为主库(可选,如果希望新服务器继续作为主库)。
    -- 在新服务器上执行
    RESET MASTER;
  5. 修改应用程序的数据库连接配置,指向新服务器的 IP 地址。
  6. 重启应用程序,恢复服务。
  7. (可选)将旧服务器配置为新服务器的从库,以实现高可用。

迁移后的检查与收尾

  1. 权限验证:确保新服务器上的数据库用户和权限与旧服务器完全一致。
  2. 应用测试:让测试团队或相关业务人员对新环境进行全面的功能和性能测试。
  3. 监控:在新服务器上启用监控,密切关注 CPU、内存、磁盘 I/O 和 MySQL 的性能指标。
  4. 旧服务器处理:确认业务稳定运行一段时间后,可以将旧服务器下线或转为备用/测试服务器。

总结与建议

方法 优点 缺点 适用场景
mysqldump/mysql 简单、安全、通用,能保证数据一致性 速度较慢,停机时间长(取决于数据量) 绝大多数场景,尤其是中小型数据库
直接复制数据文件 速度极快 风险高,环境要求苛刻,需要停机 快速搭建测试/开发环境,环境完全一致
主从复制 零停机或短停机,可实现平滑切换 配置复杂,过程繁琐,需要专业知识 大型数据库,7x24小时在线业务,对停机时间要求高

对于绝大多数用户来说,强烈推荐使用方法一 (mysqldump),它是最稳妥、最可靠的方式,如果你的数据量达到 TB 级别,且业务无法停机,再考虑方法三(主从复制),请务必在测试环境中先演练一遍整个流程,然后再在生产环境中执行。

分享:
扫描分享到社交APP
上一篇
下一篇