当前位置:首页 > 问答 > 正文

想知道MySQL权限怎么查?教你快速看懂数据库里用户的那些权限细节

想知道你手里的MySQL用户到底能干什么吗?他能不能删库?能不能看别人的表?能不能随便创建新数据库?这些问题,光靠猜可不行,今天就直接教你几招,像查户口一样,把数据库里用户的权限细节看得明明白白。

你得知道去哪查,MySQL把所有用户和权限的重要信息都放在一个叫“mysql”的数据库里(根据MySQL官方文档,系统权限信息主要存储在mysql系统库的特定表中),你可以把它想象成MySQL的“人事档案室”,第一步就是进入这个档案室:

USE mysql;

进了档案室,你会发现好几个装着权限信息的“文件柜”,最主要的有两个:user表和db表(参考MySQL官方文档对权限表系统的描述)。

第一个文件柜:user表(查全局权限)

user表记录的是用户的“全局权限”,啥叫全局权限?就是这个权限一旦给你,你就对MySQL服务器上所有数据库的所有表都拥有这个权力,比如SELECT权限要是给勾上了,你就能查询所有数据库的所有表;DELETE权限要是给了,那你就能删除所有数据,这非常危险。

怎么查呢?你可以用这个简单的命令看看某个用户的全局权限概况:

SELECT * FROM user WHERE user='你的用户名';

你想查用户名叫 ‘xiaoming’ 的权限,就把命令里的‘你的用户名’换成‘xiaoming’,执行后,你会看到一行长长的结果,里面有很多字段,字段名就是各种权限,比如Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv等等,这些字段的值通常是 ‘Y’ 或 ‘N’。‘Y’ 就代表有这项全局权限,‘N’ 就是没有。

但这样看太累了,眼花缭乱的,有个更聪明的看法,直接用MySQL自带的一个命令叫SHOW GRANTS(根据MySQL官方文档,SHOW GRANTS语句用于显示分配给MySQL用户账户的权限和角色),这个命令能把权限用更接近SQL语句的方式显示出来,特别直观。

你只需要在命令行里输入:

SHOW GRANTS FOR '你的用户名'@'主机名';

这里要特别注意这个‘主机名’,在MySQL里,光有用户名还不行,还得指定这个用户是从哪台电脑登录的,两者合起来才能唯一确定一个用户,比如很多本地用户的主机名是 ‘localhost’,表示只能从本机登录,如果你创建用户时没指定,或者记不清了,可以先执行 SELECT user, host FROM user; 看看都有哪些用户和主机组合。

举个例子,你查一个常用用户:

SHOW GRANTS FOR 'root'@'localhost';

结果可能会显示类似这样一句:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION

这句的意思可就大了:ON *.* 前面的星号点星号,第一个星号代表所有数据库,第二个星号代表所有表。ON *.* 就是针对整个MySQL服务器上所有的东西。ALL PRIVILEGES 就是所有权限,连起来就是:用户 ‘root’ 从 ‘localhost’ 登录,拥有管理整个MySQL服务器的最高权限,想干嘛干嘛(包括能把权限再给别人,WITH GRANT OPTION 就是干这个的)。

第二个文件柜:db表(查数据库级权限)

如果user表里大多数全局权限都是‘N’,那不代表这个用户没权限,他可能拥有特定数据库的权限,这些信息就记录在db表里。

你可能给用户 ‘xiaoming’ 设置了只对 ‘website’ 这个数据库有所有权限,但对其他数据库没权限,这时你查user表,他啥全局权限都没有,但查db表就能发现:

SELECT * FROM db WHERE user='xiaoming';

或者,依然用更直观的SHOW GRANTS命令:

SHOW GRANTS FOR 'xiaoming'@'%';

结果可能会显示:

GRANT USAGE ON *.* TO 'xiaoming'@'%'
GRANT ALL PRIVILEGES ON `website`.* TO 'xiaoming'@'%'

这里你看,第一句 GRANT USAGE ON *.* 基本上就是个占位符,意思是对所有数据库只有最基本的连接权限,没啥实际权力,关键在第二句:ONwebsite,这明确指出了权限范围是名叫 website 的这个数据库下的所有表(*代表所有表)。ALL PRIVILEGES 表示在这个数据库内拥有全部操作权限。

除了数据库级别的,还有更细的权限,比如对某个特定表的权限(记录在tables_priv表里),甚至对表中特定列的权限(记录在columns_priv表里),这些精细的权限控制,用SHOW GRANTS命令通常也能展示出来。

怎么看懂SHOW GRANTS的结果?

所以你以后查权限,就认准SHOW GRANTS命令就行,看懂结果主要抓住三点:

  1. 给谁: FOR '用户名'@'主机名',确认是不是你要查的那个人。
  2. 范围: ON 后面跟的东西。
    • :整个服务器,所有库所有表。
    • 数据库名.*:某个特定数据库的所有表。
    • 数据库名.表名:某个特定数据库的特定表。
  3. 能干嘛: GRANT 后面跟的权限列表。
    • ALL PRIVILEGES:在指定范围内的所有权限。
    • SELECT, INSERT, UPDATE:逗号分隔的一些具体权限。

想知道MySQL用户权限,别瞎猜,直接上SHOW GRANTS FOR '用户名'@'主机名';这个命令,它就像一面照妖镜,能把用户身上所有的权限细节照得清清楚楚,是能管理整个服务器的“超级大王”,还是只能操作某个数据库的“一方诸侯”,或者是只能看看某个表的“小兵”,一看便知,这样无论是管理数据库还是排查问题,心里都有底了。

想知道MySQL权限怎么查?教你快速看懂数据库里用户的那些权限细节