Debian系统修改MySQL数据目录后无法启动问题求助
既然改回原目录能正常启动,说明问题肯定出在新目录的配置、权限或者系统限制上,咱们一步步排查:
1. 先看错误日志,精准定位问题
别瞎猜,先看MySQL的错误日志找具体原因。Debian上日志一般在/var/log/mysql/error.log,用这条命令看最新的50行:
tail -n 50 /var/log/mysql/error.log
日志里会明确告诉你是权限不足、找不到文件还是其他限制——比如常见的Access denied或Can't open file提示,直接指向问题根源。
2. 检查新目录的权限与属主
MySQL数据目录必须完全归mysql用户/组所有,权限设置不对的话根本启动不了。先对比原目录和新目录的权限:
# 查看原目录权限 ls -ld /var/lib/mysql # 查看新目录权限 ls -ld /data/lib/mysql
正确状态应该是属主属组都是mysql:mysql,目录权限一般是drwxr-xr-x或drwx------(核心是mysql用户要有读写执行权限)。如果不对,立刻修正:
# 递归修改属主属组 chown -R mysql:mysql /data/lib/mysql # 递归修改目录权限 chmod -R 750 /data/lib/mysql
3. 排查Debian特有的AppArmor限制
Debian默认用AppArmor限制进程的文件访问,就算你给了目录权限,AppArmor没开放新路径的话还是会被拦截。
检查是否被AppArmor拦截
查看系统日志找相关记录:
grep mysql /var/log/syslog
如果看到AppArmor DENIED的字样,就是这个问题。
修改AppArmor配置
编辑MySQL的AppArmor规则文件:
nano /etc/apparmor.d/usr.sbin.mysqld
找到原目录的规则段:
/var/lib/mysql/ r, /var/lib/mysql/** rwk,
在下面添加新目录的规则:
/data/lib/mysql/ r, /data/lib/mysql/** rwk,
保存后重新加载AppArmor规则:
systemctl reload apparmor
4. 确认配置文件改全了
你是不是只改了datadir?别忘了同步修改socket路径!有些配置里socket默认指向/var/lib/mysql/mysql.sock,没改的话会导致启动失败。
打开MySQL的主配置文件(Debian上一般是/etc/mysql/mysql.conf.d/mysqld.cnf),检查:
datadir = /data/lib/mysql路径是否正确socket = /data/lib/mysql/mysql.sock是否同步更新
5. 确保复制过程完整
如果之前用普通cp复制,可能没保留文件权限、符号链接等属性。建议重新复制一次:
# 先停掉MySQL systemctl stop mysql # 删除旧的新目录 rm -rf /data/lib/mysql # 用-a参数完整复制(保留权限、属性等) cp -a /var/lib/mysql /data/lib/ # 再确认权限(保险起见) chown -R mysql:mysql /data/lib/mysql
最后测试启动
做完上面的操作后,尝试启动并查看状态:
systemctl start mysql systemctl status mysql
如果还是失败,把错误日志里的关键内容贴出来,就能更精准解决了。
内容的提问来源于stack exchange,提问作者yarek

