dumpling导出文件大小问题

【 版本】5.0.2

【问题】 dumpling导出文件大小没达到-r10000000 -F 2GiB限制的大小,产生很多导出文件,表大小1.4亿左右。导出文件大小基本在100MB左右,行数30万左右。另如果上述2个参数起作用的话导出文件的大小以哪个参数为准
dumpling -u root -p -h 10.xxx.82 -P 40xx --filetype csv -t 6 -o /data/all_dump_csv -r 10000000 -F 2GiB -T d_users.tf_f_user

image

指定了-t 6 但top -H查看 实际几十个dumpling线程在工作

目前生成的文件一个文件是不是包含 10000000 行数据?当 -r 和 -F 同时指定的时候,-F 的切分是基于 -r 指定的行数进行切分的,如果 -F 指定得比较大的话那么是不会进行合并的。

1 个赞

导出的文件都是100M左右 每个文件30多万行,
改成 -r 50000000 -F 512MiB 导出测试结果一样。


另外指定的线程数-t 6 为什么实际启动那么多的线程数?

方便的话把 --loglevel 设置成 debug 然后,上传一下 dumpling 的 debug 日志吧。

见附件
dumpling.txt (649.1 KB)

  1. 麻烦给一下 show create table TF_F_USER
  2. 根据主键给导出一下: SELECT {pks} FROM ‘d_users’.‘TF_F_USER’ TABLESAMPLE REGIONS() ORDER BY {pks}

| TF_F_USER | CREATE TABLE TF_F_USER (
USER_ID bigint(16) unsigned NOT NULL ,
CUST_ID bigint(16) NOT NULL ,
USECUST_ID bigint(16) DEFAULT NULL ,
BRAND_CODE char(4) NOT NULL COMMENT ‘当前品牌编码’,
PRODUCT_ID int(8) NOT NULL COMMENT ‘当前产品标识’,
EPARCHY_CODE varchar(8) NOT NULL COMMENT ‘地市编码’,
CITY_CODE varchar(8) NOT NULL ,
USER_DIFF_CODE varchar(4) NOT NUL ,
USER_TYPE_CODE char(1) NOT NULL ,
SERIAL_NUMBER varchar(40) NOT NULL COMMENT ‘服务号码’,
NET_TYPE_CODE varchar(2) NOT NULL COMMENT ‘网别’,
CREDIT_CLASS int(8) NOT NULL COMMENT ‘信用等级(是,default ‘‘0’’)’,
BASE_CREDIT_VALUE bigint(14) NOT NULL COMMENT ‘基本信用度’,
CREDIT_VALUE bigint(14) NOT NULL COMMENT ‘信用度’,
ACCT_TAG char(1) NOT NULL ,
PREPAY_TAG char(1) NOT NULL ,
IN_DATE datetime NOT NULL COMMENT ‘建档时间’,
OPEN_DATE datetime NOT NULL COMMENT ‘开户时间’,
OPEN_MODE char(1) NOT NULL ,
OPEN_DEPART_ID varchar(10) DEFAULT NULL COMMENT ‘开户渠道’,
OPEN_STAFF_ID varchar(20) DEFAULT NULL ,
IN_DEPART_ID varchar(10) DEFAULT NULL COMMENT ‘建档渠道’,
IN_STAFF_ID varchar(20) DEFAULT NULL COMMENT ‘建档员工’,
REMOVE_TAG char(1) NOT NULL ,
DESTROY_DATE datetime DEFAULT NULL COMMENT ‘注销时间’,
REMOVE_EPARCHY_CODE varchar(8) DEFAULT NULL ,
REMOVE_CITY_CODE varchar(8) DEFAULT NULL ,
REMOVE_DEPART_ID varchar(10) DEFAULT NULL COMMENT ‘注销渠道’,
REMOVE_REASON_CODE varchar(2) DEFAULT NULL ,
PRE_DESTROY_DATE datetime DEFAULT NULL COMMENT ‘预销号时间’,
FIRST_CALL_DATE datetime DEFAULT NULL ,
LAST_STOP_DATE datetime DEFAULT NULL ,
SERVICE_STATE_CODE varchar(10) NOT NULL COMMENT ‘主体服务状态集:见服务状态参数表’,
MPUTE_MONTH_FEE varchar(1) NOT NULL DEFAULT ‘0’ ,
MPUTE_DATE datetime DEFAULT NULL COMMENT ‘固定费用重算时间’,
UPDATE_TIME datetime NOT NULL COMMENT ‘修改时间’,
DEVELOP_EPARCHY_CODE varchar(20) DEFAULT NULL COMMENT ‘发展人地市’,
DEVELOP_CITY_CODE varchar(20) DEFAULT NULL COMMENT ‘发展人区县’,
DEVELOP_DEPART_ID varchar(20) DEFAULT NULL COMMENT ‘发展人部门’,
DEVELOP_NO varchar(30) DEFAULT NULL COMMENT ‘文号’,
REMARK varchar(500) DEFAULT NULL COMMENT ‘备注’,
CREDIT_RULE_ID int(8) DEFAULT NULL ,
CONTRACT_ID varchar(50) DEFAULT NULL COMMENT ‘合同号’,
CHANGEUSER_DATE datetime DEFAULT NULL COMMENT ‘过户时间’,
IN_NET_MODE varchar(3) DEFAULT NULL ,
PROVINCE_CODE varchar(8) NOT NULL COMMENT ‘省分编码’,
USER_GROUP_TYPE varchar(3) DEFAULT NULL ',
PRIMARY KEY (USER_ID) /*T![clustered_index] CLUSTERED */,
KEY tf_f_user_idx1 (SERIAL_NUMBER),
KEY tf_f_user_idx2 (CUST_ID),
KEY tf_f_user_idx3 (PROVINCE_CODE,NET_TYPE_CODE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

mysql> SELECT USER_ID FROM d_users.TF_F_USER TABLESAMPLE REGIONS() ORDER BY USER_ID;
结果省略…
±-----------------+
515 rows in set (17.02 sec)

SELECT USER_ID FROM d_users.TF_F_USER TABLESAMPLE REGIONS() ORDER BY USER_ID;
这个数据麻烦导出到文档。多谢。

数据.txt (11.3 KB)
TABLESAMPLE REGIONS()

5.0 以后的 TiDB 使用 dumpling 备份是根据 tablesample 作为条件进行 chunk 的切分,然后并行导出。所以当每一个 chunk 的行数以及大小,小于 -r 以及 -F 参数设置的时候。就以 chunk 的 rows 以及大小作为文件的单位进行导出。

1 个赞

以chunk为限制的目的是什么? 有什么方式可以调整chunk大小? 这样看来-r -F的参数就没有太多意义了

主要目的是为了减少 TiDB 数据离散分布情况下的内存使用以及使划分更均匀,提高导出效率。
现在不开启 -r 或者 -F 小于单 region 大小的情况下 -F 参数仍然有效
-r 将决定 TiDB 是否开启并发导出,决定导出效率,当按 chunk 划分失败后会仍然尝试根据 rows 参数再导出一次

感谢!如果指定-r的情况下,导出文件最大不超过单个region大小?“-r 将决定 TiDB 是否开启并发导出” 未设置-r的情况下 -t指定的线程数是不是也就没用了?

  1. 是的,不超过单 region 大小时 -F 仍然有用
  2. -t 线程数仍然是有用的,这个会决定 dumpling 同时导出几个区块,一般开得越大并发度越大连接数越大速度也更快,对数据库资源消耗也更大

感谢各位

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。