Ubuntu 12.04修改MySQL数据目录后启动失败:start: Job failed to start
你遇到的start: Job failed to start报错是典型的启动配置异常,咱们从你已做的操作里找疏漏,一步步排查修复:
1. 先查看MySQL启动日志定位具体错误
启动失败的第一步是看日志,Ubuntu 12.04的MySQL日志默认在/var/log/mysql/error.log,如果新目录权限正确,也可能在/array2/mysql/$(hostname).err里。执行以下命令查看:
cat /var/log/mysql/error.log # 或者 cat /array2/mysql/$(hostname).err
日志里会明确告诉你是权限问题、配置错误还是文件缺失,这是最关键的排查步骤。
2. 修复AppArmor配置的明显错误
你在配置AppArmor alias的时候用了占位符/your/new/datadir/,没有替换成实际的新目录路径,这会导致AppArmor阻止MySQL访问新目录。执行以下步骤修正:
- 编辑alias文件:
nano /etc/apparmor.d/tunables/alias
- 找到你添加的那一行,把
/your/new/datadir/改成/array2/mysql/,最终应该是:
alias /var/lib/mysql/ -> /array2/mysql/,
- 重新加载AppArmor并尝试重启服务:
sudo /etc/init.d/apparmor reload sudo service mysql restart
3. 检查数据目录的复制是否完整且权限正确
你之前用cp -R复制数据,但这个命令不会保留所有文件属性(比如特殊权限),正确的复制方式应该用cp -a来完整保留原文件的所有属性:
# 如果之前复制的数据有问题,先清空新目录内容 rm -rf /array2/mysql/* # 重新完整复制原数据目录(用你备份的旧目录) cp -a /var/lib/mysql-old/* /array2/mysql/ # 再次确保目录权限正确 chown -R mysql:mysql /array2/mysql chmod -R 750 /array2/mysql
4. 检查my.cnf的其他关联配置
你修改了datadir和socket,但还要确认是否有其他路径需要调整:
- 检查
log_error参数:如果日志路径还是指向旧目录,需要改成新目录或者保持默认的/var/log/mysql/error.log(确保这个目录权限允许mysql写入) - 如果是InnoDB引擎,检查
innodb_data_home_dir、innodb_log_group_home_dir等参数,确保它们指向正确路径(没设置则默认用datadir,无需改动) - 确认
pid-file参数:默认是/var/run/mysqld/mysqld.pid,这个路径不需要改,但要确保/var/run/mysqld/目录属于mysql用户:
chown mysql:mysql /var/run/mysqld/
5. 关于符号链接的取舍
你同时配置了AppArmor alias和符号链接ln -s /array2/mysql /var/lib/mysql,这两者其实选一个就行,同时存在可能导致混淆。建议保留AppArmor alias,删除符号链接:
rm /var/lib/mysql
因为AppArmor已经把旧路径的访问映射到新目录,不需要符号链接来伪装路径了。
6. 使用规范的启动命令
Ubuntu 12.04中更推荐用service命令管理服务,而不是直接用start:
sudo service mysql start # 查看服务状态 sudo service mysql status
按照以上步骤排查后,应该可以解决启动失败的问题。如果还是不行,把日志里的错误信息贴出来,就能更精准定位了。
内容的提问来源于stack exchange,提问作者pramod24

