跳到正文

MySQL Shell 导出导入(dump / load)速查

返回

MySQL Shell 导出导入(dump / load)速查

MySQL :: Download MySQL Shell

MySQL Shell 的 dump/load 是 MySQL 官方自带的多线程逻辑导出导入器——一条 util.dumpTables 多线程把整表切成压缩分块导出成文件,一条 util.loadDump 多线程用 LOAD DATA 灌进目标库,导入侧支持断点续传。

命令统一形式(导出/导入都是 mysqlsh --uri 账号@主机:端口 --js -e '...',参数解释直接写在参数后面):

mysqlsh --uri admin@src:3306 --js -e '
util.dumpTables("库名", ["表数组"], "/输出目录", { 参数 })'

一、导出

1. 导一张表 / 几张表(最常用)

mysqlsh --uri root@localhost:3306 --js -e '
util.dumpTables(
  "库名",                        // 要导出的 schema
  ["表数组"],                    // 要导出的表,如 ["t1","t2"];导整个库用 [] 且 all:true
  "/data/dump/t",                // 输出目录:必须不存在或为空
  {
    threads: 8,                  // 并行线程,默认 4,建议 1~2 倍 vCPU
    bytesPerChunk: "128M",       // 每块大小,默认 64M;越小越并行、文件数越多
    compression: "zstd;level=3", // 压缩:zstd(默认,level 1~22) / gzip / none
    checksum: true,              // 生成 @.checksums.json,导入时可校验(默认关,建议开)
    consistent: true,            // 一致性快照,默认开;数据一致性仅保证 InnoDB
    showProgress: true           // 显示进度
  }
)'

2. 导整个库

mysqlsh --uri admin@src:3306 --js -e '
util.dumpSchemas(
  ["库名"],                      // 一个或多个 schema,如 ["db1","db2"]
  "/data/dump/db",               // 输出目录,必须为空
  { threads: 8, compression: "zstd;level=3", checksum: true }
)'

3. 导整个实例

mysqlsh --uri admin@src:3306 --js -e '
util.dumpInstance(
  "/data/dump/full",             // 输出目录,必须为空
  {
    threads: 8,
    users: false,                // 是否带用户和授权(默认 true,云上通常关掉)
    includeSchemas: ["库名"],    // 只导指定库;或改用 excludeSchemas 排除
    compression: "zstd;level=3"
  }
)'

4. 大表分片导出(可替代“断点续传”)

mysqlsh --uri admin@src:3306 --js -e '
util.dumpTables(
  "库名", ["表数组"], "/data/dump/t_1",
  {
    threads: 8,
    where: { "库名.表": "id >= 1000000 AND id < 2000000" }, // 二选一:按主键区间切片
    // partitions: { "库名.表": ["p1","p2"] },              // 二选一:只导指定分区
    checksum: true
  }
)'

每片输出到独立目录,失败只重跑那一片;导入时第一片带 DDL,后续片设 loadDdl: false 只灌数据。


二、导入

目标端必须 local_infile=ON(loadDump 内部走 LOAD DATA LOCAL INFILE)。

mysqlsh --uri admin@dst:3306 --js -e '
util.loadDump(
  "/data/dump/t",                     // 导出目录(或 S3/OCI/Azure 前缀)
  {
    threads: 16,                      // 并行加载线程,默认 4
    deferTableIndexes: "all",         // 二级索引最后建:off / fulltext(默认) / all
    skipBinlog: true,                 // 会话内 SET sql_log_bin=0,导入提速
    loadDdl: true,                    // 是否执行 DDL;分片续灌时后续片设 false
    loadData: true,                   // 是否灌数据
    schema: "新库名",                  // 可选:换一个目标 schema
    progressFile: "/data/dump/p.json",// 进度文件;默认 dump 目录下 load-progress-<uuid>.json
    resetProgress: false,             // true = 清空进度从头再来
    ignoreVersion: true,              // 非连续大版本(如 8.0→8.4)才需要
    sessionInitSQL: [                 // 每条连接先执行的 SQL
      "SET SESSION foreign_key_checks=0;",
      "SET SESSION unique_checks=0;"
    ],
    showProgress: true
  }
)'

断点续传:中断后重跑同一条命令即可,已完成对象/分块自动跳过;只有 resetProgress: true 才从头来。

为什么没写表名:loadDump 的入参是“目录”,不是表——目录里有什么由 @.json 元数据决定,默认全量还原。只导部分表用 includeTables(精确表名,用 dump 里的原库名限定),排除用 excludeTables;只导结构/只导数据用 loadDdl/loadData。


三、导出目录里有什么

文件 含义
@.done.json 完成标记;存在即表示这次 dump 成功(可当续跑判断依据)
@.json 元数据:版本、GTID 位点等
库@表@@0.tsv.zst 数据分块(默认 zstd 压缩,@@0 为块号)
@.checksums.json 校验和,checksum: true 时生成,导入时校验完整性
load-progress-<uuid>.json 导入进度文件,续传依据

四、参数速记(一句话一个)

导出

  • threads:并行度,默认 4
  • bytesPerChunk:分块大小,默认 64M
  • compression:默认 zstd level 1,级别越高越省空间越慢
  • checksum:默认关,大表迁移建议开
  • consistent:默认开,一致性快照
  • where / partitions:行过滤 / 分区过滤
  • ddlOnly / dataOnly:只要结构 / 只要数据

导入

  • threads:并行度,默认 4
  • deferTableIndexes:默认 fulltext,大表设 all 提速最明显
  • skipBinlog:默认 false,迁移时设 true
  • progressFile / resetProgress:断点续传 / 强制重来
  • loadDdl / loadData:分开控制结构与数据


分享这篇文章: