我正在 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/