MySQL:如何列出所有无权访问现有数据库的用户

标签 mysql sql

我正在 3 个不同的 mySQL 服务器(运行 5.0.51a-24+lenny5-log、5.5.54-0+deb7u2 和 5.6.35)上做一些“ Spring 大扫除”,有数百个数据库和数百个用户。

所以我正在寻找一个返回用户列表的查询,这些用户无权访问服务器上的任何现有数据库。

如果我查看 mysql.user,我可以看到服务器上的所有用户。到目前为止,一切都很好。现在,如果我查看 mysql.db,我可以看到它们与数据库的关系。所以我想得到结果,可以像这样简单:

SELECT * 
   FROM mysql.`user` tblusers
WHERE NOT EXISTS (SELECT * 
                     FROM mysql.`db` tbldbrelation
                     WHERE tblusers.User = tbldbrelation.User)

然而,由于关系未更新,当删除数据库时(据我所知),单独查看这两件事只会让我获得系统、服务和 root 用户等。我需要另一种方法。显然 show databases; 将返回当前服务器上的所有数据库。但是如何考虑到这一点 - 以便我获得无法访问任何现有特定数据库的用户列表?

最佳答案

我会使用 Percona Toolkit's pt-show-grants转储我所有的用户和他们的特权。然后查找除 USAGE 之外没有任何权限的用户。

例如,我刚刚在我的本地 MySQL 实例上创建了一个名为 dummy 的虚拟用户,但没有授予该用户对任何数据库的任何权限。

pt-show-grants 的输出:

$ pt-show-grants h=127.0.0.1
-- Grants dumped by pt-show-grants
-- Dumped from server 127.0.0.1 via TCP/IP, MySQL 8.0.0-dmr at 2017-02-25 18:35:54
-- Grants for 'dummy'@'127.0.0.1'
GRANT USAGE ON *.* TO `dummy`@`127.0.0.1`;
-- Grants for 'mysql.sys'@'localhost'
GRANT SELECT ON `sys`.`sys_config` TO `mysql.sys`@`localhost`;
GRANT TRIGGER ON `sys`.* TO `mysql.sys`@`localhost`;
GRANT USAGE ON *.* TO `mysql.sys`@`localhost`;
-- Grants for 'root'@'localhost'
GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION;
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION;

mysql.sys 用户和 root 用户是 MySQL 8.0 的标准配置。上面的行显示 dummy 具有 USAGE 权限,但没有其他权限。

关于MySQL:如何列出所有无权访问现有数据库的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42438956/

相关文章:

java - 在 MySQL JDBC 准备语句中使用 "zero"时间戳(在 WHERE 子句中)

php - 如何向 mySQL 表中插入多行

php - 如果列值具有自定义模板,如何在 MySQL 中搜索增加的值?

SQL - 从 Select + 用户定义的列和值创建表

sql - 如何连接多行的字符串?

mysql - 在一个查询中的同一字段上为一个日期和一段时间选择时间戳

mysql - 此SQL语句有什么问题-语法错误#1064?

sql - SUBSTRING 和 SUBSTR 函数 (SQL) 之间有什么区别?

mysql - SQL INNER JOIN 没有返回我需要的内容

mysql - 无法在 mysql 中创建关系 - 在 id_produk 上创建外键时出错(检查数据类型)