使用 Dumpling 导出数据

    要快速了解 Dumpling 的基本功能,建议先观看下面的培训视频(时长 28 分钟)。注意本视频只作为功能介绍、学习参考,具体操作步骤和最新功能,请以文档内容为准。

    你可以通过下列任意方式获取 Dumpling:

    • TiUP 执行 tiup install dumpling 命令。获取后,使用 tiup dumpling ... 命令运行 Dumpling。
    • 下载包含 Dumpling 的 tidb-toolkit 安装包

    更多详情,可以使用 —help 选项查看,或参考 。

    使用 Dumpling 时,需要在已经启动的集群上执行导出命令。

    TiDB 还提供了其他工具,你可以根据需要选择使用:

    • 如果需要直接备份 SST 文件(键值对),或者对延迟不敏感的增量备份,请使用备份工具 BR
    • 如果需要实时的增量备份,请使用 。
    • 所有的导出数据都可以用 TiDB Lightning 导回到 TiDB。

    注意

    PingCAP 之前维护的 Mydumper 工具 fork 自 ,针对 TiDB 的特性进行了优化。关于 Mydumper 的更多信息,请参考 v4.0 版 Mydumper 使用文档。Mydumper 目前已经不再开发新功能,其绝大部分功能已经被 取代,请切换到 Dumpling。

    相比 Mydumper,Dumpling 做了如下改进:

    • 支持导出多种数据形式,包括 SQL/CSV。
    • 支持全新的 table-filter,筛选数据更加方便。
    • 支持导出到 Amazon S3 云盘。
    • 针对 TiDB 进行了更多优化:
      • 支持配置 TiDB 单条 SQL 内存限制。
      • 针对 TiDB v4.0.0 及更新版本支持自动调整 TiDB GC 时间。
      • 使用 TiDB 的隐藏列 _tidb_rowid 优化了单表内数据的并发导出性能。
      • 对于 TiDB 可以设置 的值指定备份数据的时间点,从而保证备份的一致性,而不是通过 FLUSH TABLES WITH READ LOCK 来保证备份一致性。
    • SELECT:导出目标表时需要。
    • RELOAD:使用 consistency flush 时需要。注意,只有 TiDB 支持该权限,当上游为 RDS 或采用托管服务时,可忽略该权限。
    • REPLICATION CLIENT:导出 metadata 记录数据快照点时需要,可选,如果不需要导出 metadata,可忽略该权限。

    导出为 SQL 文件

    本文假设在 127.0.0.1:4000 有一个 TiDB 实例,并且这个 TiDB 实例中有无密码的 root 用户。

    Dumpling 默认导出数据格式为 SQL 文件。也可以通过设置 --filetype sql 导出数据到 SQL 文件:

    以上命令中:

    • -h-P-u 分别代表地址、端口、用户。如果需要密码验证,可以使用 -p $YOUR_SECRET_PASSWORD 将密码传给 Dumpling。
    • -o(或 --output)用于选择存储导出文件的目录,支持本地文件路径或。
    • -t 用于指定导出的线程数。增加线程数会增加 Dumpling 并发度提高导出速度,但也会加大数据库内存消耗,因此不宜设置过大。一般不超过 64。
    • -r 用于指定单个文件的最大行数,指定该参数后 Dumpling 会开启表内并发加速导出,同时减少内存使用。当上游为 TiDB 且版本为 v3.0 或更新版本时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值不影响划分算法。对上游为 MySQL 且表的主键是 int 的场景,该参数也有表内并发效果。
    • -F 选项用于指定单个文件的最大大小,单位为 MiB,可接受类似 5GiB8KB 的输入。如果你想使用 TiDB Lightning 将该文件加载到 TiDB 实例中,建议将 -F 选项的值保持在 256 MiB 或以下。

    Dumpling - 图2

    注意

    如果导出的单表大小超过 10 GB,强烈建议使用 -r-F 参数。

    导出为 CSV 文件

    你可以通过使用 --filetype csv 导出数据到 CSV 文件。

    当你导出 CSV 文件时,你可以使用 --sql <SQL> 导出指定 SQL 选择出来的记录。例如,导出 test.sbtest1 中所有 id < 100 的记录:

    1. ./dumpling -u root -P 4000 -h 127.0.0.1 -o /tmp/test --filetype csv --sql 'select * from `test`.`sbtest1` where id < 100' -F 100MiB --output-filename-template 'test.sbtest1.{{.Index}}'
    • --sql 选项仅仅可用于导出 CSV 文件的场景。上述命令将在要导出的所有表上执行 SELECT * FROM <table-name> WHERE id < 100 语句。如果部分表没有指定的字段,那么导出会失败。
    • 使用 --sql 配置导出时,Dumpling 无法获知导出的表库信息,此时可以使用 --output-filename-template 选项来指定 CSV 文件的文件名格式,以方便后续使用 导入数据文件。例如 --output-filename-template='test.sbtest1.{{.Index}}' 指定导出的 CSV 文件为 test.sbtest1.000000000test.sbtest1.000000001 等。
    • 你可以使用 --csv-separator--csv-delimiter 等选项,配置 CSV 文件的格式。具体信息可查阅 Dumpling 主要选项表

    注意

    Dumpling 导出不区分字符串关键字。如果导入的数据是 Boolean 类型的 truefalse,导出时会被转换为 10

    压缩导出的数据文件

    你可以使用 --compress <format> 压缩导出的 CSV、SQL 数据与表结构文件。该参数支持 gzipsnappyzstd 压缩算法。默认不压缩。

    • 该选项只能压缩单个数据与表结构文件,无法直接压缩整个文件夹生成单个压缩集合包。
    • 该选项可以节省磁盘空间,但也会导致导出速度变慢,并增加 CPU 消耗。对导出速度要求较高的场景需慎用。
    • TiDB Lightning v6.5.0 及以上版本支持直接使用 Dumpling 压缩文件作为数据源导入,无需额外配置。
    • metadata:此文件包含导出的起始时间,以及 master binary log 的位置。

      1. cat metadata
      1. Started dump at: 2020-11-10 10:40:19
      2. SHOW MASTER STATUS:
      3. Log: tidb-binlog
      4. Pos: 420747102018863124
      5. Finished dump at: 2020-11-10 10:40:20
    • :创建 schema 的 SQL 文件。

      1. cat test-schema-create.sql
      1. CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
    • {schema}.{table}-schema.sql:创建 table 的 SQL 文件

      1. CREATE TABLE `t1` (
      2. `id` int(11) DEFAULT NULL
      3. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    • {schema}.{table}.{0001}.{sql|csv}:数据源文件

      1. cat test.t1.0.sql
      1. /*!40101 SET NAMES binary*/;
      2. INSERT INTO `t1` VALUES
    • *-schema-view.sql*-schema-trigger.sql*-schema-post.sql:其他导出文件

    导出到 Amazon S3 云盘

    Dumpling 在 v4.0.8 及更新版本支持导出到 Amazon S3 云盘。如果需要将数据备份到 Amazon S3 后端存储,那么需要在 -o 参数中指定 Amazon S3 的存储路径。

    可以参照 AWS 官方文档 - 如何创建 S3 存储桶在指定的 Region 区域中创建一个 S3 桶 Bucket。如有需要,还可以参照 在 Bucket 中创建一个文件夹 Folder

    将有权限访问该 Amazon S3 后端存储的账号的 SecretKeyAccessKey 作为环境变量传入 Dumpling 节点。

    1. export AWS_ACCESS_KEY_ID=${AccessKey}
    2. export AWS_SECRET_ACCESS_KEY=${SecretKey}

    Dumpling 同时还支持从 ~/.aws/credentials 读取凭证文件。Dumpling 导出到 Amazon S3 的配置参数与 BR 大致相同,更多参数描述,请参考外部存储 URL 格式

    1. ./dumpling -u root -P 4000 -h 127.0.0.1 -r 200000 -o "s3://${Bucket}/${Folder}"

    筛选导出的数据

    使用 --where 选项筛选数据

    默认情况下,Dumpling 会导出排除系统数据库(包括 mysqlsysINFORMATION_SCHEMAPERFORMANCE_SCHEMAMETRICS_SCHEMAINSPECTION_SCHEMA)外所有其他数据库。你可以使用 --where <SQL where expression> 来指定要导出的记录。

    上述命令将会导出各个表的 id < 100 的数据。注意 --where 参数无法与 --sql 一起使用。

    使用 --filter 选项筛选数据

    Dumpling 可以通过 --filter 指定 table-filter 来筛选特定的库表。table-filter 的语法与 .gitignore 相似,详细语法参考表库过滤

    1. ./dumpling -u root -P 4000 -h 127.0.0.1 -o /tmp/test -r 200000 --filter "employees.*" --filter "*.WorkOrder"

    使用 -B-T 选项筛选数据

    Dumpling 也可以通过 -B-T 选项导出特定的数据库/数据表。

    Dumpling - 图4

    注意

    • --filter 选项与 -T 选项不可同时使用。
    • -T 选项只能接受完整的 库名.表名 形式,不支持只指定表名。例:Dumpling 无法识别 -T WorkOrder

    例如通过指定:

    • -B employees 导出 employees 数据库
    • -T employees.WorkOrder 导出 employees.WorkOrder 数据表

    通过并发提高 Dumpling 的导出效率

    默认情况下,导出的文件会存储到 ./export-<current local time> 目录下。常用选项如下:

    • -t 用于指定导出的线程数。增加线程数会增加 Dumpling 并发度提高导出速度,但也会加大数据库内存消耗,因此不宜设置过大。
    • 选项用于指定单个文件的最大记录数,或者说,数据库中的行数。开启后 Dumpling 会开启表内并发,提高导出大表的速度。当上游为 TiDB 且版本为 v3.0 或更新版本时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值不影响划分算法。对上游为 MySQL 且表的主键是 int 的场景,该参数也有表内并发效果。
    • --compress <format> 选项可以用于压缩导出的数据,支持 gzipsnappyzstd 压缩算法。压缩可以显著降低导出数据的大小,同时如果存储的写入 I/O 带宽不足,可以使用该选项来加速导出。但该选项也有副作用,由于该选项会对每个文件单独压缩,因此会增加 CPU 消耗。

    利用以上选项可以提高 Dumpling 的导出速度。

    注意

    数据一致性选项的默认值为 auto。在大多数场景下,你不需要调整该选项。

    Dumpling 通过 --consistency <consistency level> 标志控制导出数据“一致性保证”的方式。在使用 snapshot 来保证一致性的时候,可以使用 --snapshot 选项指定要备份的时间戳。还可以使用以下的一致性级别:

    • flush:使用 FLUSH TABLES WITH READ LOCK 短暂地中断备份库的 DML 和 DDL 操作、保证备份连接的全局一致性和记录 POS 信息。所有的备份连接启动事务后释放该锁。推荐在业务低峰或者 MySQL 备份库上进行全量备份。
    • snapshot:获取指定时间戳的一致性快照并导出。
    • lock:为待导出的所有表上读锁。
    • none:不做任何一致性保证。
    • auto:对 MySQL 使用 flush,对 TiDB 使用 snapshot

    操作完成之后,你可以在 /tmp/test 查看导出的文件:

    1. $ ls -lh /tmp/test | awk '{print $5 "\t" $9}'
    2. 140B metadata
    3. 66B test-schema-create.sql
    4. 300B test.sbtest1-schema.sql
    5. 190K test.sbtest1.0.sql
    6. 300B test.sbtest2-schema.sql
    7. 190K test.sbtest2.0.sql
    8. 300B test.sbtest3-schema.sql
    9. 190K test.sbtest3.0.sql

    导出 TiDB 的历史数据快照

    Dumpling 可以通过 --snapshot 指定导出某个 tidb_snapshot 的数据。

    --snapshot 选项可设为 TSO(SHOW MASTER STATUS 输出的 Position 字段)或有效的 datetime 时间(YYYY-MM-DD hh:mm:ss 形式),例如:

    1. ./dumpling --snapshot 417773951312461825
    2. ./dumpling --snapshot "2020-07-02 17:12:45"

    即可导出 TSO 为 4177739513124618252020-07-02 17:12:45 时的 TiDB 历史数据快照。

    控制导出 TiDB 大表(超过 1 TB)时的内存使用

    Dumpling 导出 TiDB 较大单表(超过 1 TB)时,可能会因为导出数据过大导致 TiDB 内存溢出 (OOM),从而使连接中断导出失败。可以通过以下参数减少 TiDB 的内存使用。

    • 设置 -r 参数,可以划分导出数据区块减少 TiDB 扫描数据的内存开销,同时也可开启表内并发提高导出效率。当上游为 TiDB 且版本为 v3.0 或更新版本时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值不影响划分算法。
    • 调小 --tidb-mem-quota-query 参数到 8589934592 (8GB) 或更小。可控制 TiDB 单条查询语句的内存使用。
    • 调整 --params "tidb_distsql_scan_concurrency=5" 参数,即设置导出时的 session 变量 tidb_distsql_scan_concurrency 从而减少 TiDB scan 操作的并发度。

    导出大规模数据时的 TiDB GC 设置

    如果导出的 TiDB 版本为 v4.0.0 或更新版本,并且 Dumpling 可以访问 TiDB 集群的 PD 地址,Dumpling 会自动配置延长 GC 时间且不会对原集群造成影响。

      操作结束之后,再恢复 GC 时间为默认值 10m

      1. SET GLOBAL tidb_gc_life_time = '10m';

      Dumpling 主要选项表