mysql_install_db已废弃,新版本必须用mysqld --initialize;需确保datadir为空且属主为mysql,初始化后从错误日志获取临时root密码并立即重置。

mysql_install_db 已废弃,必须用 mysqld --initialize
MySQL 5.7.6+ 和 MariaDB 10.2+ 都已移除 mysql_install_db 脚本。继续使用会报错:command not found 或 No such file or directory。官方明确要求改用 mysqld 的 --initialize 参数初始化数据目录。
常见错误现象:
- 执行
mysql_install_db --user=mysql --datadir=/var/lib/mysql报错找不到命令 - 即使脚本存在(如旧版 MariaDB 的
scripts/mysql_install_db),运行后提示 “Please use mysqld --initialize instead”
正确做法:
- 确保
mysqld可执行文件在 PATH 中,或使用绝对路径(如/usr/local/mysql/bin/mysqld) - 必须指定
--user(运行用户)、--datadir(空数据目录)、--basedir(安装根目录) - 首次初始化成功后,日志末尾会输出 root 临时密码,形如:
A temporary password is generated for root@localhost: c!X9v#mK2qR%
libaio.so.1 缺失导致初始化失败
几乎所有二进制包(MySQL 5.7/8.0、MariaDB 10.5+)在初始化或启动时都会报这个错:error while loading shared libraries: libaio.so.1: cannot open shared object file。这不是权限问题,而是系统缺少异步 I/O 支持库。
解决方法很简单,但容易被跳过:
- CentOS/RHEL/AlmaLinux:运行
yum install -y libaio - Ubuntu/Debian:运行
apt-get install -y libaio1 - 如果 yum 报 “No package libaio available”,先检查是否启用了 base repo:
yum repolist
注意:numactl 不是必需项,只有在 NUMA 架构服务器上启用内存绑定策略时才需要,别被旧教程带偏。
my.cnf 配置中 skip-grant-tables 是双刃剑
为绕过密码登录而加 skip-grant-tables 很常见,但它会让整个 MySQL 实例不校验任何用户权限 —— 包括远程连接、CREATE USER、GRANT 等所有操作都失效,且无法设置新密码(因为密码表本身被跳过)。
真实使用场景下,只应在以下情况启用:
- 完全无法登录,且你确定能物理访问服务器
- 仅用于重置 root 密码,且操作完成后立即注释掉并重启服务
更安全的替代方案:
- 用初始化生成的临时密码登录:
mysql -u root -p'c!X9v#mK2qR%' - 登录后立刻执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_pass'; - 若提示密码强度不足,先设低等级:
SET GLOBAL validate_password.policy=LOW;
data 目录权限和 SELinux 是静默失败元凶
即使 mysqld --initialize 显示成功,启动服务时仍可能卡住或报 Can't start server: Bind on TCP/IP port 或直接退出,日志里却没明显错误。这时候大概率是两个隐藏问题:
-
/var/lib/mysql或自定义datadir所有者不是mysql:mysql,或包含非空子目录(如残留的lost+found) - SELinux 启用状态下,
mysqld被阻止写入 data 目录 —— 查看audit.log会看到 avc denied 记录
验证与修复:
- 确认权限:
ls -ld /var/lib/mysql应输出drwxr-x---. 5 mysql mysql - 临时禁用 SELinux 测试:
setenforce 0;若此时能启动,说明需打标签:semanage fcontext -a -t mysqld_db_t "/path/to/datadir(/.*)?",再restorecon -Rv /path/to/datadir
生产环境别长期关 SELinux,但初始化阶段最容易忽略它的干扰。











