mysql安装权限问题核心在于mysql用户对/var/lib/mysql等关键路径的实际读写权,需确保归属为mysql:mysql、权限750,初始化必须用sudo -u mysql执行,同时检查systemd沙箱设置和配置文件权限。

MySQL安装报权限不足,绝大多数情况不是“没加sudo”,而是mysql用户对关键路径没有实际读写权——哪怕你全程用sudo执行命令,只要最终进程以mysql身份运行,它就只认自己能碰的文件。
检查/var/lib/mysql归属是否为mysql用户
这是最常踩的坑。安装后启动失败,日志里出现Permission denied且路径指向/var/lib/mysql,基本就是这里错了。
- 运行
ls -ld /var/lib/mysql,输出必须包含mysql mysql(如drwxr-x--- 11 mysql mysql) - 若显示
root root或其它用户,立刻修复:sudo chown -R mysql:mysql /var/lib/mysql - 别顺手
chmod 777——sudo chmod 750 /var/lib/mysql更安全,mysql组内可读,其他用户不可见 - 如果目录不存在,先
sudo mkdir -p /var/lib/mysql再赋权,否则mysqld --initialize会直接退出
mysqld --initialize必须用mysql用户执行
mysql_install_db在5.7.6+已废弃,但很多文档还在用。用root跑mysqld --initialize会导致ibdata1等文件属主为root,后续mysql用户完全无法打开。
- 正确命令是:
sudo -u mysql mysqld --initialize --datadir=/var/lib/mysql --user=mysql - 漏掉
--user=mysql参数,或--datadir路径写错,都会让初始化生成的文件权限失控 - 如果已用
root初始化过,清空/var/lib/mysql再重来,不要试图chown单个文件——ib_logfile*等文件权限可能仍被锁死
systemd服务启动失败时查ProtectHome和NoNewPrivileges
journal里只报Operation not permitted,但ls -l全正常?大概率是systemd沙箱拦住了。
- 运行
sudo systemctl cat mysqld,重点看是否有ProtectHome=yes或NoNewPrivileges=yes -
ProtectHome=yes会阻止访问/var/lib/mysql(因该路径属ProtectHome范围),临时调试可:sudo systemctl edit mysqld,写入:
[Service] ProtectHome=false
NoNewPrivileges=yes会禁用动态加载插件能力,同样需设为false;生产环境应改配SELinux策略,而非关保护配置文件权限过宽导致拒绝启动
MySQL启动时若发现/etc/my.cnf权限是0666或属主不是root,会直接退出并报File protection error。
- 确认归属:
sudo ls -l /etc/my.cnf→ 应为-rw-r--r-- 1 root root - 修复命令:
sudo chown root:root /etc/my.cnf && sudo chmod 644 /etc/my.cnf - 如果用了
include机制(如!includedir /etc/my.cnf.d/),整个目录也要chmod 755且属主root - 自定义配置路径(如
/opt/mysql/my.cnf)时,确保mysql用户对该文件有read权限,但write权限必须禁止
真正麻烦的不是权限本身,而是错误信息不指向真实原因——比如socket路径权限不对,报的可能是“Can't connect to local MySQL server”,得翻错误日志才能定位到/var/run/mysqld目录缺失或属主错误。每次遇到Permission denied,先盯住日志里那个具体路径,再查归属和权限,别猜。











