mysql 8.0 不支持 create user ... like 语法,该语句会报错 error 1064;正确做法是用 show grants 获取原用户权限,再通过 create user 和 grant 显式创建并授权新用户。

MySQL 8.0 不支持 CREATE USER ... LIKE 语法
直接说结论:CREATE USER 'newuser'@'%' LIKE 'olduser'@'%' 在 MySQL 8.0 中**根本不存在**,也不被解析。你执行会报错 ERROR 1064 (42000): You have an error in your SQL syntax。这个语法是某些人误传或混淆了 MariaDB 的功能(MariaDB 10.2+ 支持 CREATE USER ... LIKE),但 MySQL 官方从未实现它。
真正可用的权限克隆路径:用 SHOW GRANTS + CREATE USER + GRANT
这是 MySQL 8.0 兼容性最好、最可控的方式,不依赖插件,不碰系统表,避免哈希/认证插件不匹配问题。
- 先创建空用户(显式指定认证插件,防默认
caching_sha2_password导致旧客户端连不上):CREATE USER 'newuser'@'%' IDENTIFIED WITH mysql_native_password BY 'strongpass'; - 查出原用户的全部授权语句:
SHOW GRANTS FOR 'olduser'@'%'; - 把返回的每条
GRANT ... TO 'olduser'@'%'中的用户名替换成'newuser'@'%',然后执行——注意:如果原语句含WITH GRANT OPTION,目标用户必须已存在(上一步已满足) - 若原用户有角色(
SET DEFAULT ROLE或被授予角色),还需额外执行:SELECT * FROM mysql.role_edges WHERE TO_HOST = '%' AND TO_USER = 'olduser';,再对匹配的FROM_USER执行GRANT ROLE ... TO 'newuser'@'%';
为什么不能直接 INSERT INTO mysql.user 或 dump mysql 库
MySQL 8.0 的 mysql.user 表结构比 5.7 多了至少 5 个字段(如 password_reuse_history, password_require_current),且密码存储格式与认证插件强绑定。
- 直接 INSERT 会因字段缺失或类型不匹配失败
- 即使字段对齐,
caching_sha2_password生成的哈希值在低版本 MySQL 或旧客户端上无法验证 -
mysqldump mysql导出的 INSERT 语句在 8.0+ 上基本不可重放,FLUSH PRIVILEGES也不会自动触发 - 跳过权限表校验(如启用了
skip-grant-tables)会导致新用户无权执行任何操作
远程克隆插件和用户权限迁移无关
CLONE 插件(INSTALL PLUGIN clone SONAME 'mysql_clone.so')作用是**物理复制整个实例数据目录**,包括所有数据库、表、系统表内容,但它不会“智能识别并复用某个用户的权限配置”。它克隆的是磁盘文件,不是逻辑权限模型。
- 如果你用
CLONE INSTANCE FROM 'user@host:port',目标实例会得到源实例的完整mysql.user表快照——但这属于整库迁移场景,不是“给新用户克隆某一个旧用户的权限” - 这种做法会覆盖目标实例原有用户,无法做增量权限合并,且要求两端 MySQL 版本、插件、字符集高度一致
- 日常运维中,为单个用户复制权限,用
SHOW GRANTS流程更轻量、可审计、可回退
真正容易被忽略的是 host 匹配细节:比如 'user'@'192.168.%' 和 'user'@'localhost' 是两个完全独立的账号,权限不互通;新用户若写成 'user'@'%',可能因 skip_name_resolve 关闭而触发 DNS 反查失败——这些都得手动核对,没法靠“克隆”自动解决。











