必须用独立系统用户(如mysql)运行MySQL 8.0,不可用root或当前用户直接启动;需提前创建该用户、正确设置所有相关路径归属(如/data/mysql、/usr/local/mysql等)、在my.cnf的[mysqld]段显式配置user=mysql,并确保mysqld --initialize也以该用户执行,否则初始化失败、启动报错或权限拒绝。

必须用独立系统用户运行 MySQL 8.0,不能用 root 或当前登录用户直接启动 mysqld。这是 MySQL 官方强制要求(自 5.7 起强化),否则初始化失败、服务无法持久化、日志写入被拒,甚至触发 SELinux/AppArmor 拒绝策略。
为什么不能跳过创建专用用户这步
MySQL 8.0 的 mysqld 进程在启动时会主动降权:它先以当前 shell 用户身份读配置、检查路径权限,然后尝试切换到 mysql 用户(或你指定的用户)执行后续操作。如果你没创建该用户,或目录归属仍是 root,就会卡在初始化阶段,报错如:
Can't create test file /data/mysql/hostname.lower-testThe designated data directory /data/mysql is unusablemysqld: Can't change dir to '/data/mysql/' (Errcode: 13 - Permission denied)
这些都不是配置问题,而是权限链断裂——mysqld 想以非 root 身份写数据,但系统里根本没有那个用户,或对应目录不可写。
useradd -s /sbin/nologin mysql 是标准做法
这条命令创建一个无登录能力、仅用于服务运行的系统用户:
-
useradd -s /sbin/nologin mysql:禁止该用户通过 ssh/login/shell 登录,符合最小权限原则 - 不加
-u参数让系统自动分配 UID,避免与现有服务冲突 - 不指定
-g时默认创建同名组mysql,后续 chown 更简洁 - 不要用
adduser(交互式)或useradd -m(建 home 目录),MySQL 不需要家目录
验证是否成功:id mysql 应输出 uid/gid 信息;getent passwd mysql 应返回一行且 shell 字段为 /sbin/nologin。
chown -R mysql:mysql /path/to/mysql* 和 /data/mysql 必须同步做
仅创建用户不够,所有 MySQL 相关路径必须归属该用户:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
chown -R mysql:mysql /usr/local/mysql-8.0.36:安装目录及其子文件(bin、lib、share 等) -
chown -R mysql:mysql /data/mysql:数据目录(初始化后所有 ibdata1、ib_logfile*、数据库子目录都在此) -
chown mysql:mysql /etc/my.cnf:配置文件需可读,但不必可写(避免误改) - 如果日志路径是
/var/log/mysql/,同样要chown -R mysql:mysql /var/log/mysql
漏掉任意一项都可能在启动时触发权限错误。特别注意:mysqld --initialize 必须由 mysql 用户执行(sudo -u mysql mysqld --initialize --datadir=/data/mysql --basedir=/usr/local/mysql-8.0.36),否则生成的系统表仍属当前用户,后续 mysqld 启动时会拒绝加载。
my.cnf 中 user = mysql 不是可选项,是生效前提
在 [mysqld] 段必须显式声明:
user = mysql
否则 systemd 或手动启动时,mysqld 不会自动切换用户,仍以调用者身份运行(比如你用 sudo ./bin/mysqld,它就以 root 跑,违反安全策略)。
常见误区:
- 以为只要
chown了目录就够了 —— 错,user = mysql缺失会导致进程 UID 不变 - 把
user写在[client]或[mysql]段 —— 无效,只在[mysqld]下起作用 - 用中文注释或空格破坏格式,如
user= mysql(等号后多空格)—— 解析失败,静默忽略
验证方式:启动后执行 ps aux | grep mysqld,USER 列必须是 mysql,不是 root 或你的用户名。
真正容易被忽略的是:这个用户必须在 mysqld --initialize 之前存在,且所有路径权限在初始化前就已正确归属。很多人卡在“初始化成功但启动失败”,本质就是初始化时用了错误用户,导致生成的系统表所有权混乱,后续无法修复 —— 唯一解法是删掉整个 datadir 重来。

















