MySQL Shell 导出导入(dump / load)速查
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:并行度,默认 4bytesPerChunk:分块大小,默认 64Mcompression:默认 zstd level 1,级别越高越省空间越慢checksum:默认关,大表迁移建议开consistent:默认开,一致性快照where/partitions:行过滤 / 分区过滤ddlOnly/dataOnly:只要结构 / 只要数据
导入
threads:并行度,默认 4deferTableIndexes:默认fulltext,大表设all提速最明显skipBinlog:默认 false,迁移时设 trueprogressFile/resetProgress:断点续传 / 强制重来loadDdl/loadData:分开控制结构与数据