解压二进制包后必须创建mysql软链接,否则升级、脚本调用和环境变量配置易出错;初始化前需确保datadir路径存在、属主为mysql且权限正确,并显式指定--defaults-file或--basedir/--datadir参数。

解压二进制包后必须做软链接
不建 mysql 软链接,后续升级、脚本调用、环境变量配置都会出问题。硬编码路径一旦写死,改起来成本高、易遗漏。
正确做法是解压到 /usr/local/ 后立即创建指向:
cd /usr/local tar xvf mysql-8.0.35-linux-glibc2.17-x86_64.tar.xz ln -s mysql-8.0.35-linux-glibc2.17-x86_64 mysql
-
mysql这个软链接名是绝大多数启动脚本、配置项(如basedir)、mysqld_safe默认查找的路径 - 不要跳过这步直接进子目录操作,否则
mysqld --initialize可能报Can't find file: './mysql/plugin.frm'类错误 - 软链接目标路径不能带 trailing slash,即
ln -s xxx/ mysql是错的
初始化前必须确保 datadir 所有者和权限正确
mysqld --initialize 不会自动创建父目录,也不会帮你 chown;如果 datadir 所属用户不是 mysql,初始化会静默失败或生成空目录。
- 先手动创建数据目录并授权:
mkdir -p /home/mysql/data && chown -R mysql:mysql /home/mysql -
datadir路径不能是 root 或其他用户可写,否则初始化会拒绝执行(MySQL 5.7+ 默认启用--secure-file-priv限制) - 避免把
datadir设在/tmp或/var/tmp—— 这些路径可能被系统定期清理,导致实例无法启动 - 若用 LVM 挂载点(如
/data),确认挂载选项不含noexec或nosuid
初始化命令必须显式指定 --defaults-file 或 --basedir/--datadir
不指定配置文件或路径参数时,mysqld 会按默认顺序搜索 my.cnf,但往往找不到你写的配置,导致初始化使用内置默认值(例如 lower_case_table_names=0),后续建库建表大小写敏感引发应用异常。
- 推荐方式(显式可控):
mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql - 备选方式(无配置文件时):
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql/data - 禁止只执行
mysqld --initialize—— 它会尝试读取/etc/my.cnf、~/.my.cnf等多个位置,顺序混乱且不可控 - 初始化成功后,临时 root 密码只输出到 error log(
log-error配置项指定的文件),不会打印在终端;若没配log-error,密码将丢失
初始化失败常见信号与快速定位方法
初始化卡住、无输出、或报错退出,90% 是权限、路径、配置三类问题。别重试,先看日志和上下文。
- 检查
log-error文件是否存在且 mysql 用户可写;若未配置,加--log-error=/tmp/mysqld_init.log临时捕获 - 运行
strace -f -e trace=openat,stat,mkdir,chown mysqld --initialize --user=mysql 2>&1 | grep -E "(denied|No such|Permission)"快速定位权限/路径缺失点 - 报
Can't create test file:通常是datadir父目录不可写,或文件系统为只读(如挂载了ro) - 报
unknown variable 'xxx':配置文件里写了新版本才支持的参数(如 MySQL 8.0 的default_authentication_plugin写在 5.7 配置中)
datadir 下的 mysql 系统库权限必须严格为 mysql:mysql,且不能有 world-writable 位;哪怕只是多了一个 chmod 777,后续启动时 mysqld 会拒绝加载插件,直接 abort。











