MySQL权限管理对新手是否友好?
不适合直接上手。权限管理涉及用户、主机、数据库、表、列多个层级,且
GRANT和
REVOKE语句的语法容错率低,新手常因漏写
ON *.*、误用
IDENTIFIED BY或忽略
FLUSH PRIVILEGES导致权限不生效,反而怀疑自己连错了库或密码错了。
新手该从哪几个权限命令开始练?
只练三个最常用、副作用最小的组合,避免一上来就碰
CREATE USER或
WITH GRANT OPTION:
CREATE USER 'dev'@'localhost' IDENTIFIED BY '123';—— 仅创建本地用户,不赋任何权限
GRANT SELECT, INSERT ON mydb.* TO 'dev'@'localhost';—— 明确指定数据库名,不用
*.*
FLUSH PRIVILEGES;—— 每次改完权限必须执行,否则内存缓存不会更新
别试
GRANT ALL PRIVILEGES,它会把
FILE、
SHUTDOWN等高危权限也带上,本地开发环境都可能被意外触发。
为什么在Docker或Mac M1上容易权限报错?
因为默认连接主机名不一致:
localhost和
127.0.0.1在MySQL里是两个不同用户条目。Docker容器内用
mysql -h host.docker.internal连宿主MySQL时,实际走的是TCP,认证用的是
'user'@'%'或
'user'@'172.x.x.x',不是
'user'@'localhost'。常见错误信息:
Access denied for user 'dev'@'172.18.0.1'。
解决办法只有两条:
建用户时明确用通配符:CREATE USER 'dev'@'%' IDENTIFIED BY '123';(仅限学习环境) 或者连的时候强制走socket:
mysql -u dev -S /var/run/mysqld/mysqld.sock(前提是权限已赋予
'dev'@'localhost')
权限改完没效果?先查这三件事
权限不生效,90%不是SQL写错,而是环境认知偏差:
当前登录用户是root@localhost,但你改的是
dev@'%',得用
mysql -u dev -p重新登录才看得见效果
SHOW GRANTS FOR 'dev'@'localhost';输出里如果带
USING子句,说明启用了角色(Role),权限实际挂在角色上,得查
SHOW ROLES;再查角色权限 MySQL 8.0+ 默认启用
caching_sha2_password插件,旧客户端可能连不上新用户,错误信息是
Plugin caching_sha2_password could not be loaded,此时加
ALTER USER 'dev'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
权限系统本身不难,难的是每一步背后都有隐式上下文:当前连接方式、用户匹配顺序、插件机制、版本差异。不踩过至少两次
Access denied,很难真正记住
@后面那个主机名到底代表什么。
