最准最快比对MySQL用户权限的方式是直连两个实例执行SELECT host,user,authentication_string,ssl_type,ssl_cipher,x509_issuer,x509_subject,plugin,account_locked FROM mysql.user,必须同时比对host和user字段,因MySQL用户由'user'@'host'唯一确定,单查user会漏掉关键差异。

直接查 mysql.user 表,别绕路
比对用户权限差异最准、最快的方式就是直连两个 MySQL 实例,分别执行:SELECT host, user, authentication_string, ssl_type, ssl_cipher, x509_issuer, x509_subject, plugin, account_locked FROM mysql.user。注意:必须包含 host 和 user 两个字段——因为 MySQL 的用户身份是 'user'@'host' 组合唯一确定的,单看 user 会漏掉关键差异。
常见错误是只查 user 字段,结果发现两边都有 root 就以为一致,其实一边是 'root'@'localhost',另一边是 'root'@'%',权限完全不等价。
用 EXCEPT 或 LEFT JOIN 做集合差(MySQL 8.0+ 推荐 EXCEPT)
MySQL 8.0.19+ 支持 EXCEPT,可直接找出 A 环境有但 B 环境没有的用户记录:
SELECT host, user, authentication_string FROM mysql.user EXCEPT SELECT host, user, authentication_string FROM production.mysql.user;
如果用的是 MySQL 5.7,得改用 LEFT JOIN 模拟差集:
SELECT a.host, a.user, a.authentication_string FROM mysql.user a LEFT JOIN production.mysql.user b ON a.host = b.host AND a.user = b.user WHERE b.user IS NULL;
注意点:
-
authentication_string是密码哈希值,不是明文,比对它能确认是否为同一用户(避免同名不同密) - 别忽略
account_locked字段——生产环境常锁掉测试账户,这个状态差异容易被漏检 - JOIN 条件必须同时匹配
host和user,缺一不可
权限字段要逐层比对,不能只看 user 表
mysql.user 表只存全局权限(如 Select_priv, Insert_priv),但真实权限可能是叠加生效的:比如 user 表里 Select_priv='N',但 db 表里对某个库设了 'Y',那该用户对该库仍有 SELECT 权限。
所以完整比对至少要查三张表:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
mysql.user:全局权限(*.*) -
mysql.db:库级权限(db_name.*),重点比对Db,User,Host,Select_priv等字段 -
mysql.tables_priv:表级权限,尤其当有视图或敏感表单独授权时必须覆盖
典型坑:开发环境给 'dev_user'@'%' 开了 ALL PRIVILEGES ON *.*,而生产环境只给了 'app_user'@'192.168.10.%' 的 SELECT, INSERT on app_db.* ——表面看都是“有权限”,但粒度和范围天差地别。
用 mysqldump + diff 快速抓全量结构差异
如果只是快速摸底、不需要实时分析,可以用 mysqldump 导出权限元数据再做文本比对:
mysqldump -u root -p --no-data --skip-triggers mysql user db tables_priv columns_priv > perms_staging.sql
对两个环境分别导出,然后用 diff 或 VS Code 的 compare files 功能查看差异。优点是不用写 SQL,缺点是导出内容含建表语句和注释,需人工过滤无关行。
特别注意:mysqldump 默认不导出 mysql.procs_priv(存储过程权限),如有用到存储过程,得显式加上该表名;另外导出前确保连接用户有 SELECT 权限访问这些系统表,否则会静默跳过。
真正难的不是比出差异,而是判断哪些差异是预期的(比如测试库多几个调试账户)、哪些是配置漂移(比如生产库意外开了 FILE 权限)。每次比对后,得结合部署清单或 IaC 配置回溯变更来源。










