不用担心。
该mysql.user
表减轻了对所有数据库的特定全局权限。
如果用户仅限于特定数据库,您将只能在 mysql.db 表中看到特定于数据库的授权。受限于数据库的用户不需要 SUPER、PROCESS、SHUTDOWN 和类似的权限。
如果您创建一个具有全局权限的用户(从而使该用户登陆mysql.user
),您不能只为了将用户降级到特定数据库而撤销全局权限。如果您尝试使用 REVOKE 命令执行此操作,您将看到用户在mysql.user
所有列上具有原始 Y 值,而同一用户在mysql.db
数据库特定权限上具有 Y 值。
您必须完全删除用户并使用较低权限创建新用户。
这是基于评论的示例
mysql> show grants for advdb@'%';
+-----------------------------------------------------------------------------+
| Grants for advdb@% |
+-----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'advdb'@'%' IDENTIFIED BY PASSWORD '................' |
| GRANT ALL PRIVILEGES ON `advertpro`.* TO 'advdb'@'%' |
+-----------------------------------------------------------------------------+
GRANT USAGE 只是让您知道身份验证涉及的 MD5 密码(如果密码不为空)。请注意,advdb 可以从任何 IP 地址登录,并且只能访问 advertpro 数据库。
除非您希望用户查看进程列表中的所有进程,甚至是属于其他进程的进程,否则用户不需要PROCESS特权。
用户不需要SUPER权限,除非您希望用户写入只读 mysql 实例、启动和停止复制、zap 二进制日志等。
除非您希望用户从操作系统命令行用户 mysqladmin 客户端程序关闭 mysql,否则用户不需要SHUTDOWN权限。
要复制您正在寻找的 priv,
SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%';
- 将输出复制到文本文件
- 将主机编辑为 xxx.xxx.xxx.xx
- 添加分号
- 将其粘贴到另一台服务器
好的,让我们破解一下:
UPDATE mysql.db
SET host='xxx.xxx.xxx.xxx'
WHERE user='myuser'
AND host='xxx.xxx.%'
AND db='somedb';
FLUSH PRIVILEGES;
这个应该吧!!!
要在 SQL 中转储 MySQL 授权,您可以使用pt-show-grantspt-show-grants
移植 mysql 授权要好得多。
这是我个人对 pt-show-grants 所做的模拟
mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql