polardbxtools/batch-tool/docs/usage-details.md

195 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!-- TOC -->
* [常见导入导出场景](#常见导入导出场景)
* [数据库表导出](#数据库表导出)
* [数据库表导入](#数据库表导入)
* [使用yaml配置](#使用yaml配置)
* [常见问题排查](#常见问题排查)
<!-- TOC -->
# 常见导入导出场景
以下省略 `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
}"`
**原数据**
```text
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
```
**脱敏后数据**
```text
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配置](#使用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 文件**
```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特殊字符](https://yaml.org/spec/1.2.2/#53-indicator-characters)的话, 需要用引号括起来。
# 常见问题排查
1. 报错 **the server time zone value '' is unrecognized**
**原因**由于数据库时区与系统时区有差异导致的报错需要在jdbc url中手动指定时区
**解决**:加入参数:`-param "serverTimezone=Asia/Shanghai"`
2. 报错 **Unable to get topology of table**
**原因**:批量导出时默认以 PolarDB-X 的物理表拓扑进行分布式导出,
如果对普通 MySQL数据库进行导出需要关闭 sharding 参数
**解决**:加入参数:`-sharding false`
3. 数据文件使用的分隔符是tab缩进需要怎么输入`-s` 参数?
**解决**直接在shell中输入tab键即`-s " "`
4. 数据文件使用的分隔符是ascii控制字符如`\x01`等),需要怎么输入`-s` 参数?
```text
1^A123^A1123^A12321312
2^A123^A1123^A12321312
3^A123^A1123^A12321312
```
> ^A 为 \x01 的Caret notation
**解决**:输入`-s $'\x01'` 即可。
> 暂时无法处理NULL字符(`\x00`)作为分隔符,可以通过修改源代码解决。
5. 导入时报错,`due to wait millis 5000, active 8, maxActive 8, ...`
**原因**:由于运行时指定了`-maxConn 8`参数 maxActive连接数是8而此时active也是8即连接池满了
也就是并发导入创建的连接数太多,超出了连接池上限,导致报错
**解决**:加入 `-con 4`参数限制导入数据库的消费者线程数为4
6. 生产者消费者建议的比例数?
**原因**默认情况下生产者数并发读取文件线程数为4消费者数并发导入数据库线程数为CPU核心数的4倍
在不同的规格下,默认参数可能表现不佳
**解决**:通常建议消费者数`-con `为生产者数`-pro `的6~8倍具体数值还需根据硬件配置、数据库处理能力来调整
7. 报错 `Missing argument for option: `
**原因**参数缺少参数值自1.2.0版本后开关类型的参数也需要填入参数true|false
8. 导出数据时,默认分区并行度较低导致导出耗时较长
**原因**默认情况下导出时分区并行度为常数4当数据库实例以及压测机配置较高时该并行度不足以充分利用硬件资源
**解决**:调整参数 -pro 的大小来调节导出分区并行度(导出场景中,生产者为连接数据库拉取数据的线程,消费者为文件写入的线程)
9. 导出数据中,字段值包含了分隔符,后续导入时报错 `required field size xx, actual size yy`
**原因**由于字段值本身包含了分隔符导致csv解析时得到的字段数量与表列数匹配不上
**解决**:导入、导出时都加入参数 `-quote force` 参数开启该参数后导入时客户端CPU占用会更高一些效率也会略低一点
但文本解析的兼容性会更好)