MySQL 8.0权限模型变更导致GRANT失败,需先CREATE USER再GRANT;默认认证插件改为caching_sha2_password,旧客户端需适配;系统库权限收紧,监控需显式授权;升级后须重置root密码并检查账户锁定状态。
MySQL 8.0 彻底弃用了 mysql.user 表的直接更新方式,改用基于角色(ROLE)和分层权限(CREATE USER + GRANT)的严格模型。如果你在升级后执行类似 GRANT ALL ON *.* TO 'admin'@'%' 却报错 ERROR 1410 (42000): You are not allowed to create a user with GRANT,说明当前用户缺少 CREATE USER 权限,或未显式创建用户。
实操建议:
CREATE USER 显式建用户,再 GRANT:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_pass_2025'; GRANT SELECT, INSERT ON mydb.* TO 'app_user'@'localhost';
INSERT INTO mysql.user 或 UPDATE mysql.user 直接写表的方式在 8.0+ 会失败,且可能破坏数据字典一致性root 用户默认不再拥有 ALL PRIVILEGES 的隐式继承;升级后需手动确认其权限是否完整:SHOW GRANTS FOR 'root'@'localhost';
MySQL 8.0+ 默认认证插件从 mysql_native_password 改为 caching_sha2_password,这会导致老版本客户端(如 MySQL 5.7 客户端、某些 Python 2 的 mysql-python 驱动、旧版 Navicat)连接失败,错误提示常为 Client does not support authentication protocol requested by server。
实操建议:
CREATE USER 'legacy_app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123';
pymysql 或 mysql-connector-python >= 8.0.12;Java 应用需使用 mysql-connector-j >= 8.0.16
default_authentication_plugin 配置项,容易引发管理账号登录异常MySQL 8.0 对 mysql 系统库的访问控制更细粒度,默认普通用户即使有 SELECT 权限也无法查询 mysql.user 表(返回空结果),而只能通过 SHOW GRANTS 或 INFORMATION_SCHEMA 查看自身权限。这是安全加固措施,不是 bug。
实操建议:
SELECT * FROM mysql.user 做权限审计;改用 SELECT * FROM INFORMATION_SCHEMA.ROLE_TABLE_GRANTS 或 SHOW GRANTS FOR CURRENT_USER
performance_schem
a,必须显式授权:GRANT SELECT ON performance_schema.* TO 'monitor'@'localhost';
SYS 数据库默认只对 root 和具有 SYSTEM_VARIABLES_ADMIN 权限的用户可见;普通 DBA 账号需额外授权才能运行 SYS 视图MySQL 8.0 引入了账户锁定(ACCOUNT LOCK)与失败登录跟踪机制。升级过程中若原 root 密码为空或弱口令,新版本可能自动启用 password_history 或触发 FAILED_LOGIN_ATTEMPTS 锁定,导致无法登录。
实操建议:
root:mysqld --skip-grant-tables --skip-networking,然后执行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_strong_pass';
SELECT user, host, account_locked, password_last_changed FROM mysql.user;
default_password_lifetime = 0 和 lock_wait_timeout = 31536000,但生产环境应保留锁定能力密码策略、插件兼容性、权限可见性这三处最容易在升级后“静默失效”——不是报错,而是功能行为变了,得主动查、不能凭经验猜。