MySQL启动失败时,chown -R mysql:mysql必须对/usr/local/mysql(安装目录)、/usr/local/mysql/data(数据目录)及socket父目录(如/tmp)生效,确保mysqld以mysql用户身份拥有完整读写权限。

chown -R mysql:mysql 对哪些目录必须生效
MySQL启动失败最常见的原因是 mysqld 进程无法写入数据目录或日志路径。它以 mysql 用户身份运行,所以该用户必须对以下三个目录拥有完整读写权限(rwx):
-
/usr/local/mysql8/(或你解压后的安装根目录)——尤其要确保bin/、share/可读,data/可读写 -
/usr/local/mysql8/data/(初始化用的--datadir)——必须为空或由mysqld --initialize创建,且属主属组为mysql:mysql -
/tmp/mysql.sock所在的父目录(如/tmp)——若配置了socket=/tmp/mysql.sock,则/tmp需至少1777(sticky bit),否则mysqld无法创建 socket 文件
执行命令时别漏掉 -R(递归),否则子目录权限可能不一致;也别只改 data/ 却忘了整个安装目录,某些插件或错误日志路径会从 basedir 下派生。
chmod 不是万能的,避免滥用 777
有人看到权限报错就直接 chmod -R 777 /usr/local/mysql8,这是危险操作。MySQL 8.0 默认启用 secure_file_priv,且部分安全策略(如 SELinux 或 AppArmor)会拒绝 777 目录下的文件访问。更稳妥的做法是:
- 仅对
data/和日志目录(如/usr/local/mysql8/data/error.log)设为750或755,保证mysql用户可读写,组可读 -
/tmp本身已是1777,无需额外改;若自定义 socket 路径(如/var/run/mysqld/),则需mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld && chmod 755 /var/run/mysqld - 禁止给
bin/或share/加写权限,防止二进制被篡改
初始化前必须确认 datadir 所有者,否则会静默失败
mysqld --initialize 不会自动修正权限,它只检查能否在 --datadir 下创建文件。如果目录存在但属主不是 mysql,初始化会成功生成临时密码,但后续启动时 mysqld 因无法写入 ibdata1 或 mysql.ibd 而崩溃,错误日志里只显示 InnoDB: Unable to lock ./ibdata1 error 或 Can't create/write to file。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
务必在初始化前执行:
chown -R mysql:mysql /usr/local/mysql8/data
若已初始化过且出错,先删掉 data/ 再重来——不要试图用 chown 修正在运行中的数据目录,InnoDB 元数据可能已损坏。
systemd 环境下要注意 /var/lib/mysql 的归属冲突
如果你用 yum install mysql-server 安装(而非二进制包),RPM 包默认把数据目录设为 /var/lib/mysql,并由 systemd 服务单元控制。此时 mysql 用户可能没权限写入该路径,尤其当 SELinux 启用时:
- 检查 SELinux 状态:
sestatus;若为enforcing,需运行sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"+restorecon -Rv /var/lib/mysql - 确认
systemctl show mysql | grep User输出是User=mysql,否则服务会以root启动,绕过权限检查却埋下安全风险 - 不要手动
chown root:root /var/lib/mysql——这会让 systemd 拒绝启动,报错Failed at step USER spawning
最易被忽略的是:不同安装方式(RPM vs tar.xz)混用时,/etc/my.cnf 里写的 datadir 和实际 systemd 单元文件中定义的路径可能不一致,导致权限修复对象错位。

















