mysql 8.0创建用户必须显式设密码、指定认证插件且处理密码策略,否则报error 1819;grant后无需flush privileges,因其已自动同步权限;host匹配为精确字符串,@'%'与@'localhost'互不等价。

MySQL 8.0 创建用户必须显式设密码、指定认证插件,且 GRANT 后必须执行 FLUSH PRIVILEGES 才能生效;不处理密码策略或插件兼容性,连接会直接失败。
CREATE USER 报 ERROR 1819:密码不满足策略要求
这是 MySQL 8.0+ 默认启用 validate_password 插件导致的——空密码、纯数字、短于8位、无大小写混合都会被拒绝,错误信息是:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
实操建议:
- 先查当前策略:
SHOW VARIABLES LIKE 'validate_password%';,重点关注validate_password.policy(0=LOW,1=MEDIUM,2=STRONG) - 测试环境可临时调低:
SET GLOBAL validate_password.policy = LOW;(生产环境严禁) - 创建时必须带强密码:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppPass2026!'; - 若要兼容老客户端(如 Navicat 12.0.x),需同步指定插件:
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'AppPass2026!';
GRANT 后用户仍无法访问数据库或执行 USE
只执行 GRANT SELECT ON mydb.* TO 'appuser'@'%';,用户能查表但不能 USE mydb,因为 SELECT 是对象级权限,不包含数据库级访问能力(如 SHOW DATABASES 或切换库)。
实操建议:
- 最小权限起步:先给
USAGE(隐式存在)+ 显式对象权限,例如:GRANT SELECT, INSERT ON mydb.users TO 'appuser'@'%'; - 若需
USE mydb,得确保用户有该库的SELECT权限(哪怕只查一张空表),或额外授SHOW DATABASES(不推荐) - 授权后必须刷新:
FLUSH PRIVILEGES;—— MySQL 8.0 不再自动刷新,漏掉这步权限就白配 - 注意 host 匹配:用户用
appuser@'192.168.1.100'连,但你授的是appuser@'%',没问题;但若授的是appuser@'localhost',远程连接就会被拒
用户能连上但报错 Authentication plugin ‘caching_sha2_password’ cannot be loaded
这是客户端不支持 MySQL 8.0 默认认证插件的表现,典型错误码 ERROR 2059,常见于 Navicat Premium 12.0.x、旧版 PHP mysqli 扩展、某些 Python MySQL 驱动。
实操建议:
- 优先改用户插件(比改全局配置更安全):
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'AppPass2026!'; - 改完立即刷新:
FLUSH PRIVILEGES; - 验证是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';,确认plugin列是mysql_native_password - 不要用
default_authentication_plugin=mysql_native_password改全局配置——这会影响所有新用户,削弱安全性
最易被忽略的点:host 匹配是精确字符串匹配,'appuser'@'%' 和 'appuser'@'localhost' 是两个完全独立的用户,权限互不影响;很多“本地连不上”的问题,其实是少建了一个 @'localhost' 用户。











