pt-show-grants导出的sql不能直接source执行,因其含已弃用的identified by password语法、可能冲突的系统账户及create user语句;需加--skip-anonymous、--ignore和--no-create-user参数,并手动创建用户、执行flush privileges。

pt-show-grants 是导出 MySQL 5.7 所有用户授权语句最直接的方式,但它默认输出的脚本不能直接在目标库上 source 执行——必须先确认连接权限、跳过系统账户、处理密码哈希兼容性。
为什么不能直接用 pt-show-grants 导出的 SQL 恢复权限
导出文件里每段都以 CREATE USER IF NOT EXISTS 开头,接着是 ALTER USER ... IDENTIFIED BY PASSWORD 和 GRANT。问题在于:
-
IDENTIFIED BY PASSWORD语法在 MySQL 5.7.6+ 已被标记为 deprecated,部分严格模式实例会报ERROR 1064 - 若目标库已存在同名用户(比如
'app'@'%'),CREATE USER IF NOT EXISTS不报错,但后续ALTER USER ... IDENTIFIED BY PASSWORD可能因插件不匹配或哈希格式异常失败 -
pt-show-grants默认包含mysql.session、mysql.sys等系统账户,这些账号在新实例中通常已存在且不应覆盖
导出前必须加的关键参数
运行命令时至少要带上这三项,否则生成的脚本大概率执行失败:
-
--skip-anonymous:跳过空用户名(''@'localhost'),避免权限冲突和语法风险 -
--ignore='mysql.session'@'localhost','mysql.sys'@'localhost':显式排除系统内置账户(MySQL 5.7 中这两个账号必须存在且受保护) -
--no-create-user:去掉所有CREATE USER行,只保留GRANT—— 这样你就能先手动确保用户存在,再授予权限,更可控
完整示例:pt-show-grants --host=localhost --user=root --password=xxx --skip-anonymous --ignore='mysql.session'@'localhost','mysql.sys'@'localhost' --no-create-user > grants_57.sql
执行前要手工补上的两件事
导出的 grants_57.sql 缺少两个关键环节,必须人工介入:
- 用户必须已存在:对每个要授予权限的账号,先执行
CREATE USER 'u'@'h' IDENTIFIED BY 'pwd';(注意不要用IDENTIFIED BY PASSWORD,直接明文密码更稳妥) - 需要显式
FLUSH PRIVILEGES;:虽然GRANT语句本身会刷新权限缓存,但在 MySQL 5.7 中,如果之前用户是通过 INSERT 到mysql.user创建的(非 CREATE USER),GRANT可能不生效,补一句FLUSH PRIVILEGES;更保险
建议把这两步写进脚本头部,例如:
CREATE USER 'app_rw'@'10.20.%' IDENTIFIED BY 'secret123';<br>FLUSH PRIVILEGES;<br>GRANT SELECT,INSERT ON mydb.* TO 'app_rw'@'10.20.%';
容易被忽略的兼容性细节
MySQL 5.7 对认证插件和密码哈希的处理比 8.0 宽松,但仍有隐性坑:
- 如果源库用户用了
caching_sha2_password(极少见,5.7.29+ 才支持),pt-show-grants会原样导出IDENTIFIED WITH 'caching_sha2_password' AS 'xxx',但目标库若未启用该插件,会报错;此时需提前运行INSTALL PLUGIN caching_sha2_password SONAME 'auth_socket.so';或改用mysql_native_password -
SHOW GRANTS不返回 PROXY 权限,pt-show-grants默认也不导出;如需迁移代理权限,得单独查mysql.proxies_priv表并手写GRANT PROXY语句 - 输出中的反斜杠转义(如
'user\@host')在 source 时可能被 shell 解析错误,建议加--no-quote-names参数避免
真正安全的迁移不是靠一次导出,而是先验证用户是否存在、密码是否可登录、再逐条授予权限——pt-show-grants 只负责把 SHOW GRANTS 格式化好,剩下的逻辑控制权得握在你自己手里。











