mysqldump导出文件能否成功导入,取决于目标库是否具备INSERT、CREATE、DROP、ALTER等权限,具体需根据SQL内容确定;仅SELECT权限不足,常见错误如ERROR 1142或1044即因权限缺失。
mysqldump 导出文件能否导入,取决于目标
库的权限组合单纯有 SELECT 权限不够,INSERT、CREATE、DROP、ALTER 这几类权限缺一不可,具体看 SQL 文件内容。比如含 DROP TABLE 语句就必须有 DROP;建新表要 CREATE;加索引或改字段需 ALTER;写入数据当然要 INSERT。
常见错误现象:
ERROR 1142 (42000): INSERT command denied to user 'xxx'@'%' for table 't1'或
ERROR 1044 (42000): Access denied for user 'xxx'@'%' to database 'db1',基本都是权限缺失导致的。
mysqldump --no-create-info,只需 INSERT(和 LOCK TABLES,如果用了 --lock-tables)CREATE DATABASE 语句,用户还需 CREATE 数据库权限(即 CREATE on *.*)mysql --force 不会绕过权限检查,只会跳过单条语句报错继续执行GRANT 语句中哪些权限项对应恢复操作运维中常误以为给 ALL PRIVILEGES 最省事,但生产环境应最小化授权。以下是按恢复场景拆解的关键权限:
SELECT:仅用于 mysqldump 导出,恢复时不强制需要INSERT、UPDATE、DELETE:写入/修正数据必需CREATE、DROP、ALTER:重建表结构必需(不含 --no-create-info 时)INDEX:若 dump 含 CREATE INDEX,需此权限LOCK TABLES:部分 dump 场景(如未用 --single-transaction)会显式加锁典型最小化授权示例(针对数据库 myapp):
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, LOCK TABLES ON `myapp`.* TO 'restore_user'@'%';
mysqlpump 或 mydumper 恢复时权限是否有差异有差异。mysqlpump(MySQL 5.7+)默认并行导出,恢复时若启用 --set-gtid-purged=OFF 或涉及 mysql 系统库,可能触发额外权限校验;mydumper 是第三方工具,其恢复脚本(myloader)本身不校验权限,但执行 SQL 时仍受 MySQL 服务端权限控制。
mysqlpump --skip-definer 可避免因 DEFINER 用户不存在导致的权限拒绝myloader 默认不自动 CREATE DATABASE,需提前建库或加 -d 参数指定目录,否则报错与权限无关,而是路径或库不存在REPLICATION CLIENT 权限(查看 gtid_executed),否则 SET GTID_PURGED 语句会失败用 mysqlbinlog 解析后重放,核心不是“导入”,而是“执行 SQL”,所以权限要求和普通 SQL 执行一致,但有两个特殊点:
CREATE USER、GRANT 等 DDL,需 CREATE USER 和 GRANT OPTION 权限 —— 这两点常被遗漏binlog_format = ROW 时,mysqlbinlog --base64-output=DECODE-ROWS 输出的是伪 SQL,实际执行仍走 row-based 逻辑,权限校验发生在 event 解析阶段,而非语句文本层面--start-datetime / --stop-datetime)不增加权限需求,但若跨 GTID 集合,需 REPLICATION SLAVE 权限才能查询 performance_schema.replication_applier_status_by_coordinator(仅调试用,非恢复必需)真正卡住的往往不是权限,而是 binlog 事件里隐含的库表不存在、字符集不匹配、外键约束冲突 —— 这些问题权限再高也解决不了。