8.1 KiB
常见导入导出场景
以下省略 java -jar batch-tool.jar -h 127.0.0.1 -u polardbx_root -p "123456" -P 8527
等数据库连接信息配置 ,仅展示命令行功能参数的设置
数据库表导出
单张表默认并行导出
文件数默认为物理表的分片数
-D sbtest_auto -o export -s , -t sbtest1
单张表指定文件数量导出
-F 1 导出为一个文件,生产者并发度为物理表的分片数,消费者并发度为文件数
-D sbtest_auto -o export -s , -t sbtest1 -F 1
多表指定文件数量导出
-F 1 两张表将分别导出为两个单独的文件
-D sbtest_auto -o export -s , -t "sbtest1;sbtest2" -F 1
整库导出
-F 1 库中每张表都分别导出为单独的一个文件
-D sbtest_auto -o export -s , -F 1
元数据导出
导出库的所有建库建表DDL语句
-D sbtest_auto -o export -s , -DDL only
gz压缩导出
-D sbtest_auto -o export -s , -t "sbtest1" -comp GZIP
加密导出
-D sbtest_auto -o export -s , -t sbtest1 -enc DEFAULT -key 123456 -F 1
导出为Excel文件
-D sbtest_auto -o export -s , -t "sbtest1" -format XLSX
指定列导出
-D sbtest_auto -o export -s , -t "sbtest1" -col "id;k;c"
从单机MySQL中导出数据
-D sbtest -o export -s , -t "sbtest1" -sharding false
进行数据脱敏
对手机号进行掩码保护
以 TPC-H 数据集的 cusomter 表为例,只展示手机号 c_phone 前三位与末四位
-D tpch_1g -o export -s , -t "customer" -mask "{ \"c_phone\": { \"type\": \"hiding\", \"show_region\" : \"0-2\", \"show_end\": 4 }"
原数据
c_custkey|c_name|c_address|c_nationkey|c_phone|c_acctbal|c_mktsegment|c_comment
1|Customer#000000001|IVhzIApeRb ot,c,E|15|25-989-741-2988|711.56|BUILDING|to the even, regular platelets. regular, ironic epitaphs nag
2|Customer#000000002|XSTf4,NCwDVaWNe6tEgvwfmRchLXak|13|23-768-687-3665|121.65|AUTOMOBILE|l accounts. blithely ironic theodolites integrate boldly: care
3|Customer#000000003|MG9kdTD2WBHm|1|11-719-748-3364|7498.12|AUTOMOBILE| deposits eat slyly ironic, even instructions. express foxes detect slyly. blithely even accounts abo
4|Customer#000000004|XxVSJsLAGtn|4|14-128-190-5944|2866.83|MACHINERY| requests. final, regular ideas sleep final acco
5|Customer#000000005|KvpyuHCplrB84WgAiGV6sYpZq7Tj|3|13-750-942-6364|794.47|HOUSEHOLD|n accounts will have to unwind. foxes cajole acco
脱敏后数据
c_custkey|c_name|c_address|c_nationkey|c_phone|c_acctbal|c_mktsegment|c_comment
1|Customer#000000001|IVhzIApeRb ot,c,E|15|25-********2988|711.56|BUILDING|to the even, regular platelets. regular, ironic epitaphs nag
2|Customer#000000002|XSTf4,NCwDVaWNe6tEgvwfmRchLXak|13|23-********3665|121.65|AUTOMOBILE|l accounts. blithely ironic theodolites integrate boldly: care
3|Customer#000000003|MG9kdTD2WBHm|1|11-********3364|7498.12|AUTOMOBILE| deposits eat slyly ironic, even instructions. express foxes detect slyly. blithely even accounts abo
4|Customer#000000004|XxVSJsLAGtn|4|14-********5944|2866.83|MACHINERY| requests. final, regular ideas sleep final acco
5|Customer#000000005|KvpyuHCplrB84WgAiGV6sYpZq7Tj|3|13-********6364|794.47|HOUSEHOLD|n accounts will have to unwind. foxes cajole acco
编写复杂格式的json文件建议参考 使用yaml配置。
数据库表导入
单表导入
-D sbtest_auto -o import -s , -t sbtest2 -dir data-backup
多表导入
-D sbtest_auto -o import -s , -t "sbtest1;sbtest2" -dir data-backup
整库导入
-D sbtest_auto -o import -s , -dir data-test
调整导入并行度
生产者并发度为读取文件的工作线程,消费者并发度为发送batch insert的工作线程(两者均可调整)
-D sbtest_auto -t sbtest1 -o import -s , -f sbtest1_0 -pro 6 -con 6
元数据导入
这里指定的连接库是polardbx(内置默认schema)
-D polardbx -o import -s , -DDL only -f sbtest_auto.ddl
导入gz压缩文件
-D sbtest_auto -o import -s , -t "sbtest1" -comp GZIP -dir data-test
导入加密后的文件
解密算法与密钥需要与导出时一致
-D sbtest_auto -o import -s , -t sbtest1 -enc DEFAULT -key 123456 -f sbtest1_0
导入Excel文件
-D sbtest_auto -o import -s , -t "sbtest1" -format XLSX -f "sbtest1_0.xlsx"
使用yaml配置
当有很多配置项需要设置时,使用命令行参数会很不方便编辑,此时建议使用yaml格式的配置文件,示例如下:
命令行参数:-configFile export.yaml
expory.yaml 文件
host: xxxx
port: 3306
user: root
password: xxxxxx
database: tpch_1g
operation: export
sep: "|"
table: customer
filenum: 1
orderby: asc
orderCol: c_custkey
header: true
mask: >-
{
"c_phone": {
"type": "hiding",
"show_region": "0-2",
"show_end": 4
}
}
如果配置值包含yaml特殊字符的话, 需要用引号括起来。
常见问题排查
-
报错 the server time zone value '' is unrecognized
原因:由于数据库时区与系统时区有差异导致的报错,需要在jdbc url中手动指定时区
解决:加入参数:
-param "serverTimezone=Asia/Shanghai"
-
报错 Unable to get topology of table
原因:批量导出时默认以 PolarDB-X 的物理表拓扑进行分布式导出, 如果对普通 MySQL数据库进行导出,需要关闭 sharding 参数
解决:加入参数:
-sharding false
-
数据文件使用的分隔符是tab缩进,需要怎么输入
-s
参数?解决:直接在shell中输入tab键,即
-s " "
-
数据文件使用的分隔符是ascii控制字符(如
\x01
等),需要怎么输入-s
参数?1^A123^A1123^A12321312 2^A123^A1123^A12321312 3^A123^A1123^A12321312
^A 为 \x01 的Caret notation
解决:输入
-s $'\x01'
即可。暂时无法处理NULL字符(
\x00
)作为分隔符,可以通过修改源代码解决。 -
导入时报错,
due to wait millis 5000, active 8, maxActive 8, ...
原因:由于运行时指定了
-maxConn 8
参数 maxActive连接数是8,而此时active也是8,即连接池满了; 也就是并发导入创建的连接数太多,超出了连接池上限,导致报错解决:加入
-con 4
参数限制导入数据库的消费者线程数为4 -
生产者消费者建议的比例数?
原因:默认情况下,生产者数(并发读取文件线程数)为4,消费者数(并发导入数据库线程数)为CPU核心数的4倍; 在不同的规格下,默认参数可能表现不佳
解决:通常建议消费者数
-con
为生产者数-pro
的6~8倍,具体数值还需根据硬件配置、数据库处理能力来调整 -
报错
Missing argument for option:
原因:参数缺少参数值,自1.2.0版本后,开关类型的参数也需要填入参数(true|false)
-
导出数据时,默认分区并行度较低导致导出耗时较长
原因:默认情况下,导出时分区并行度为常数(4),当数据库实例以及压测机配置较高时,该并行度不足以充分利用硬件资源
解决:调整参数 -pro 的大小来调节导出分区并行度(导出场景中,生产者为连接数据库拉取数据的线程,消费者为文件写入的线程)
-
导出数据中,字段值包含了分隔符,后续导入时报错
required field size xx, actual size yy
原因:由于字段值本身包含了分隔符,导致csv解析时得到的字段数量与表列数匹配不上
解决:导入、导出时都加入参数
-quote force
参数(开启该参数后,导入时客户端CPU占用会更高一些,效率也会略低一点, 但文本解析的兼容性会更好)