SHOW GRANTS 是查看当前用户权限最简单可靠的方式,输出可复用的授权语句;它默认基于 CURRENT_USER(),需配合 SELECT CURRENT_USER(), USER() 区分认证账号与连接声明;查他人权限须指定 'user'@'host' 并具备 SUPER 或 mysql.user 表 SELECT 权限;权限分全局、库、表、列四级存储于对应系统表,低层权限补足高层未授予部分但不覆盖显式拒绝。
直接执行
就能看到当前权限
这是最简单也最可靠的方式——只要你能成功登录 MySQL,哪怕没有
权限查系统表,也能立刻看到自己实际拥有的全部权限语句。
它输出的是可直接复用的授权语句,比如:
说明你对
库有读写权;如果只看到
,那基本等于“没权限”。
默认查的是
(即权限系统认定的那个账号),不是你登录时填的
想确认到底匹配了哪个账号?先运行
—— 前者是生效账号(如
),后者是你声明的连接信息(如
)
MySQL 8.0+ 启用角色后,
不显示角色继承来的权限,得额外查
表
查别人权限必须写全
,缺一不可
很多人卡在这步:执行
报错
。原因就是没带
。
MySQL 认证靠的是
这一对组合,单独用户名不唯一——同一个
可能在
、
、
上有完全不同的权限
不确定 host 是什么?先查:
执行
查他人权限,需要你有
权限,或至少有
权限访问
表,否则会被拒绝
权限到底存在哪?别只信
的输出
当你要批量判断某类权限是否启用(比如确认所有用户都禁用了
),光看
输出再解析字符串,既慢又容易漏——底层权限字段更直接。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
全局权限存在
表里,看
、
、
这些布尔字段
数据库级权限在
,表级在
,列级在
注意:
里查不到的权限(比如只给了某个库的
),不代表没权限,只是不在全局表里
权限层级影响范围,不理解就容易误判“为什么没权限”
MySQL 权限是分层叠加的:全局 > 数据库 > 表 > 列。低层级权限不会覆盖高层级的拒绝(DENY),但会补足高层级未授予的部分。
比如你在全局给了
,又在
库显式
,那对该库就真没
权了
但反过来:全局没给
,只在
库给了
,那你只能在
里建表
执行
会把各层权限合并列出,但不会告诉你哪条来自哪一层——要精确定位,还得结合
等表查
角色权限、host 匹配细节、权限表字段含义——这些点不翻源码也很难一次理清,但日常运维中只要记住:权限永远以
为准,
是起点,不是终点。
SHOW GRANTSSELECTGRANT SELECT, INSERT ON `appdb`.* TO 'webuser'@'%'appdbGRANT USAGE ON *.* TO 'guest'@'localhost'SHOW GRANTS;CURRENT_USER()USER()SELECT CURRENT_USER(), USER();'admin'@'%''admin'@'192.168.5.22'SHOW GRANTSmysql.role_edges'username'@'host'SHOW GRANTS FOR 'api_user';ERROR 1141 (42000): There is no such grant defined for user 'api_user' on host '%'@'host'user@hostapi_user'%''10.0.0.%''localhost'SELECT User, Host FROM mysql.user WHERE User = 'api_user';SHOW GRANTS FORSUPERSELECTmysql.userSHOW GRANTSDROPSHOW GRANTSmysql.userSelect_privDrop_privCreate_privmysql.dbmysql.tables_privmysql.columns_privmysql.userSELECTSELECTtestdbREVOKE SELECTSELECTCREATEmyappCREATEmyappSHOW GRANTSmysql.dbCURRENT_USER()SHOW GRANTS