Rocky Linux 9离线部署MySQL二进制包前,必须安装libaio、numactl-libs和ncurses-compat-libs三个依赖,缺一将导致mysqld启动失败或初始化报错;解压路径推荐/usr/local/mysql,数据目录须独立(如/data/mysql),权限需分设:安装目录chown root:root,数据目录chown mysql:mysql。

解压二进制包前必须装的依赖有哪些
Rocky Linux 9 默认不带 libaio、numactl-libs 和 ncurses-compat-libs,缺任何一个都会导致 mysqld 启动失败或初始化报错(比如 error while loading shared libraries: libaio.so.1)。
-
libaio:MySQL 异步 I/O 必需,不装会直接 segfault -
numactl-libs:影响 NUMA 感知内存分配,不装可能在多 CPU 机器上性能下降 -
ncurses-compat-libs:8.0.28+ 版本二进制包依赖较旧的 ncurses ABI,Rocky 9 自带的是 ncurses 6.4,必须补兼容层
执行命令一次性装全:
dnf -y install libaio numactl-libs ncurses-compat-libs
解压路径和目录权限怎么设才不出错
官方二进制包(如 mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz)解压后是纯静态结构,不能直接运行。关键点在于:解压目标路径不能含空格或中文,且后续所有操作必须用 mysql 用户身份启动。
- 推荐解压到
/usr/local/mysql,这是 MySQL 二进制包默认--basedir值 - 数据目录(
--datadir)必须独立于安装目录,例如/data/mysql或/usr/local/mysql/data - 解压后立即执行:
chown -R root:root /usr/local/mysql,再把数据目录所有权交给mysql用户
常见错误:直接 chown -R mysql:mysql /usr/local/mysql —— 这会导致 mysqld 启动时找不到 mysql.server 脚本或报权限拒绝。
初始化数据目录时 mysqld --initialize 的参数陷阱
初始化不是简单跑一条命令就完事。mysqld --initialize 必须显式指定 --user、--datadir、--basedir,漏掉任意一个都可能写错路径、生成无效 socket 或静默失败。
- 正确写法(以
/data/mysql为数据目录):mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql -
--initialize-insecure仅用于测试环境,它生成空 root 密码,但 8.0.39+ 默认强制密码策略,连mysql_secure_installation都可能卡住 - 如果提示
Can't create test file /data/mysql/xxx.lower-test,大概率是 SELinux 拦截或/data目录没提前mkdir -p /data/mysql - 初始化成功后,root 临时密码在错误日志里(
grep 'temporary password' /var/log/mysqld.log),但二进制包默认不写这个日志——你得在/etc/my.cnf显式配log-error=/data/mysql/error.log
为什么 mysqld --initialize 后还起不来服务
初始化只是生成系统表和日志文件,不代表服务能跑起来。真正卡住的地方往往藏在配置和 systemd 单元里。
-
/etc/my.cnf中必须有[mysqld]段,且至少包含user=mysql、datadir、socket;漏掉user会导致进程以 root 身份启动,然后被自动 kill - systemd 服务文件若用
mysql.server启动,要确认/usr/local/mysql/support-files/mysql.server存在,并在ExecStart里写对路径 - Rocky 9 的
systemd默认启用ProtectHome=true,如果datadir在/home下会直接拒绝启动 - 最隐蔽的坑:
skip_name_resolve=1必须配,否则初始化时 DNS 解析超时,mysqld卡在启动阶段不报错也不退出
初始化完成 ≠ 服务就绪。检查 systemctl status mysqld 输出里的 “Process:” 行,看实际执行的命令是否带齐了 --user 和 --datadir —— 很多时候 systemd 模板里写的路径和你实际初始化的不一致,这才是真·玄学来源。


















