迁移前的准备工作(至关重要)
在执行任何操作之前,请务必完成以下准备工作,可以避免很多后续问题。

-
信息收集:
- 源服务器 (旧服务器):
- MySQL 版本 (
mysql --version) - 数据库名称
- 数据库用户名和密码(需要足够的权限,如
SELECT,LOCK TABLES,SHOW VIEW,EVENT,TRIGGER等) - 数据库存储位置(数据目录路径,如
/var/lib/mysql)
- MySQL 版本 (
- 目标服务器 (新服务器):
- 操作系统架构(必须与源服务器一致,x86_64 或 ARM)
- MySQL 版本(强烈建议与源服务器版本完全相同,至少是主版本号相同,8.0.x)
- 可用磁盘空间(必须大于源数据库的占用空间)
- 网络配置(确保新服务器可以从源服务器或应用服务器访问)
- 源服务器 (旧服务器):
-
规划停机时间:
- 根据你的业务需求,评估可以接受的停机窗口,对于核心业务,停机时间越短越好。
- 完全停机迁移:最简单,但停机时间最长。
- 在线迁移 (零停机):复杂,但可以实现业务无感切换。
-
创建备份:
- 在执行任何导出操作前,先对源数据库进行一次完整的备份,这是最后的保险。
mysqldump -u [user] -p[password] --all-databases > full_backup.sql
-
通知相关人员:
(图片来源网络,侵删)通知你的团队、运维和应用开发人员,数据库将在预定时间进行迁移,可能会有短暂的服务中断。
迁移方法详解
主要有三种主流方法,你可以根据你的数据量、业务复杂性和停机时间要求来选择。
使用 mysqldump 和 mysql 命令(最常用、最通用)
这是最经典和推荐的方法,适用于大多数场景,尤其是中小型数据库。
步骤 1:在源服务器上备份数据

使用 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.cnf或my.ini)是否与源服务器一致,特别是datadir设置。
步骤 4:启动 MySQL 服务
sudo systemctl start mysql
主从复制(在线迁移,零停机)
对于无法停机或数据量非常大的业务,可以使用主从复制来实现平滑迁移,原理是将旧服务器设为主库,新服务器设为从库,待数据同步完成后,再将业务切换到新服务器。
步骤 1:配置主服务器(旧服务器)
- 编辑 MySQL 配置文件
my.cnf,在[mysqld]部分添加:[mysqld] server-id = 1 log-bin = mysql-bin
- 重启 MySQL 服务。
- 创建一个用于复制的用户,并授予
REPLICATION SLAVE权限。CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_strong_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; FLUSH PRIVILEGES;
- 锁定主库的写入,并记录二进制日志文件名和位置。
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
记下结果中的
File(mysql-bin.000001) 和Position(154),不要解锁!
步骤 2:配置从服务器(新服务器)
- 编辑新服务器的
my.cnf,设置唯一的server-id。[mysqld] server-id = 2
- 重启 MySQL 服务。
- 执行
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 - 启动复制线程。
START REPLICA; -- 或者旧版 START SLAVE;
- 检查复制状态。
SHOW REPLICA STATUS\G;
查看
Slave_IO_Running和Slave_SQL_Running是否都为Yes,以及Seconds_Behind_Master是否为 0。
步骤 3:执行切换
- 当从服务器完全追上主服务器后(
Seconds_Behind_Master = 0),在主服务器上解锁。UNLOCK TABLES;
- 停止应用程序对旧数据库的写入。
- 在从服务器上停止复制。
STOP REPLICA;
- 将新服务器提升为主库(可选,如果希望新服务器继续作为主库)。
-- 在新服务器上执行 RESET MASTER;
- 修改应用程序的数据库连接配置,指向新服务器的 IP 地址。
- 重启应用程序,恢复服务。
- (可选)将旧服务器配置为新服务器的从库,以实现高可用。
迁移后的检查与收尾
- 权限验证:确保新服务器上的数据库用户和权限与旧服务器完全一致。
- 应用测试:让测试团队或相关业务人员对新环境进行全面的功能和性能测试。
- 监控:在新服务器上启用监控,密切关注 CPU、内存、磁盘 I/O 和 MySQL 的性能指标。
- 旧服务器处理:确认业务稳定运行一段时间后,可以将旧服务器下线或转为备用/测试服务器。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
mysqldump/mysql |
简单、安全、通用,能保证数据一致性 | 速度较慢,停机时间长(取决于数据量) | 绝大多数场景,尤其是中小型数据库 |
| 直接复制数据文件 | 速度极快 | 风险高,环境要求苛刻,需要停机 | 快速搭建测试/开发环境,环境完全一致 |
| 主从复制 | 零停机或短停机,可实现平滑切换 | 配置复杂,过程繁琐,需要专业知识 | 大型数据库,7x24小时在线业务,对停机时间要求高 |
对于绝大多数用户来说,强烈推荐使用方法一 (mysqldump),它是最稳妥、最可靠的方式,如果你的数据量达到 TB 级别,且业务无法停机,再考虑方法三(主从复制),请务必在测试环境中先演练一遍整个流程,然后再在生产环境中执行。
