在日常的服务器优化中,将 MySQL 的数据目录从机械硬盘(HDD)迁移到固态硬盘(SSD),是提升数据库读写性能的常见操作。本文将详细介绍在 Docker 环境中,如何安全、无缝地完成此迁移,并逐步解释每个 Shell 命令的作用与参数含义,帮助你更好地理解每一个操作步骤。
🛑 步骤 1:停止 MySQL 容器
在迁移数据前必须确保 MySQL 服务处于停止状态,以防止数据写入冲突或损坏。
bash
docker stop mysql
docker stop mysql:停止名为mysql的容器,确保数据库不再进行读写操作。
🧰 步骤 2:安装 rsync 工具
rsync 是一个高效、可靠的数据复制工具,支持校验同步、保留权限等特性,适合做数据迁移。
bash
yum install -y rsync
yum:CentOS 系列 Linux 使用的包管理工具。install -y:自动确认安装,跳过人工输入yes。rsync:安装用于高效同步文件的工具。
📦 步骤 3:备份原有 MySQL 数据目录
在任何迁移操作前,请务必备份,防止操作失误导致的数据丢失。
bash
cp -a /data/configs/mysql/data/ /data/configs/mysql/data.bak/
cp:复制命令。-a:归档模式,等同于-dpR,可以递归复制并保留文件属性(包括符号链接、权限、时间戳等)。
🚀 步骤 4:使用 rsync 同步数据到固态硬盘
将数据目录迁移到 SSD 路径(此处以 /root/mysql/ 为例),可以使用 rsync 进行可靠复制。
bash
rsync -ahX --progress --checksum /data/configs/mysql/data/ /root/mysql/
参数说明:
-a:归档模式,保留文件属性和目录结构。-h:人类可读格式显示文件大小(如 MB、GB)。-X:保留扩展属性(如 ACL、SELinux 标签),对于某些 Linux 权限设置非常关键。--progress:显示复制过程中的详细进度。--checksum:通过校验和方式对比源文件与目标文件,确保一致性,即使时间戳不同也能识别修改。
🔍 步骤 5:验证数据一致性
通过 diff 工具,对比源目录与目标目录,确保迁移后的数据完全一致。
bash
diff -rq /data/configs/mysql/data/ /root/mysql/
参数说明:
-r:递归比较所有子目录。-q:仅报告文件是否不同,不显示详细差异。
如果没有任何输出,说明两个目录完全一致。
🧹 步骤 6:删除旧数据目录
确认数据迁移无误后,可删除旧的 MySQL 数据目录以释放空间。
bash
rm -rf /data/configs/mysql/data/
参数说明:
-r:递归删除目录及其内容。-f:强制删除,不提示确认。
⚠️ 注意:此操作不可逆,请确保备份有效、数据验证成功!
🔗 步骤 7:创建软链接至新目录
为了避免修改 Docker Compose 或 MySQL 配置文件,可以通过软链接将新目录映射回原路径。
bash
ln -s /root/mysql/ /data/configs/mysql/data/
参数说明:
ln:创建链接。-s:表示创建符号链接(软链接),非真实复制,指向新位置。
这样原有路径下的 MySQL 容器将仍能正常读取数据,而实际访问的是 SSD 上的新目录。
此处需确保/data/configs/mysql/data/ 最底层data目录不存在,如果已经存在data目录,软链接会直接链接为/root/mysql/->/data/configs/mysql/data/mysql 会导致多建了一个mysql目录,导致错误
🔁 步骤 8:再次验证软链接和数据一致性
确认软链接是否正确建立,并再次验证数据完整性。
bash
ll /data/configs/mysql/
diff -rq /data/configs/mysql/data/ /root/mysql/
ll:列出详细目录信息,确认软链接状态(如果ll无法使用,请用ls -l)。diff:再次确认目录数据一致。
✅ 步骤 9:重启 MySQL 服务
确认无误后,重启容器,数据库即正式运行在固态硬盘上。
bash
docker start mysql
docker start:启动指定容器。
🏁 总结
通过软链接技术,我们在不修改任何 MySQL 配置的前提下,将数据库的数据读写路径成功迁移到了 SSD 上,大大提升了 I/O 性能。这种方法操作简单、风险可控,非常适合生产环境中执行。