grants_server_a.sql" /> grants_server_a.sql">

mysql如何快速对比不同服务器的用户权限差异_导出权限表对比

云静酱_9620

云静酱_9620

2026-03-28

727人浏览

原创

最稳的mysql权限导出方式是用mysql客户端批量执行show grants:mysql -u root -p -nse "select concat('show grants for '', user, ''@'', host, '';') from mysql.user" | mysql -u root -p | sed 's/$/;/; s/\//g' > grants_server_a.sql

mysql如何快速对比不同服务器的用户权限差异_导出权限表对比

直接导出 MySQL 用户权限 SQL 语句(含 GRANT)

MySQL 没有内置“权限快照对比”命令,但 mysqldump 和 SELECT ... INTO OUTFILE 都不导出权限——真正能复现权限的只有 SHOW GRANTS。最稳的方式是用 mysql 客户端批量执行它。

在目标服务器上运行:

mysql -u root -p -Nse "SELECT CONCAT('SHOW GRANTS FOR \'', user, '\''@\'', host, '\';') FROM mysql.user" | mysql -u root -p | sed 's/$/;/; s/\\/\/g' > grants_server_a.sql

说明:-N 去除列名,-s 简洁输出,-e 直接执行;管道二次调用 mysql 执行每条 SHOW GRANTS,再用 sed 补分号、转义反斜杠。注意:必须用 root 或有 SELECT 权限于 mysql.user 的账号。

  • 别用 mysqldump --all-databases:它不导出 mysql.user 表的权限逻辑(比如密码哈希、plugin 字段不影响权限,但 SHOW GRANTS 是语义级授权表达)
  • 如果提示 Access denied for user 'xxx'@'localhost' (using password: YES),说明账号没查 mysql.user 表权限,换更高权限账号或加 GRANT SELECT ON mysql.user TO ...
  • SHOW GRANTS 输出含当前用户默认角色(8.0+),若跨版本对比,先确认双方是否启用 roles,否则差异会误判

过滤掉无关用户和通配符 host 导致的噪声

生产环境常存在 '%'、'192.168.%' 这类泛 host 用户,它们在不同服务器上可能指向不同实际访问来源,直接对比会刷屏无效差异。

导出前建议先筛出关键用户(如业务账号、DBA 账号):

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
mysql -u root -p -Nse "SELECT DISTINCT CONCAT('SHOW GRANTS FOR \'', user, '\''@\'', host, '\';') FROM mysql.user WHERE user IN ('app_rw', 'bi_ro', 'dba_admin') AND host NOT IN ('%', 'localhost', '127.0.0.1')" | mysql -u root -p > grants_clean.sql
  • host = 'localhost' 和 host = '127.0.0.1' 在 MySQL 中是两个不同账户(Unix socket vs TCP),但权限行为一致,对比时建议统一排除或显式保留
  • 避免用 WHERE host != '%':有些合法账号就是 'monitor'@'%',应按业务名单白名单过滤,而非黑名单
  • MySQL 8.0+ 的 mysql.role_edges 表会影响权限继承,若用了 roles,需额外导出 SELECT * FROM mysql.role_edges 并加入对比范围

用 diff 工具做语义级比对(不是字符串逐行)

diff grants_server_a.sql grants_server_b.sql 会因排序、空格、注释顺序失败。权限本质是“谁对哪些库表有哪几种操作”,应提取核心三元组:user@host + database.table + privileges。

推荐用 Python 快速归一化(无需安装包):

python3 -c "
import sys, re
for line in open(sys.argv[1]):
    m = re.match(r"GRANT (.+?) ON (.*?)(?= TO |$);", line)
    if m:
        priv, obj = m.groups()[0].strip(), m.groups()[1].strip()
        user_host = re.search(r"TO '([^']+)'@'([^']+)'", line)
        if user_host:
            print(f'{user_host[1]}@{user_host[2]}	{obj}	{priv.upper()}')
" grants_server_a.sql | sort > a_normalized.txt
  • 正则只捕获 GRANT 后的权限列表、作用对象、TO 后的用户,忽略 WITH GRANT OPTION 等修饰——它不改变权限本身,只影响授权能力
  • 用 sort 统一顺序后 diff a_normalized.txt b_normalized.txt,结果可读性强
  • 如果某行是 GRANT PROXY ON ''@'' TO 'u'@'h',它属于代理权限,需单独判断是否应纳入对比(通常不应,除非明确依赖 proxy)

注意 MySQL 版本间 GRANT 语法的隐性差异

MySQL 5.7 和 8.0 对权限表达不完全兼容。例如 CREATE TABLESPACE 在 5.7 是全局权限,在 8.0 被拆为 TABLESPACE;BACKUP_ADMIN 是 8.0 新增权限,5.7 服务器导出时根本不会出现。

对比前务必确认两端版本:

mysql -u root -p -e "SELECT VERSION();"
  • 用 SELECT * FROM information_schema.role_table_grants 替代 SHOW GRANTS 可获得更结构化输出,但仅 8.0.16+ 支持,且不含 role 继承链
  • 5.7 服务器导出的 USAGE 权限(空权限)在 8.0 中可能被省略,这不是差异,是版本行为变化
  • 若发现某权限在 A 服务器有、B 服务器无,先查 SELECT * FROM mysql.tables_priv WHERE user='xxx',确认是不是表级权限被漏导(SHOW GRANTS 默认不显示表级,除非显式 ON db.tbl)

权限对比不是比文件是否一样,而是比“执行效果是否等价”。一个 GRANT SELECT ON *.* 和一百个 GRANT SELECT ON db1.t1 + GRANT SELECT ON db2.t2… 在语义上可能完全等效,但 diff 会报巨量差异——这时候得退一步,看业务实际访问路径,而不是追着工具输出跑。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

457

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

940

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

3032

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

1016

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

909

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

474

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2776

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

5172

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

807

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习