TiDB 黑科技工具集之 dbgen(造数工具)
作者:TiDB 社区干货传送门
- 2024-05-24 北京
本文字数:2278 字
阅读完需:约 7 分钟
作者: Jayjlchen 原文来源:https://tidb.net/blog/874aabb9
背景
为了实验需求,我们需要快速生成一张平均行长较大的表。计划生成名为 aaa.tab1 的表,该表的平均行长约为 20K,包含 100 万行,预计生成约 20GB 的 CSV 文件。
工具下载和使用
安装下载工具说明 https://github.com/kennytm/dbgen/blob/master/Download.md
保存 t.sql
注:在实际开发中,不推荐使用复杂的数据类型,如 TEXT、BLOB 类型。然而,为了方便构造宽表,我在此使用了 多个 TEXT 字段。
CREATE TABLE `aaa`.`TAB1` (
`a` varchar(32) NOT NULL COMMENT '' /*{{ mod(rownum+0,100) || rand.regex('[0-9a-zA-Z]{30}') }}*/,
`b` varchar(32) NOT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{32}') }}*/,
`c` varchar(32) NOT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{32}') }}*/,
`d` varchar(10) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{10}') }}*/,
`e` varchar(2) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{2}') }}*/,
`f` varchar(5) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{5}') }}*/,
`g` varchar(4) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{4}') }}*/,
`h` varchar(4) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{4}') }}*/,
`i` varchar(4) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{4}') }}*/,
`j` text DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{6200}') }}*/,
`k` text DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{6200}') }}*/,
`l` text DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{6200}') }}*/,
`m` varchar(4) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{4}') }}*/,
`n` varchar(5) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{5}') }}*/,
`o` text DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{510}') }}*/,
`p` varchar(7) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{7}') }}*/,
`q` varchar(500) DEFAULT NULL COMMENT '' /*{{ rand.regex('[0-9a-zA-Z]{500}') }}*/,
`r` int(11) DEFAULT NULL COMMENT '' /*{{ rand.range_inclusive(0,2147483647) }}*/,
`s` datetime NOT NULL COMMENT '' /*{{ current_timestamp - INTERVAL rand.range_inclusive(0, 86400*30) SECOND + INTERVAL rand.range_inclusive(0,999999) MICROSECOND }}*/,
`t` datetime NOT NULL COMMENT '' /*{{ current_timestamp - INTERVAL rand.range_inclusive(0, 86400*30) SECOND + INTERVAL rand.range_inclusive(0,999999) MICROSECOND }}*/,
PRIMARY KEY(`a`),
INDEX `IDX_t`(`t`)
)
ENGINE = InnoDB DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_BIN COMMENT = '';
复制代码
运行
-R 是每个 csv 多少行
-N 是一共多少行,所以 csv 文件数量 =N/R
这个估算的 CSV 文件体积非常准确。在生成 CSV 的初期,瞬时速度较高,基本可以使磁盘 IO 达到饱和。在我这台配备普通 SSD 的云主机上,大约一分钟即可生成 19GB 的 CSV 文件。
[tidb@vm172-16-201-22 bin]$ ./dbgen -i ./t.sql -f csv -R 15000 -N 1000000 -o ./output
Using seed: 3ce68633d40ae080e51b29e74cd5367468c062bfb294c6fb8c2a1cdff2efff67
Done!
Size 18.50 GB / 18.50 GB 🕛 291.21 MB/s
[tidb@vm172-16-201-22 bin]$ du -sh output/
19G output/
复制代码
导入 csv
vim tidb-lightning.toml
[lightning]
# 转换数据的并发数,默认为逻辑 CPU 数量,不需要配置。
# 混合部署的情况下可以配置为逻辑 CPU 的 75% ⼤⼩。
# region-concurrency =
# ⽇志
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
# backend 设置为 local 模式
backend = "local"
# 设置排序的键值对的临时存放地址,⽬标路径需要是⼀个空⽬录
sorted-kv-dir = "/data/tmp/sorted-kv-dir"
[checkpoint]
# 启⽤断点续传。
# 导⼊时,TiDB Lightning 会记录当前进度。
# 若 TiDB Lightning 或其他组件异常退出,在重启时可以避免重复再导⼊已完成的数据。
enable = true
# 存储断点的⽅式
# - file:默认存储路径为 /tmp/CHECKPOINT_SCHEMA.pb
driver = "file"
[mydumper]
# Mydumper 源数据⽬录。
data-source-dir = "/home/tidb/bin/output"
filter = ['aaa.*'] #只导⼊这些库
[mydumper.csv]
header = false
[tidb]
# ⽬标集群的信息。tidb-server 的监听地址,填⼀个即可。
host = "172.16.201.22"
port = 4000
user = "root"
password = ""
# 表架构信息在从 TiDB 的“状态端⼝”获取。
status-port = 10080
# pd-server 的地址,填⼀个即可
pd-addr = "172.16.201.22:2379"
[post-restore]
analyze = "off" #如果要快速导入,这个值设为off,导入完成后再手工收集统计信息
checksum = "required"
复制代码
导入命令
nohup ./tidb-lightning -config tidb-lightning.toml --check-requirements=false > nohup.out &
复制代码
收集统计信息
# 宽表一般是通过定制策略来收集的,后续的 auto analyze 将继承该策略
analyze table aaa.TAB1 columns a, t with 110000 samples , 256 BUCKETS, 300 TOPN;
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/ef02ff707546b36001d966d57】。文章转载请联系作者。
TiDB 社区干货传送门
关注
TiDB 社区官网:https://tidb.net/ 2021-12-15 加入
TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/
评论