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.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
。