3. 大表数据迁移

本章主要介绍大表数据迁移和大表比对功能的使用。

大表数据迁移功能是专门针对 大量数据从 Oracle 导出,导入到 LightDB-X 的场景 而使用的,当您的 Oracle 表大小超过 100GB, 且存在分区表时,可以考虑使用该工具来进行数据迁移。

大表数据迁移功能包含从oracle导出数据、导入数据到lightdb、比对数据是否一致 三个步骤,用户可遵循本章的步骤完成对大表数据的高效快速迁移。

3.1. 准备

3.1.1.

对于需要迁移数据的大表,需要先使用lightdb-etl将表定义迁移。确保oracle和lightdb的表都已经存在。 下载迁移工具 LightDB-ETL

3.1.2. sqluldr2

大表数据迁移功能依赖 sqluldr2 来实现数据迁移功能,所以必须下载 sqluldr2 工具并正确配置,才能使用大表数据迁移工具。

第一步下载sqluldr2 。

第二步:需要在安装oracle的服务器上安装sqluldr2。服务器安装oracle可参考 oracle安装

第三步:根据服务器选择正确的sqluldr2版本,将其复制粘贴到oracle的bin目录下。

第四步:执行命令:chmod +x 命令为sqluldr2程序赋予可执行权限

第五步: 配置oracle的环境变量,让 sqluldr2 程序默认可以找到其所依赖的 oracle 客户端动态库。

示例如下:

服务器Linux:centos7,64位;Oracle:11g
1、下载安装包,将sqluldr2_linux64_10204.bin 程序上传到迁移服务器4的oracle的bin目录;
2、执行命令:chmod +x sqluldr2_linux64_10204.bin 为此程序赋予可执行权限
3、配置环境变量
 export EDITOR=vi
 export GGATE=/home/oracle/otc
 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
 export ORACLE_BASE=/oracle/app
 export ORACLE_HOME=/oracle/app/product/19.3.0/db_1
 export ORACLE_SID=test
 export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$GGATE:$PATH
 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:$GGATE:$LD_LIBRARY_PATH
 export LD_LIBRARY_PATH=/u001/app/oracle/product/11.2.0/db_1/lib:$LD_LIBRARY_PATH
4、验证是否成功:  ./sqluldr2_linux64_10204.bin  --help

3.2. 导出oracle数据

使用 oracleexport 工具导出oracle的数据到指定目录。

3.2.1. 参数说明

参数(值)

说明

data.dir

导出文件存放路径

userInfo

oracle的连接串,格式为username/password@ip:port/dbname

sep

数据字段分隔符,默认i_mpig

shardCount

非分区表分片数 默认20

threadCount

线程数,默认4

hasNull

取模字段是否有null值

limit100

是否仅导出100行(测试目的)

notPartTable.txt

非分区表表的配置文件,在当前运行目录

partTable.txt

分区表配置文件,在当前运行目录

3.2.2. notPartTable.txt

需要导入的非分区表的配置文件,需要指定迁移的表、分片字段、表数据量、预留字段。 基本格式为:schema.tablename,分片列,表数据量(设置为1即可),预留字段(设置f即可)。

BENCHMARKSQL.BMSQL_CUSTOMER,C_ID,1,f
BENCHMARKSQL.BMSQL_ITEM,I_ID,1,f
BENCHMARKSQL.BMSQL_STOCK,S_W_ID,1,f

# 可通过下列语句生成分片字段和数据量以外的所有配置项
# SELECT owner || '.' || table_name || ',,,','f' FROM dba_tab_columns WHERE (owner,table_name) in (
#   select owner,table_name from dba_tables where owner = 'BENCHMARKSQL'
# )
# AND (owner,table_name) NOT IN (SELECT owner,table_name from dba_tables WHERE partitioned='YES')
# and owner = 'BENCHMARKSQL'
# group by owner || '.' || table_name;

3.2.3. partTable.txt

需要导入的分区表的配置文件,需要指定迁移的表、分区、预留字段(设置f即可) 基本格式为:schema.tablename,分区表的所有分区,预留字段(设置f即可)

# schema_name.table_name,partition(part1|part2|part3|part4),f
BENCHMARKSQL.PARTITIONED_TABLE,partition(P1|P2|P3|P4),f
BENCHMARKSQL.BMSQL_NEW_ORDER,partition(SYS_P384096|SYS_P384097|SYS_P384098|SYS_P384099|SYS_P384100|SYS_P384101|SYS_P384102|SYS_P384103),f

