物理拷贝比mysqldump快得多,因跳过sql解析、字符集转换、逐行插入和索引重建,直接复制二进制文件;tb级innodb库导入mysqldump需数小时至一天,物理拷贝仅几十分钟,前提为版本一致、innodb_file_per_table=on、全目录迁移及nvme适配参数调优。

为什么物理拷贝比 mysqldump 快得多
因为物理拷贝跳过了 SQL 解析、字符集转换、逐行插入和索引重建全过程,直接复制二进制数据文件。对 TB 级 InnoDB 数据库,mysqldump 导入可能耗时数小时甚至一整天,而物理拷贝通常只需几十分钟 —— 前提是源目标配置兼容、停机窗口允许。
必须确认的 4 个兼容性前提
物理迁移不是“复制粘贴”就能跑起来,以下四点任一不满足,启动 MySQL 时大概率报错或数据不可读:
-
innodb_file_per_table必须为ON(否则 ibdata1 无法单独处理) - 源和目标 MySQL 版本主版本号一致(如都是 8.0.x,不能从 5.7 直接拷到 8.0)
-
datadir路径下所有文件(包括ibdata1、ib_logfile*、mysql/、sys/、业务库目录)必须整体迁移,不能只拷业务库子目录 - 目标 NVMe 分区格式需为
xfs或ext4,且挂载选项含noatime,nobarrier(避免额外写放大)
停机后实际操作步骤(含权限与 SELinux 处理)
在源机器执行:
systemctl stop mysql rsync -av --delete /var/lib/mysql/ user@new-server:/mnt/nvme/mysql/
在新机器(已安装同版本 MySQL,但未启动)上:
- 确保
/mnt/nvme/mysql所有者为mysql:mysql:chown -R mysql:mysql /mnt/nvme/mysql - 若启用了 SELinux,需恢复上下文:
restorecon -Rv /mnt/nvme/mysql - 修改
/etc/my.cnf中的datadir=/mnt/nvme/mysql,并确认innodb_data_home_dir和innodb_log_group_home_dir指向同一路径 - 启动前先验证:
mysqld --initialize-insecure --datadir=/mnt/nvme/mysql不要执行 —— 这会清空数据;正确做法是直接systemctl start mysql,观察journalctl -u mysql -n 100是否报表空间或日志不匹配
迁移到 NVMe 后容易被忽略的性能陷阱
NVMe 本身快,但 MySQL 不一定自动受益。以下三点不调,NVMe 的 IOPS 和低延迟优势基本浪费:
-
innodb_io_capacity应设为 2000~4000(默认 200),否则 InnoDB 刷脏页太保守 -
innodb_flush_neighbors=0(NVMe 随机 IO 成本极低,关掉邻居页刷新) - 确保
innodb_redo_log_capacity≥ 1GB(大 redo log 减少 checkpoint 频率,适配高吞吐写入)
这些参数必须在首次启动前写入 /etc/my.cnf,运行中动态调整部分参数(如 innodb_io_capacity)虽可生效,但重启才能彻底释放 NVMe 性能潜力。











