首批通过分布式安全可靠测评,为关键业务系统打造
如何使用 DataX 实现多库对多库的数据迁移
更新时间:2026-05-29 09:46
在某些业务场景下,需要按照固定的分片字段中获取分片信息,将对应的数据写入数据库。在迁移数据的过程中,需要进行单表导百库百表的迁移。DataX 提供分库分表的能力,本文主要介绍如何利用 DataX 的分库分表进行数据拆分。
适用版本
OceanBase 数据库 V3.x 及之前版本
配置说明
Datax 配置信息如下所示。
"dbNamePattern":"dbname_{000}",
"dbRule":"#col1#",
"tableNamePattern":"table_{000}",
"tableRule":"#col1#",
dbNamePattern:分库名的格式,例子中的配置是写入到dbname_<id>库中。其中,<id>的值通过dbRule计算得出,例如 dbRule 计算出的值是 1,则 db name 为dbname_001。dbRule:分库计算规则,这是一个 groovy 表达式,通过该表达式计算出的值,最后得出数据要写入的分库名。tableNamePattern:表名的格式,例子中的配置是写入到table_<id>表中。其中,<id>的值通过tableRule计算得出,例如tableRule计算出来的值是 25,则数据写入的表名为table_025。tableRule:分表的计算规则,这也是一个 groovy 表达式,通过该表达式可以计算出分表的表名。
DataX 配置文件生成工具
可以使用 build_datax_json.py 工具生成 DataX 配置文件,用法如下:
usage: build_datax_json.py [-h] --reader_url READER_URL --reader_password
READER_PASSWORD --reader_user READER_USER
--reader_dbs READER_DBS --reader_tbs READER_TBS
[--reader_columns READER_COLUMNS]
[--reader_split READER_SPLIT] --writer_url
WRITER_URL --writer_password WRITER_PASSWORD
--writer_user WRITER_USER --writer_dbs WRITER_DBS
--writer_tbs WRITER_TBS --writer_columns
WRITER_COLUMNS [--db_rule DB_RULE]
[--tb_rule TB_RULE] [--channel CHANNEL]
optional arguments:
-h, --help
--reader_url READER_URL:reader配置的jdbc url信息
--reader_password READER_PASSWORD:reader配置的数据库用户密码
--reader_user READER_USER:reader配置的数据库用户名
--reader_dbs READER_DBS:reader配置的连接的database信息,格式为"库名或库名前缀[,下标开始位置,总数,后缀宽度]"
--reader_tbs READER_TBS: reader配置的需要导出的表名信息,格式为"表名或表名前缀[,下标开始位置,总数,后缀宽度]"
--reader_columns READER_COLUMNS:reader配置的读取的表列,默认为"*"
--reader_split READER_SPLIT:reader配置的读取表数据拆分字段,选择索引,主键列
--writer_url WRITER_URL:writer配置的jdbc url信息
--writer_password WRITER_PASSWORD:writer配置的数据库用户密码
--writer_user WRITER_USER:writer配置的数据库用户名
--writer_dbs WRITER_DBS:writer配置的连接的database信息,格式为"库名或库名前缀[,下标开始位置,总数,后缀宽度]"
--writer_tbs WRITER_TBS:writer配置的需要导出的表名信息,格式为"表名或表名前缀[,下标开始位置,总数,后缀宽度]"
--writer_columns WRITER_COLUMNS:reader配置的读取的表列
--db_rule DB_RULE:分库分表拆分规则之库名规则
--tb_rule TB_RULE:分库分表拆分规则之表名规则
--channel CHANNEL:channel setting
使用 DataX 实现多库对多库的数据迁移
配置步骤如下所示:
使用
build_datax_json.py工具生成 json 格式的配置文件。[admin@hostname datax]$ python ./build_datax_json.py --reader_user='root' --reader_password='root' --reader_url='jdbc:mysql://xxx.xxx.xxx.xxx:3306' --reader_dbs='ningyue,0,2,1' --reader_tbs='accl_r_fileinf_,0,2,1' --reader_columns='bat_id,pty_id,shard_id,acct_dt,file_type,file_path,file_name' --writer_user='test@mysql' --writer_password='test' --writer_url='jdbc:oceanbase://xxx.xxx.xxx.xxx:32637' --writer_dbs='test_,0,100,2' --writer_tbs='accl_r_fileinf_,0,100,2' --writer_columns='bat_id,pty_id,shard_id,acct_dt,file_type,file_path,file_name' --db_rule='#shard_id#[0,1]' --tb_rule='#shard_id#[0,1]' --channel=15 > transfer.json其中,各参数配置说明如下:
--reader_dbs='ningyue,0,2,1':0 是后缀的起始位置;2 是库的个数;1 是后缀的长度,如起始位置是0,长度为 2,则第一个标识是 00。--reader_tbs='accl_r_fileinf_,0,2,1':0 是后缀的起始位置;2 是库的个数;1 是后缀的长度,如起始位置是 0,长度为 2,则第一个标识是 00。--reader_columns:读取的列名,以逗号分隔。--writer_columns写入的列名,以逗号分隔。--db_rule='#shard_id#[0,1]':使用shard_id字段的第 1、2 位作为规则匹配。若要使用其他配置,可以使用
#<字段名>#[a,b]的格式作为匹配规则,a 表示该字段的第 a+1 位,b 表示该字段的第 b+1 位。--tb_rule='#shard_id#[0,1]':使用shard_id字段的第 1、2 位作为规则匹配。若要使用其他配置,可以使用
#<字段名>#[a,b]的格式作为匹配规则,a 表示该字段的第 a+1 位,b 表示该字段的第 b+1 位。--channel:并行的通道个数。
使用 DataX 执行导入。
[admin@hostname datax]$ python ./bin/datax.json transfer.json