mysql 8.0+ 创建用户必须显式指定认证插件(如mysql_native_password),避免caching_sha2_password兼容性问题;grant需限定具体库名(如dev_app.),禁用.*;权限生效须执行flush privileges,并严格验证host匹配与实际操作限制。
create user 语句必须显式指定认证插件
mysql 8.0+ 默认用 caching_sha2_password,但 phpmyadmin 4.x 或部分旧客户端不支持,连不上就白搭。别依赖界面默认值,直接写 sql 控制插件类型。
先查当前配置:SELECT @@default_authentication_plugin;
- 返回
caching_sha2_password?建用户时必须加IDENTIFIED WITH mysql_native_password BY 'xxx' - 返回
mysql_native_password?可省略插件声明,但显式写出更稳妥、可读性更强 - Host 别填
%图省事——开发环境用'localhost'或具体 IP(如'192.168.1.100'),避免误暴露到公网
GRANT 权限必须限定到具体数据库名,不能用 *.*
给开发用户授 GRANT SELECT, INSERT, UPDATE, DELETE ON *.* 是高危操作:会把 information_schema、mysql、performance_schema 全部暴露,可能泄露账号哈希、表结构甚至配置项。
- 正确做法:先确认开发库名(比如
dev_app),再执行GRANT SELECT, INSERT, UPDATE, DELETE ON `dev_app`.* TO 'dev_user'@'localhost'; - 如果要用多个库,逐个 GRANT,不要用通配符;
GRANT ... ON `dev_%`.*看似方便,但新库自动获得权限,违反最小权限原则 - 记得补
USAGE权限(MySQL 5.7+ 自动附带,但 5.6 需显式GRANT USAGE ON *.* TO ...)
phpMyAdmin 图形界面容易漏掉 FLUSH PRIVILEGES
新版 MySQL(8.0.16+)已取消对 FLUSH PRIVILEGES 的强制依赖,但 5.7 及更早版本仍需手动刷新,否则权限不生效——这是开发环境最常卡住的点。
- phpMyAdmin 点“执行”后不会自动运行
FLUSH PRIVILEGES,哪怕你用了图形界面创建用户 - 验证方式:用新账号登录后执行
SHOW DATABASES;,只应看到被授权的库;如果看到全部库,大概率是没刷权限或 Host 不匹配 - 安全起见,统一加一句:
FLUSH PRIVILEGES;—— 多执行一次无副作用,少执行一次全白干
验证权限是否真受限,不能只靠 phpMyAdmin 界面
在 phpMyAdmin 里用新账号登录成功 ≠ 权限设置正确。界面本身会隐藏无权访问的库,掩盖真实限制效果。
- 必须用命令行或 DBeaver 这类中立客户端连接:
mysql -u dev_user -p -h 127.0.0.1(注意:Linux/macOS 下-h localhost走 socket,-h 127.0.0.1才走 TCP,两者权限记录不同) - 执行
DROP TABLE users;,应报错ERROR 1142 (42000): DROP command denied - 执行
SELECT * FROM mysql.user;,应报错ERROR 1142 (42000): SELECT command denied - 特别注意:如果
SHOW DATABASES;显示了未授权库,说明权限没生效,优先检查FLUSH PRIVILEGES和 Host 字符串是否完全一致('dev_user'@'localhost'≠'dev_user'@'127.0.0.1')
实际执行时最容易忽略的是 Host 匹配细节和 FLUSH PRIVILEGES 的时机——这两处出错,整个权限体系就形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











