MySQL启动时仅识别my.cnf中配置的datadir,需先停服务、挂载新硬盘并修改配置文件中的datadir路径,再用rsync同步数据并修正属主和SELinux/AppArmor策略,最后更新socket与pid路径后启动验证。

修改 my.cnf 中的 datadir 指向新硬盘路径
MySQL 启动时只认配置里写的 datadir,改路径第一步就是让它“知道”新位置在哪。别直接改启动脚本或用命令行参数覆盖,那样重启就失效。
实操建议:
- 先停掉 MySQL:
sudo systemctl stop mysql(Ubuntu/Debian)或sudo systemctl stop mysqld(CentOS/RHEL) - 确认新硬盘已挂载且有写权限,比如挂载在
/mnt/mysql-data - 编辑主配置文件:
sudo nano /etc/mysql/my.cnf(Debian系)或/etc/my.cnf(RHEL系),在[mysqld]段下添加或修改:datadir = /mnt/mysql-data
- 注意:不要删掉原有
datadir行再写新行,避免注释残留导致读取失败;确保路径末尾不带斜杠
把原数据完整拷贝到新路径并保留权限
直接 mv 有风险——如果中途出错或权限不对,MySQL 启不来,又没备份,就只能干瞪眼。拷贝才是稳妥做法,但必须保留属主、权限和 SELinux 上下文(若启用)。
常见错误现象:MySQL 启动报错 Can't open the mysql.plugin table. Please run mysql_upgrade 或直接拒绝启动,大概率是文件属主不对或缺失 ibdata1。
实操建议:
- 用
rsync完整同步(比cp -a更可靠):sudo rsync -avh --progress /var/lib/mysql/ /mnt/mysql-data/
- 同步完立刻修正属主:
sudo chown -R mysql:mysql /mnt/mysql-data - 如果是 CentOS/RHEL 且启用了 SELinux,还得恢复上下文:
sudo restorecon -Rv /mnt/mysql-data - 别忘了检查
/mnt/mysql-data的磁盘空间是否真够用——df -h /mnt/mysql-data看实际可用量,不是看挂载大小
更新 AppArmor 或 SELinux 策略(否则启动被拦截)
Linux 发行版默认会限制 MySQL 只能访问预设路径。哪怕 datadir 改对了、文件也拷全了,安全模块一拦,MySQL 进程根本起不来,日志里只有模糊的 “Permission denied”。
使用场景:
- Ubuntu/Debian 默认用 AppArmor:
sudo nano /etc/apparmor.d/usr.sbin.mysqld,在/var/lib/mysql/** rwk,下面加一行:/mnt/mysql-data/** rwk,
,然后执行sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld - CentOS/RHEL 默认用 SELinux:
sudo semanage fcontext -a -t mysqld_db_t "/mnt/mysql-data(/.*)?",再执行sudo restorecon -Rv /mnt/mysql-data - 临时验证是否是策略问题?可先
sudo setenforce 0(SELinux)或sudo systemctl stop apparmor(AppArmor),测试能否启动——但切记这只是诊断手段,不能长期关闭
启动前务必检查 socket 和 pid 文件路径是否兼容
datadir 不只是放表文件的地方,MySQL 还依赖它生成 mysql.sock 和 mysqld.pid。如果这些路径还硬编码在配置里,或者旧路径残留,会导致客户端连不上、服务端认为自己已在运行。
实操建议:
- 在
[mysqld]段中显式指定:socket = /mnt/mysql-data/mysql.sock<br>pid-file = /mnt/mysql-data/mysqld.pid
- 同时检查
[client]和[mysql]段是否也用了新 socket 路径,否则本地mysql命令连不上:[client]<br>socket = /mnt/mysql-data/mysql.sock
- 启动后验证:
sudo lsof -i :3306看进程是否起来,mysql -u root -p -S /mnt/mysql-data/mysql.sock测试连接
最易被忽略的是:新硬盘格式如果是 exFAT 或 NTFS,MySQL 一定起不来——它要求文件系统支持 Unix 权限和硬链接,只认 ext4/xfs/btrfs。换盘前先 ls -l /mnt/mysql-data 看能不能显示属主和权限位,不能就别往下试了。











