应执行mysql -e "show variables like 'datadir';"确认真实datadir路径,并用df -h和iostat -x 1检查磁盘空间与io瓶颈,再按flush tables、记录binlog位点、mysqladmin shutdown顺序停库,最后rsync迁移并校验权限与selinux上下文。

确认当前 datadir 和磁盘 IO 状况
别凭经验猜路径,datadir 可能早被改过。直接执行:mysql -e "SHOW VARIABLES LIKE 'datadir';",看输出的 Value 字段——这才是 MySQL 实际读取的位置。
同时检查磁盘压力:df -h /var/lib/mysql 看空间是否真吃紧;iostat -x 1 观察 %util 和 await,如果长期 >90% 或 >20ms,说明是 I/O 瓶颈,迁 SSD 才有意义。
还要确认是否用了 LVM/RAID,这会影响后续挂载策略和故障恢复方式。
停库前必须执行的三项关键操作
跳过任何一步,都可能导致启动失败或元数据损坏:
-
FLUSH TABLES WITH READ LOCK;(仅主库需同步时用),再SHOW MASTER STATUS;记下File和Position - 用
mysqladmin shutdown安全关闭,严禁kill -9—— 否则ib_logfile可能不完整,重启触发崩溃恢复失败 - 备份原权限与 SELinux 上下文:
ls -ldZ /var/lib/mysql,迁移后权限/上下文错一个,常见报错是Can't open the mysql.plugin table或 mysqld 静默退出
挂载 SSD 并 rsync 迁移数据的实操要点
新盘建议格式化为 xfs(RHEL/CentOS)或 ext4(带 noatime,nobarrier),避免 btrfs/zfs(除非你调优过事务日志刷盘)。
挂载时加参数:noatime,errors=remount-ro,并用 mount | grep mysql 确认没出现 relatime 或 defaults。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
拷贝必须用 rsync,且注意末尾斜杠:
rsync -avP --delete-after /var/lib/mysql/ /mnt/ssd/mysql/
少一个 / 就会嵌套成 /mnt/ssd/mysql/mysql/。拷完立刻执行:
chown -R mysql:mysql /mnt/ssd/mysql-
restorecon -Rv /mnt/ssd/mysql(SELinux 环境下必须,否则启动报错)
修改配置、验证启动是否真正成功
只改 datadir 不够,还得同步检查:
-
socket路径(如果也挪了) -
pid-file是否仍指向旧路径 -
log-error是否还写在原datadir下(否则你看不到错误日志)
启动后别急着连业务,先查日志:tail -f /mnt/ssd/mysql/mysqld.err;再进库跑:SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema'); —— 如果报错或结果异常,说明表空间元数据或权限没对齐。
最容易被忽略的是 I/O 调度器:SSD 应设为 none 或 kyber,别留默认的 cfq 或 deadline,否则性能打折扣。










