mysql启动报“permission denied”应先通过journalctl定位被拒绝的具体路径,再递归修正属主(如sudo chown -r mysql:mysql /home/yourname/mysql_data),并检查父目录可穿越性、selinux/apparmor拦截及socket目录(/var/run/mysqld)是否就绪。

mysql启动报“Permission denied”先看journalctl里拒绝的是哪个路径
别急着改权限,先定位被拦的具体位置。运行journalctl -u mysql -n 50 --no-pager,重点找类似Can't create test file /home/yourname/mysql_data/.test或Could not open file './err.log': Permission denied这样的行。错误路径直接决定你要修哪一层——可能是/home/yourname,也可能是/home/yourname/mysql_data,甚至只是/var/run/mysqld。
chown必须递归且属主对准mysql用户,漏-R等于白干
确认datadir位置(查mysqld --verbose --help 2>/dev/null | grep "datadir"或/etc/my.cnf),然后执行:
- sudo chown -R mysql:mysql /home/yourname/mysql_data
- sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld
- 若有升级目录(如/var/lib/mysql-upgrade),同样要chown -R mysql:mysql
常见错:只跑chown mysql:mysql /home/yourname/mysql_data不加-R。MySQL启动时会读ibdata1、mysql/子目录、err.log等,这些文件若仍属root,照样报错。
父目录链必须允许mysql用户“路过”,namei -l是必查命令
比如datadir = /home/yourname/mysql_data,但/home/yourname权限是700(默认),mysql用户根本进不去——不是子目录没权限,是连门都摸不到。
用namei -l /home/yourname/mysql_data逐层检查每级目录的属主和x权限。确保从/到mysql_data每一层,mysql用户至少有x权限(即能进入)。修复方式:
- 若/home/yourname必须保持私密,可改权限为755(chmod 755 /home/yourname)
- 或给mysql用户加ACL:sudo setfacl -m u:mysql:x /home/yourname
- 切忌chown -R整个/home/yourname,会破坏用户环境
systemctl能启但手动mysqld失败?大概率是SELinux或AppArmor在拦
现象:sudo mysqld --defaults-file=/etc/my.cnf能跑,sudo systemctl start mysql就报Permission denied——内核级安全模块在拦截,ls -l完全看不出问题。
临时验证:
- CentOS/RHEL:sudo setenforce 0
- Ubuntu:sudo systemctl stop apparmor
再试systemctl start mysql。若成功,就是策略问题。
生产环境修复:
- SELinux:sudo semanage fcontext -a -t mysqld_db_t "/home/yourname/mysql_data(/.*)?",然后sudo restorecon -Rv /home/yourname/mysql_data
- AppArmor(Ubuntu):编辑/etc/apparmor.d/usr.sbin.mysqld,加一行/home/yourname/mysql_data/** rwk,,再sudo systemctl reload apparmor
真正容易被忽略的点是:父目录权限和安全模块上下文,这两处不解决,光改datadir目录本身永远无效。











