必须停服清空再挂载,否则数据被遮蔽导致启动失败;正确顺序为停服务、备份、清空目录、用UUID写fstab、挂载后修正属主和SELinux上下文。

直接挂载 /var/lib/mysql 会丢数据,必须停服清空再挂
MySQL 运行时目录被占用,mount 强行覆盖会导致数据不可见;即使先 systemctl stop mysqld,若 /var/lib/mysql 下原有文件没清空,挂载后这些文件会被新文件系统遮蔽——重启 MySQL 就找不到 ibdata1、mysql 库等关键文件,直接启动失败。
正确顺序只能是:
- 停服务:
sudo systemctl stop mysqld(或mysql,依发行版而定) - 确认无残留进程:
sudo lsof +D /var/lib/mysql输出为空 - 备份原数据(强烈建议):
sudo cp -a /var/lib/mysql /var/lib/mysql.bak - 清空目录:
sudo rm -rf /var/lib/mysql/*(必须为空,否则挂载后不可见)
fstab 必须用 UUID,不能写 /dev/sdb1
设备名如 /dev/sdb1 在重启后可能漂移(比如变成 /dev/sdc1),导致挂错分区、覆盖其他数据,甚至 MySQL 启动时写入错误位置。
查 UUID 并写入 /etc/fstab:
- 运行
sudo blkid /dev/sdb1,拿到类似UUID="a1b2c3d4-..." TYPE="xfs"的输出 - 编辑
/etc/fstab,添加这一行:UUID=a1b2c3d4- /var/lib/mysql xfs defaults,noatime,usrquota,grpquota 0 2 -
noatime减少日志写入,对数据库 I/O 敏感;usrquota/grpquota为后续空间限制留接口;0 2表示不 fsck(XFS 不需要) - 测试配置:
sudo mount -a,无报错即生效
挂载后 MySQL 启不来?大概率是权限或 SELinux 没配
挂载完成不代表 MySQL 能访问。常见失败现象:日志里报 Permission denied,mysqld 进程起不来。
必须检查两项:
- 目录属主:
sudo chown -R mysql:mysql /var/lib/mysql(用户/组名以实际安装为准,如mysqld或root) - SELinux 上下文:
sudo restorecon -Rv /var/lib/mysql(CentOS/RHEL 必做;Ubuntu/Debian 若启用了 AppArmor,需额外放行路径,查sudo journalctl -u mysqld -n 50看拒绝日志)
宝塔面板用户别改配置文件里的 datadir,用「存储位置」切换
宝塔面板把 MySQL 数据默认放在 /www/server/data,但它封装了迁移逻辑。你手动改 my.cnf 里的 datadir,面板后续升级或操作可能覆盖配置,导致服务异常。
正确做法是:
- 在宝塔「软件商店 → MySQL → 设置 → 存储位置」里,选择已挂载好的独立磁盘路径(如
/mnt/data) - 面板会自动停服务、拷贝数据、更新配置、修正权限——比手敲命令更稳妥
- 注意:该路径必须已挂载且可写,
chown和restorecon仍需手动补做
最易被忽略的是:挂载点本身是否被 systemd 服务依赖项抢在 MySQL 前挂载。如果 /mnt/data 挂载慢于 mysqld.service 启动,MySQL 会读到空目录。加 RequiresMountsFor=/mnt/data 到 mysqld.service 单元文件里,才能真正可靠。


















