背景
在国产化数据库替代过程中,有一项必不可少的任务就是数据迁移,我们常用的技术手段之一是把数据库的数据导出成csv格式的文件,然后将csv格式的文件导入的国产数据库中。
本文介绍的是从SAP数据库导出的TB级CSV文件加速导入到TiDB数据库中。从SAP数据库导出11T的单表,导入到TiDB数据库中;SAP导出的数据文件总共有4个csv文件,每个大小约2.6TB。使用lightning工具导入到TiDB数据库中。
TiDB数据库版本为v8.1.0。
提速方案
1、将2.6TB的csv切成256M左右一个小文件。
使用split切分大文件
-l指定行数切割,防止出现断行数据
-a切分后有几位数字
nohup split -l 128000 -d -a 6 data.csv DB.TABLE &
计算切分行数:
tail -2000 data.csv > a.txt
du -sh a.txt
根据a.txt文件的大小,使用256M除以a.txt文件大小,得出的数值乘以2000,即切分的行数
例如:a.txt 4M,(256/4)*2000=128000,即split切分的行数。
小编之前写过一个工具:使用TiSplit进行切分: https://tidb.net/blog/6001a7ec
可以利用TiSplit工具,把大的CSV文件切分成小的文件。
2、开多个lightning窗口同时导入。
如果有多台服务器,可以充分利用资源,把现有的csv穿到多台服务器上,同时进行lightning导入。
把此参数打开:parallel-import = true
注意: 该参数在7.5版本及以上版本才支持! 在local模式下,lightning多窗口同时导入数据时,每个窗口的csv名字不能一样,否则会跳过相同名字的csv,导致导入的数据不全。
eg:有4台机器进行并行导入,每台机器使用TiSplit工具切分后,需要执行如下命令,将每台机器的csv文件进行重命名,保证每台机器的csv文件的名字都是唯一的。
#node1:
mv SAPSR3.%2fBIC%2fAA2CW0003200000 SAPSR3.%2fBIC%2fAA2CW00032.10000.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200001 SAPSR3.%2fBIC%2fAA2CW00032.10001.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200002 SAPSR3.%2fBIC%2fAA2CW00032.10002.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200003 SAPSR3.%2fBIC%2fAA2CW00032.10003.csv
#node3:
mv SAPSR3.%2fBIC%2fAA2CW0003200000 SAPSR3.%2fBIC%2fAA2CW00032.20000.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200001 SAPSR3.%2fBIC%2fAA2CW00032.20001.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200002 SAPSR3.%2fBIC%2fAA2CW00032.20002.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200003 SAPSR3.%2fBIC%2fAA2CW00032.20003.csv
#node3:
mv SAPSR3.%2fBIC%2fAA2CW0003200000 SAPSR3.%2fBIC%2fAA2CW00032.30000.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200001 SAPSR3.%2fBIC%2fAA2CW00032.30001.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200002 SAPSR3.%2fBIC%2fAA2CW00032.30002.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200003 SAPSR3.%2fBIC%2fAA2CW00032.30003.csv
#node4:
mv SAPSR3.%2fBIC%2fAA2CW0003200000 SAPSR3.%2fBIC%2fAA2CW00032.40000.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200001 SAPSR3.%2fBIC%2fAA2CW00032.40001.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200002 SAPSR3.%2fBIC%2fAA2CW00032.40002.csv
mv SAPSR3.%2fBIC%2fAA2CW0003200003 SAPSR3.%2fBIC%2fAA2CW00032.40003.csv
导入过程中遇到过“got signal to exit”异常中断问题:
将nohup lightning --config tidb-lightning.toml &放入到脚本里,即可规避此问题。
3、优化lightning配置文件参数,加速导入。
lightning完整配置文件详见下一章节,这里只介绍加速参数:
region-concurrency :如果一台机器上同时执行2个lightning,需要把此参数调整成机器CPU核数的一半
backend = "local" :物理模式导入速度快
parallel-import = true:多台机器同时用lightning导入,需要设置此参数
data-source-dir = "/DATA1/csvpoc"和sorted-kv-dir = "/DATA2/tidbSORT1":两个目录放在不同磁盘上
analyze = "off" lightning导入完成后不进行analyze table
lightning配置文件
[root@02 lightning]# cat lightning.toml
[lightning]
level = "info"
file = "tidb-lightning_2024.log"
check-requirements = false
region-concurrency = 30
[tikv-importer]
backend = "local"
sorted-kv-dir = "/data3/tidbSORT1"
parallel-import = true
[conflict]
strategy = "replace"
precheck-conflict-before-import = false
threshold = 10000
max-record-rows = 100000
[mydumper]
data-source-dir = "/data2/csv"
filter = ['*.*','!mysql.*', '!sys.*', '!INFORMATION_SCHEMA.*','!METRICS_SCHEMA.*','!INSPECTION_SCHEMA.*']
no-schema = true
strict-format = true
[tidb]
host = "192.168.1.11"
port = 4000
user = "root"
password = ""
status-port = 10080
pd-addr = "192.168.1.11:2379"
[checkpoint]
enable = true
driver = "file"
dsn = "/tmp/tidb_lightning_3.pb"
[mydumper.csv]
separator=','
delimiter='"'
terminator="\n"
header = false
not-null = false
null=''
backslash-escape = true
trim-last-separator = false
[post-restore]
analyze = "off"
总结
1、高版本的lightning工具,导入速度变快。
2、利用好lightning的特性,应对复杂的导数场景。