mysql 8.0 中无内置 clone user 命令,必须用 mysqlpump --exclude-databases=% --users 导出全量用户与权限,该方式自动适配 caching_sha2_password 插件并生成可执行的 create user + grant 语句,而 mysqldump --all-databases 不导出 mysql.user 表导致权限丢失。

直接克隆用户权限在 MySQL 8.0 中没有内置的 CLONE USER 命令,必须手动导出 + 导入权限语句;用 mysqlpump --users 是最稳的方式,比拼 SELECT from mysql.user 更少踩坑。
用 mysqlpump --users 导出全量用户与权限
这是 MySQL 8.0+ 官方推荐、真正能还原 caching_sha2_password 密码哈希和插件配置的方式,不是“看起来像”,而是执行后就能登录。
-
mysqlpump --exclude-databases=% --users -u root -p > users.sql—— 必须加--exclude-databases=%,否则会尝试 dump 所有库,失败且慢 - 执行账号需有
SYSTEM_USER或root权限,普通BACKUP_ADMIN不够,mysqlpump需要读mysql系统库元数据 - 输出的
users.sql包含CREATE USER+GRANT+SET PASSWORD(如适用),且自动适配认证插件格式 - 别用
mysqldump --all-databases:它默认跳过mysql.user表,权限全丢
导入前必须清理目标环境的同名用户
开发环境常复用测试实例,若目标库已有同名用户(如 'devuser'@'%'),直接 source users.sql 会报错中断,因为 CREATE USER 不带 IF NOT EXISTS(mysqlpump 默认不加)。
- 先删旧用户:
DROP USER IF EXISTS 'devuser'@'%';(逐个或写脚本批量处理) - 或者手动编辑
users.sql,把每条CREATE USER改成CREATE USER IF NOT EXISTS - 注意过滤系统用户:
mysql.session、mysql.sys不该导进开发库,导入前 grep 删除对应行,否则可能引发启动异常
GRANT ALL PRIVILEGES 不等于“所有权限”
即使你给新用户执行了 GRANT ALL PRIVILEGES ON *.* TO 'devuser'@'%',它也不包含 CLONE_ADMIN、BACKUP_ADMIN、REPLICATION CLIENT 这类管理权限——这些必须显式追加。
- 开发环境若需调试克隆或主从,补上:
GRANT CLONE_ADMIN, BACKUP_ADMIN, REPLICATION CLIENT ON *.* TO 'devuser'@'%'; -
@'%'和@'localhost'是两个账户,开发时本地连接常用127.0.0.1,结果匹配到@'localhost',但你只建了@'%'→ 连不上。建议统一建@'%'并确认bind_address = 0.0.0.0 - 导入后执行
FLUSH PRIVILEGES;,MySQL 8.0 不自动重载权限变更
最易被忽略的是:权限导对了,但客户端连不上,大概率是 caching_sha2_password 插件不兼容(比如老版 MySQL Connector/J 或某些 ORM),不是权限问题,得换驱动或临时改用户插件为 mysql_native_password。











