mysql_install_db 已废弃,应改用 mysqld --initialize(生成随机root密码)或 --initialize-insecure(空密码),二者均需指定空--datadir;初始密码见错误日志,权限问题需修正datadir属主为mysql用户。

mysql\_install\_db 已被废弃,别再用它初始化权限表
MySQL 5.7.6 起 mysql_install_db 就被正式移除,8.0 完全不可用。你现在执行它,大概率遇到 command not found 或直接报错 Unknown option '--datadir'——不是你路径写错,是这工具本身已下线。
替代方案只有 mysqld --initialize(推荐)或 mysqld --initialize-insecure,二者都自动重建 mysql 系统库(含 user、db、tables_priv 等权限表)。
-
mysqld --initialize:生成随机 root 密码,写入错误日志(error log),首次登录必须改密 -
mysqld --initialize-insecure:root 密码为空,适合内网快速验证,但绝不能用于生产 - 必须指定
--datadir,且该目录要为空或不存在;若已有数据,会报错退出,不会覆盖
初始化后 root 登录失败?检查 error log 里的临时密码
用 mysqld --initialize 启动后连不上 mysql -u root -p,常见原因是没看日志——MySQL 把初始密码明文打在错误日志里,不是控制台输出。
典型日志片段长这样:
[Note] A temporary password is generated for root@localhost: aB3#xQ9!mL2p注意末尾的
aB3#xQ9!mL2p 就是密码,复制时别带空格或换行。
- 日志位置默认是
datadir下的hostname.err,比如/var/lib/mysql/myhost.err - 如果启用了
log-error配置项,就以它为准;没配则 fallback 到stderr(终端输出),但后台服务模式下通常看不到 - 输错三次密码会触发连接拒绝,不是锁账户,但会延长下次重试间隔
权限表损坏导致启动失败?优先用 --skip-grant-tables + mysql\_upgrade
如果 MySQL 启动卡在 Starting authorization system 或报错 Table 'mysql.user' doesn't exist,说明系统表结构异常,不能靠重跑初始化解决——那会清空所有数据。
正确做法是跳过权限校验,进库修复:
- 先停掉 mysqld:
systemctl stop mysqld(或kill对应进程) - 加参数启动:
mysqld --skip-grant-tables --skip-networking --datadir=/var/lib/mysql(--skip-networking防止未授权远程访问) - 连上去执行:
FLUSH PRIVILEGES;,再运行mysql_upgrade -u root -p(它会比对版本并修复系统表结构) - 重启正常服务:
systemctl start mysqld
注意:mysql_upgrade 不修改你的业务库,只修 mysql 库下的表结构和索引,但要求 MySQL 实例能正常响应 SQL。
初始化时 datadir 权限不对,常见报错和修复命令
Linux 下最常踩的坑:用 root 运行 mysqld --initialize,导致 datadir 所有者变成 root:root,而 mysqld 实际以 mysql 用户运行,一启动就报 Can't open the mysql.plugin table 或 Permission denied。
- 确认当前用户:
ps aux | grep mysqld看 USER 列(通常是mysql) - 修复命令:
chown -R mysql:mysql /var/lib/mysql(路径按你的--datadir值替换) - 千万别
chmod 777,MySQL 会拒绝启动(安全策略强制要求 datadir 权限 ≤ 755) - SELinux 启用时还可能拦截,临时关掉测试:
setenforce 0;确认是它的问题再配策略,别长期关闭
权限问题往往不报明确错误,而是静默失败或卡在某个阶段,盯紧错误日志里第一行 mysqld: Can't change dir to 或 Unable to lock file 这类提示。










