必须用独立系统用户(如mysql)运行mysql 8.0,suse linux enterprise(sle)也不例外;直接用root启动会触发systemd拒绝、初始化失败或selinux/apparmor策略拦截——这是权限模型强制要求,需创建专用系统用户并禁用登录能力,推荐执行useradd -r -s /bin/false mysql。

必须用独立系统用户(如 mysql)运行 MySQL 8.0,SUSE Linux Enterprise(SLE)也不例外;直接用 root 启动会触发 systemd 拒绝、初始化失败或 SELinux/AppArmor 策略拦截——这不是配置技巧问题,而是权限模型强制要求。
创建专用系统用户并禁用登录能力
SLE 默认策略更严格,useradd -r -s /bin/false mysql 是推荐做法:-r 标识为系统用户(UID /bin/false 彻底禁止 shell 登录,比 /sbin/nologin 更明确。不要用 adduser 或加 -m 参数建 home 目录——MySQL 不需要。验证执行 id mysql 和 getent passwd mysql,确保输出中 UID/GID 存在且 shell 字段为 /bin/false。
chown 所有 MySQL 相关路径到 mysql:mysql
仅改数据目录不够,SLE 中 mysqld 启动时还会访问 basedir 下的 share/、support-files/ 等子目录。必须统一归属:
-
chown -R mysql:mysql /usr/local/mysql(若源码安装) -
chown -R mysql:mysql /var/lib/mysql(若 RPM 安装,默认 datadir) -
chown mysql:mysql /etc/my.cnf(配置文件需可读,但不必可写)
漏掉任意一个路径,都可能报 Can't change dir to '/usr/local/mysql' 或 Permission denied 错误,且错误日志里不提示具体哪个路径出问题。
修改 systemd service 文件,显式设置 User= 和 Group=
SLE 的 MySQL 服务文件通常位于 /usr/lib/systemd/system/mysqld.service。编辑它,在 [Service] 段添加:
User=mysql Group=mysql
同时确认 ExecStart= 指向的是 mysqld 二进制,不是 mysqld_safe(SLE 15 SP4+ 已弃用后者)。若存在 RootDirectory= 或 DynamicUser=yes,必须移除——它们与显式 User= 冲突。改完后执行 systemctl daemon-reload,再 systemctl restart mysqld。
验证进程 UID 和日志归属是否真正降权
启动后立刻检查,别只看 systemctl status 表面状态:
-
ps -eo pid,user,comm,args | grep mysqld | grep -v grep—— 主进程 USER 列必须是mysql -
journalctl -u mysqld -n 20 --no-pager—— 日志里不能出现mysqld_safe或running as root字样 -
ls -l /var/lib/mysql/ibdata1—— 文件属主必须是mysql:mysql,否则后续崩溃恢复会失败
最容易被忽略的是:SLE 默认启用 AppArmor,若未适配 profile,即使用户和路径全对,也会静默拒绝部分文件访问——此时 dmesg | grep -i apparmor 会显示 denied 记录,需手动调整 /etc/apparmor.d/usr.sbin.mysqld 并执行 aa-enforce。











