使用 Dumpling 导出-r参数参数不生效

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】V6.5.2
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
使用 Dumpling 导出-r参数参数不生效
导出名参数设置:
–filetype csv --sql " select ****
WHERE
b.accounts_time BETWEEN concat( date_add( curdate()- DAY ( curdate())+ 1, INTERVAL - 1 MONTH ), ’ 09:00:00’ )
AND concat( date_add( curdate(), INTERVAL - DAY ( curdate())+ 1 DAY ), ’ 08:59:59’ )
AND b.active = 1;
" -r 500 --output-filename-template=“bill_center_send_date '+%Y-%m-%d'.{{.Index}}”
指定500 行大小限制:
官方文档:
https://docs.pingcap.com/zh/tidb/v6.1/dumpling-overview
一共有两处解释:
-r 用于开启表内并发加速导出。默认值是 0,表示不开启。取值大于 0 表示开启,取值是 INT 类型。当数据源为 TiDB 时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分区间,同时减少内存使用。具体取值不影响划分算法。对数据源为 MySQL 且表的主键是 INT 的场景,该参数也有表内并发效果。
-F 选项用于指定单个文件的最大大小,单位为 MiB,可接受类似 5GiB 或 8KB 的输入。如果你想使用 TiDB Lightning 将该文件加载到 TiDB 实例中,建议将 -F 选项的值保持在 256 MiB 或以下。
注意
如果导出的单表大小超过 10 GB,强烈建议使用 -r 和 -F 参数。

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

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

  • -t 用于指定导出的线程数。增加线程数会增加 Dumpling 并发度提高导出速度,但也会加大数据库内存消耗,因此不宜设置过大。
  • -r 选项用于指定单个文件的最大记录数,或者说,数据库中的行数。开启后 Dumpling 会开启表内并发,提高导出大表的速度。当上游为 TiDB 且版本为 v3.0 或更新版本时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值不影响划分算法。对上游为 MySQL 且表的主键是 int 的场景,该参数也有表内并发效果。

实验测试结果:
[2024/01/04 18:00:44.433 +08:00] [INFO] [collector.go:255] [“backup success summary”] [total-ranges=1] [ranges-succeed=1] [ranges-failed=0] [total-take=948.487739ms] [total-rows=1343] [total-kv-size=487.2kB] [average-speed=513.7kB/s]
[2024/01/04 18:00:44.434 +08:00] [INFO] [client.go:779] [“[pd] stop fetching the pending tso requests due to context canceled”] [dc-location=global]
[2024/01/04 18:00:44.434 +08:00] [INFO] [client.go:716] [“[pd] exit tso dispatcher”] [dc-location=global]
[2024/01/04 18:00:44.434 +08:00] [INFO] [main.go:81] [“dump data successfully, dumpling will exit now”]
导出1343 发现文件没有分割。
total 488
-rw-rw-r-- 1 tidb tidb 487197 Jan 4 18:00 bill_center_send_2024-01-04.000000000.csv
单个文件行数如下:
1344 “444433330189”
:set nu


老师讲的单个文件最大行数,-r -F文件大小,那个先到以那个为准。
请问怎么理解这里的-r 参数,如果对导出文件怎么限制导出文件的行数?

这个行是源头数据库中的行,不是导出文件的行。
我理解就是类似通过select时的limit,减少单次任务的内存使用,同时配合-t可以增加并发。

感觉没问题吧,命令里-r是200000,实际导出文件是1343行,小于200000行。

1 个赞

我试了下-r 参数也没有生效,但是使用 -F参数是可以生效的

注意这句话,对于从TiDB导数据,只要-r大于0,具体取值是多少都不影响,都是按照region信息来划分分片,也就是:当使用-r后,-r的值,和-F的取值都是无效的,不会影响生成文件的大小

PS:只有单独使用-F是可以和mydumper类似,会按照设置的值拆分SQL文件。不过这个时候,每个表只能有一个线程导出,不会开启表内并发,对大表的导出效率很低不如使用-r

文档里确实描述得不是准确,从实际效果来看 -r 主要是用于开启表内并发加速导出,是一个0/1开关的作用。

这么说的话, -r参数 的实际效果是用于开启表内并发加速导出,而真正可以实现控制每个文件导出的大小的是-F参数,那这么说的话 -r 参数和 -t 参数作用有点重合了,-t 参数还可以指定导出的具体线程数。

:thinking:这不又发现一个文档issues,活动进度+1

1 个赞

还不一样,看我上面的回答,对导出源是TiDB而言,只要开启-r-F的值也会被忽略。-t是指开启的线程数,也就是一次性导出几个region。

其实dumpling help里解释比较清晰:For TiDB v3.0+, specify this will make dumpling split table with each file one TiDB region(no matter how many rows is).

1 个赞

之前也是遇到这个问题,没有当回事

1343 行 我设置了500行,不应该给我分成3个文件?

可以看教学视频,教学视频里说的导出文件大小的行数。

1 个赞

-r 好像是一次导入最多的sql语句

-r --rows 不生效是dumping 产品bug ,不影响正常使用。如果对文件分割有要求尽量使用-F 选项。

学习了

你这种说法其实不对,在文档里其实就有说明,-r对TiDB的含义有特殊说明。对从mysql导出数据时候,-r还是生效的

你选择这个回复作为解决方案,有误导嫌疑

--threads/-r 后跟一个整数值

:joy:有实践验证的同学发表一下真实结果么?

1 个赞