答案是mysql.server脚本缺少执行权限,需运行chmod u+x mysql.server修复;若报错源于数据目录权限,则须递归执行sudo chown -r mysql:mysql /var/lib/mysql,并检查selinux/apparmor拦截及父目录可穿越性。

./mysql.server: Permission denied 是脚本没加执行权限
直接运行 ./mysql.server start 报这个错,90% 是因为 mysql.server 文件本身没有 x(执行)权限。root 用户身份也救不了——Linux 不认“你是谁”,只认“文件允不允许你跑”。
- 先确认:执行
ls -l mysql.server,看权限字段最左边是否含x(比如-rw-r--r--就缺执行位) - 修复:运行
chmod u+x mysql.server,只给属主加执行权,不暴露给所有人 - 别用
chmod 755或chmod +x—— 后者会把执行权给 group/other,没必要且有风险 - 同理适用于
/etc/init.d/mysqld、./start.sh等启动脚本
journalctl 显示 Can't create test file /var/lib/mysql/xxx:属主没递归改对
错误日志里出现 Can't create test file 或 Could not open file './err.log',说明 MySQL 进程(以 mysql 用户身份运行)被卡在数据目录某一层——不是路径写错了,是权限链断了。
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
- 先查配置:运行
mysqld --verbose --help 2>/dev/null | grep "datadir"或看/etc/my.cnf里的datadir值(比如/var/lib/mysql) - 必须递归改属主:
sudo chown -R mysql:mysql /var/lib/mysql,漏掉-R就等于没改——ibdata1、mysql/子目录、err.log都得是mysql才行 - 顺手检查 socket 目录:
sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld,否则启动时连 socket 都建不出 - 父目录也要能“路过”:比如
datadir = /data/mysql,那/data目录至少得有755且属主/组允许mysql用户进入(即有x权限),用namei -l /data/mysql逐层看
手动跑 mysqld 能启,systemctl start 却失败:SELinux 或 AppArmor 在拦
权限全对、属主也对,但 systemctl start mysql 就报 Permission denied,而 sudo mysqld --defaults-file=/etc/my.cnf 却成功——这基本是 SELinux 或 AppArmor 的锅,它在内核层做了额外拦截,ls -l 根本看不出问题。
- 临时验证:CentOS/RHEL 上执行
sudo setenforce 0,Ubuntu 上执行sudo systemctl stop apparmor,再试启动;若成功,就是策略问题 - SELinux 正确修复:
sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?",然后sudo restorecon -Rv /var/lib/mysql - AppArmor(Ubuntu):检查
/etc/apparmor.d/usr.sbin.mysqld是否包含你的datadir和日志路径,补上后运行sudo systemctl reload apparmor - 别长期关 SELinux/AppArmor——它们不是 bug,是安全机制;绕过测试可以,上线必须配上下文
chmod 777 /var/lib/mysql 之后还失败?挂载选项或解释器权限可能有问题
给整个目录加了 777 还报错,说明问题不在传统文件权限层面。常见盲区有两处:一是文件系统挂载参数限制,二是脚本依赖的解释器本身没权限。
- 检查挂载选项:
mount | grep "$(df . | tail -1 | awk '{print $1}'),看输出里有没有noexec、nosuid或ro(只读)。有就只能重挂载,chmod无效 - 检查
#!/bin/bash这行指向的解释器:ls -l /bin/bash,如果它被误删了x权限,所有 shell 脚本都会报Permission denied -
777是危险操作,尤其对数据库目录——MySQL 启动时会拒绝属主不是mysql的777目录,这是它的安全校验逻辑之一










