Linux 下 MySQL 安装需 root 权限以写入 /usr/local/mysql、绑定 3306 端口及注册服务;必须创建专用系统用户 mysql(UID 27,/bin/false,home 为 /var/lib/mysql),my.cnf 中 user=mysql 用于 setuid 降权,初始化后需验证 datadir 等路径属主及日志文件写权限。

MySQL 安装时需要哪些系统级权限
在 Linux 上以 root 权限运行安装包或编译源码是必须的,否则无法向 /usr/local/mysql 写入二进制文件、无法绑定 3306 端口 (低于 1024 的端口需 CAP_NET_BIND_SERVICE 或 root)、也无法创建系统服务单元文件。非 root 用户即使指定了--basedir 到家目录,后续启动时仍可能因 mysqld_safe 尝试调用 setuid 失败而退出。
常见错误现象:Can't start server : Bind on TCP/IP port: Address already in use(其实是没权限 bind)、Failed to set up SSL(证书路径不可写)、Could not open required defaults file(配置文件 被拒绝读取)。
- 安装阶段:root 或 sudo 权限(用于 解压、复制、chown、systemctl enable)
- 数据目录初始化:
mysqld --initialize必须由 mysql 用户执行,且该用户需对datadir有读写权限 - 服务注册:写
/etc/systemd/system/mysqld.service需 root;若改用~/.config/systemd/user/则可免 root,但只能当前用户启动,且不监听公网
mysql 系统用户必须满足哪些条件
官方推荐创建专用系统用户 mysql(UID 27),而非用root 或普通登录用户运行 mysqld 进程。这个用户不能登录、不能执行 shell、主目录通常设为 /var/lib/mysql 或/nonexistent,关键在于其 home 和 shell 字段要符合安全要求。
检查方式:getent passwd mysql应返回类似 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false;若显示/bin/bash 或 home 是/root,说明配置不合规。
- 禁止 shell 登录:
/bin/false或/usr/sbin/nologin,避免被提权后直接获得交互式会话 - home 目录必须存在且属主为 mysql:
chown mysql:mysql /var/lib/mysql,否则mysqld启动时报Cannot change to run as user 'mysql' - 不能有密码(
passwd -l mysql锁定),也不能出现在/etc/shadow中对应行有有效密码哈希
my.cnf 里 user 选项和系统用户的关系
my.cnf中的 [mysqld] 段落下 user = mysql 不是指数据库用户,而是告诉 mysqld 主进程在初始化完成后,主动调用 setuid() 切换到指定系统用户运行。它只在 Unix-like 系统生效,Windows 忽略。
如果配置了user = root,mysqld 会先以 root 启动,再降权——但若降权失败(比如目标用户不存在、home 不可访问),进程将直接退出并打印Aborting。日志里常见错误:mysqld: Can't change dir to'/var/lib/mysql/' (Errcode: 13),本质就是降权后权限不足。
- 该
user值必须与getent passwd查到的系统用户一致,大小写敏感 - 不要和数据库的
CREATE USER 'mysql'@'localhost'混淆——两者完全无关 - 若用 Docker 运行,容器内仍需提前
adduser -r -u 999 mysql,否则user配置无效
初始化后如何验证用户权限是否闭环
初始化完成不代表权限配置就到位。需确认三个层面是否连通:系统用户能否访问数据目录 → mysqld 能否以该用户身份启动 → 启动后能否加载插件 / 创建 socket/ 写错误日志。
最简验证命令:sudo -u mysql /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --validate-config。成功返回 0 表示配置语法 + 路径权限无硬性冲突;若报错Can't create/write to file'/var/log/mysqld.log',说明日志路径没给 mysql 用户写权限。
- 检查
datadir、pid-file、socket、log-error四个路径的属主和权限 - 用
sudo -u mysql ls -ld /var/lib/mysql确认可进入;用sudo -u mysql touch /var/lib/mysql/test确认可写 - systemd 服务启动失败时,优先看
journalctl -u mysqld -n 50 --no-pager,而不是只盯error.log
实际部署中最容易被跳过的环节,是把 /var/log/mysqld.log 的属主从 root:root 改成mysql:mysql——哪怕其他所有路径都对了,这里一错,mysqld 就静默退出。






























