创建用户必须用create user语句而非直接写mysql.user表,mysql 8.0+因元数据一致性校验会拒绝后续授权;授权需分步执行grant usage和grant all privileges on .,并加with grant option;建用户时应指定mysql_native_password插件以兼容php连接;远程连接需检查bind-address、防火墙及安全组配置。
创建用户时必须用 create user 而不是直接插 mysql.user 表
phpmyadmin 界面里点“用户账户”→“添加用户账户”,看起来能填完就生效,但底层如果跳过 create user 语句、直接往系统表写数据,mysql 8.0+ 会拒绝后续授权(报错 operation create user failed for 'xxx'@'%' )。这是因为新版本强制校验用户元数据一致性。
实操建议:
- 在 phpMyAdmin 的“SQL”标签页手动执行:
CREATE USER 'rw_global'@'%' IDENTIFIED BY 'your_strong_password';
- 不要勾选“使用文本字段创建用户”这种模糊选项
- 若已有同名残留用户,先用
DROP USER 'rw_global'@'%'清掉,再重建
授权必须分两步:先 GRANT USAGE,再 GRANT ALL PRIVILEGES ON *.*
很多人在 phpMyAdmin 点“全权限”后发现还是连不上,或者部分库没权限——因为界面默认只给当前选中的数据库授权,* 在这里不是通配符,而是字面意思的“当前数据库名”。想真正全局授权,必须显式指定 ON *.*。
实操建议:
- 执行授权语句,别依赖界面勾选:
GRANT USAGE ON *.* TO 'rw_global'@'%';<br>GRANT ALL PRIVILEGES ON *.* TO 'rw_global'@'%' WITH GRANT OPTION;
-
WITH GRANT OPTION是关键,否则该用户无法转授权限(比如给开发同事开临时库) - 执行完必须跟一句
FLUSH PRIVILEGES;,尤其在 MySQL 5.7 及更早版本中,缓存不刷新会导致权限延迟生效
MySQL 8.0+ 默认认证插件是 caching_sha2_password,PHP 连接可能失败
新建用户后,用 PHP mysqli 或 PDO 连接时报错 Client does not support authentication protocol requested by server,基本就是这个原因。phpMyAdmin 自己能连,不代表你的应用能连。
实操建议:
- 建用户时显式指定旧插件(兼容性优先):
CREATE USER 'rw_global'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
- 或升级 PHP 到 7.4+ 并确认
mysqli扩展已启用sha256_password支持(较麻烦,不推荐初试) - 检查当前用户实际用的插件:
SELECT plugin FROM mysql.user WHERE User = 'rw_global';
远程连接被拒?重点查 bind-address 和防火墙
账户建好了、权限给了、密码也对,但从本地 PHP 脚本连不上服务器上的 MySQL,90% 是网络层拦住了,和 phpMyAdmin 配置无关。
实操建议:
- 确认 MySQL 配置文件(通常是
/etc/mysql/mysql.conf.d/mysqld.cnf)里bind-address不是127.0.0.1,改成0.0.0.0或具体内网 IP - Linux 上跑
sudo ufw status,确保 3306 端口放行;云服务器还要进安全组补一条入向规则 - 测试是否通:从客户端机器运行
telnet your-server-ip 3306,不通就别折腾 SQL 权限了
权限体系本身不复杂,但 MySQL 版本差异、认证插件、网络配置、phpMyAdmin 界面逻辑这四层叠在一起,很容易卡在某一层以为是另一层的问题。最省事的方式:命令行建用户 + 命令行授权 + 命令行验证连通性,绕过所有界面幻觉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