# 可通过下列语句生成除了分区名部分以外的所有配置项
# SELECT owner || '.' || table_name || ',partition(part1|part2|part3|part4),','f' FROM dba_tab_columns WHERE (owner,table_name)  in (
#   select owner,table_name from dba_tables where owner = 'BENCHMARKSQL'
# )
# AND (owner,table_name) IN (SELECT owner,table_name from dba_tables WHERE partitioned='YES')
# and owner = 'BENCHMARKSQL'
# group by owner || '.' || table_name;

# 可通过下列语句生成分区
# SELECT table_owner || '.' || table_name,'f' FROM dba_tab_partitions
# WHERE (table_owner,table_name) in (
#   select owner,table_name from dba_tables where owner = 'BENCHMARKSQL'
# )
# AND (table_owner,table_name) IN (SELECT owner,table_name from dba_tables WHERE partitioned='YES')
# and table_owner = 'BENCHMARKSQL'
# GROUP BY table_owner || '.' || table_name;

3.2.4. 运行命令

java -Ddata.dir=../oracle_import -DuserInfo=oracle/oracle@ip:1521/test -jar oracleexport-24.2.6.0.jar

3.3. 导入数据

使用 import2lightdb 工具导入工具 oracleexport 导出的数据到指定的lightdb数据库。 工具支持三选一模式:导数据(无justIndex和forAllIndex选项),自动建导入数据的索引(传justIndex,会创建根表索引,需要正常退出),创建指定分区表的索引(传forAllIndex,不会创建根表索引)。

3.3.1. 参数说明

参数(值)

说明

data.dir

oracleexport工具导出文件的存放路径

userInfo

oracle的连接串,格式为ip:port/dbname

username

用户名

password

密码

justIndex

标志为创建索引而不是导入数据(仅支持二选一)

forAllIndex

仅跑批量分区索引

sep

导入数据分隔符默认i_mpig

shardCount

非分区表的分片数,默认20,同导出程序的默认值

threadCount

线程数,min(默认cpu数量的50%,32)

indexInfo.txt

需要导入的索引定义列表,在当前运行目录

tableInfo.txt

需要导入的表定义列表,在当前运行目录

full_indexInfo.txt

需要导入的分区表索引定义列表,在当前运行目录

3.3.2. tableInfo.txt

需要导入的表定义列表配置文件,每个表一行,格式为:schema.tablename。

#schema.table
test.t1

3.3.3. indexInfo.txt

需要导入的索引定义列表配置文件,基本格式为:schema table indx_name unqiue fields(用空格隔开)。

# 基本格式为,使用一个空格隔开: schema table indx_name unqiue fields
# unqiue的取值是Y或N,Y表示创建唯一索引。
# fields表示索引列,可多个列用逗号隔开
#test t1 index_1 Y a,b,c

3.3.4. full_indexInfo.txt

需要导入分区表的索引定义列表配置文件,基本格式为:schema table indx_name unqiue fields(用空格隔开)。

# 基本格式为,使用一个空格隔开: schema table indx_name unqiue fields
# unqiue的取值是Y或N,Y表示创建唯一索引。
# fields表示索引列,可多个列用逗号隔开
#test t1 index_1 Y a,b,c

3.3.5. 运行命令

java -Ddata.dir=../oracle_import -DuserInfo=ip:1521/test -Dusername=lightdb -Dpassword=lightdb -jar import2lightdb-24.2.6.0.jar

3.4. 迁移结果对比

使用 datacompare 工具对比指定oracle和lightdb的schema下的表量、对应表的数据行数。

3.4.1. 参数说明

参数(值)

说明

userInfo

oracle连接消息,格式为ip:port/dbname

username

oracle的用户名

password

oracle的密码

lightdbUrl

lightdb连接消息,格式为ip:port/dbname

usernameLightDB

lightdb的用户名

passwordLightDB

lightdb的密码

threadCount

线程数,默认8

confDir

清单data_compare.txt的路径,默认当前运行路径

data_compare.txt

表的schema清单,逗号分割、带单引号

3.4.2. data_compare.txt

需要对比的schema清单,逗号分割、带单引号。

# 配置schema清单,''括起来,多个schema用英文逗号隔开
#'benchmarksql','test'

3.5. 结果查看

对比工具 datacompare 会在当前运行目录生成一个 data_compare.html 显示对比结果。 数据导入工具``import2lightdb`` 会在当前目录生成数据导入性能统计 import_perf.html 和索引创建性能 create_index_perf.html。 数据导出工具 oracleexport 会在当前目录生成数据导出性能统计 import_perf.html