MySQL 8.0 的授权表加载行为由服务启动时能否正常读取并解析 mysql 系统库中的表(如 user、db)决定;跳过加载仅能通过 --skip-grant-tables 启动参数实现,该参数不可写入 my.cnf,否则报错退出;真正可通过配置文件控制的是 default_authentication_plugin,它影响新用户认证方式而非授权表加载本身。

MySQL 8.0 的授权表加载行为由什么控制?
MySQL 启动时是否从磁盘加载 mysql 系统库(含 user、db 等授权表),不是靠某个开关“启用/禁用”,而是由服务能否正常读取并解析这些表决定的。所谓“修改默认授权表加载行为”,实际场景只有两类:跳过加载(--skip-grant-tables) 或 强制使用特定认证插件(影响后续用户验证逻辑)。配置文件里没有 load_grant_tables=on/off 这种参数——它根本不存在。
想跳过权限检查?必须用 --skip-grant-tables,不能写进 my.cnf
--skip-grant-tables 是启动参数,不是配置项,不能写在 my.cnf 的 [mysqld] 段里。写进去 MySQL 会直接报错退出:
Unknown variable 'skip-grant-tables'
正确做法是临时加到 systemd 服务启动命令中,或改 /lib/systemd/system/mysqld.service 的 ExecStart 行末尾:
- 先停服务:
sudo systemctl stop mysqld - 手动启动并跳过授权表:
sudo mysqld --skip-grant-tables --skip-networking &(--skip-networking防止未授权远程连接) - 此时可无密码登录:
mysql -u root,然后执行FLUSH PRIVILEGES;或重置用户 plugin - 改完立刻停掉该进程,再用
systemctl start mysqld正常启服务
真正能通过 my.cnf 控制的,是认证插件行为
你真正能配、也最常需要配的,是新用户默认用哪个认证方式,即 default_authentication_plugin。它不改变“是否加载授权表”,但决定加载后怎么验证用户:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 必须放在
[mysqld]段下,写在[client]或[mysql]里完全无效 - 只影响 新创建的用户,对已存在的用户(如升级保留下来的
root)毫无作用 - 常见值:
mysql_native_password(兼容老客户端)、caching_sha2_password(MySQL 8.0 默认,但 PHP 7.4 以下、某些 JDBC 驱动连不上) - 改完必须
sudo systemctl restart mysqld,reload不生效
例如,在 /etc/my.cnf 中添加:
[mysqld] default_authentication_plugin = mysql_native_password
为什么改了 default_authentication_plugin 还连不上 root?
因为 root 用户在 MySQL 8.0 升级前就存在,它的 plugin 字段仍是 caching_sha2_password,不受全局配置影响。必须手动更新:
- 先用 socket 或
--skip-grant-tables登录 - 执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 如果支持远程访问,补一句:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 最后:
FLUSH PRIVILEGES; - 验证:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';—— 输出的plugin列必须是mysql_native_password
授权表本身始终被加载;真正卡住连接的,往往是这个 plugin 字段和客户端能力不匹配——这点最容易被忽略。

















