odb是Apache Trafodion自带的一款轻量级、高性能、基于ODBC的面向命令行的ETL工具, 今天来看看如何用odb从Oracle导数据到Trafodion数据库, 包含以下步骤:
目录
一、安装odb
1.下载安装包
有两种方式可以获取odb的安装包:
1.1 官网下载, 下载地址:http://www.apache.org/dyn/closer.lua/trafodion/apache-trafodion-2.2.0/bin/apache-trafodion_clients-2.2.0-RH6-x86_64.tar.gz
1.2. 自己编译, 参考我之前的博客:在Centos 7.6上编译Apache Trafodion
2. 安装unixODBC
odb依赖unixODBC, 所以还需要安装unixODBC。 unixODBC有两种安装方法:
1. yum install -y unixODBC, 这种方法安装的unixODBC版本可能比较老旧。
2. 到官网下载源码, 自己编译安装。下载地址:http://www.unixodbc.org/
tar xf unixODBC-2.3.7.tar.gz
cd unixODBC-2.3.7
mkdir ~/local/unixODBC
./configure --prefix=$HOME/local/unixODBC --disable-gui --enable-threads --disable-drivers
make && make install
export ODBCHOME=$HOME/local/unixODBC
export ODBCSYSINI=$ODBCHOME/etc
export ODBCINI=$ODBCSYSINI/odbc.ini
export LD_LIBRARY_PATH=$ODBCHOME/lib:$LD_LIBRARY_PATH
export PATH=$ODBCHOME/bin:$PATH
odbcinst -j
3. 安装Trafodion ODBC驱动
参考了:https://trafodion.apache.org/docs/client_install/index.html#odbc-linux-install
这里用的是自己编译的驱动, apache-trafodion_clients-2.4.0-RH-x86_64-debug.tar.gz, 里面包含了ODBC的安装包和odb的安装包
tar xf apache-trafodion_clients-2.4.0-RH-x86_64-debug.tar.gz
cd clients/
tar xf TRAF_ODBC_Linux_Driver_64.tar.gz
cd PkgTmp/
mkdir -p ~/local/trafodion/odbc
./install.sh
根据安装脚本提示填入信息, 例如
Do you accept the terms of the license (YES/NO): YES
Thank You....
Proceeding with install
ENTER a directory for library files
OR hit Enter to use the default [/usr/lib64] : /home/sujinpei/local/trafodion/odbc/lib64
ENTER a directory for datasource template file
OR hit Enter to use the default [/etc/odbc] : /home/sujinpei/local/trafodion/odbc
ENTER a directory for sample
OR hit Enter to use the default [/etc/odbc] : /home/sujinpei/local/trafodion/odbc
TRAFODBC driver has successfully been installed.
* Library libtrafodbc_l64_drvr.so is installed on /home/sujinpei/local/trafodion/odbc/lib64
* data source template file TRAFDSN has been copied onto /home/sujinpei/local/trafodion/odbc
* sample file has been copied onto /home/sujinpei/local/trafodion/odbc
设置环境变量
export LD_LIBRARY_PATH=$HOME/local/trafodion/odbc/lib64:$LD_LIBRARY_PATH
4.安装odb
回到clients目录
mkdir ~/local/trafodion/odb
tar xf odb64_linux.tar.gz -C ~/local/trafodion/odb
export PATH=$HOME/local/trafodion/odb/bin:$PATH
odb64luo -version
二、配置数据源
如何安装Oracle ODBC的驱动及配置数据源, 请参考我之前的博客:如何在CentOS 7上安装配置Oracle ODBC驱动链接Oracle数据库
这里演示如何配置Trafodion的数据源
2.1 确认配置文件路径
odbcinst -j
unixODBC 2.3.7
DRIVERS............: /home/sujinpei/local/unixODBC/etc/odbcinst.ini
SYSTEM DATA SOURCES: /home/sujinpei/local/unixODBC/etc/odbc.ini
FILE DATA SOURCES..: /home/sujinpei/local/unixODBC/etc/ODBCDataSources
USER DATA SOURCES..: /home/sujinpei/local/unixODBC/etc/odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
2.2 配置驱动信息
在odbcinst.ini文件里添加如下信息
[Trafodion]
Description = Trafodion ODBC Stand Alone Driver
Driver = /home/sujinpei/local/trafodion/odbc/lib64/libtrafodbc_drvr64.so
FileUsage = 1
UsageCount = 1
Threading = 1
2.3 配置连接信息
在odbc.ini里添加如下信息
[traf]
Description = data source connect to Trafodion
Driver = Trafodion
Catalog = TRAFODION
Schema = SEABASE
DataLang = 0
FetchBufferSize = SYSTEM_DEFAULT
Server = TCP:10.10.23.20:23400
clientCharSet = utf-8
SQL_ATTR_CONNECTION_TIMEOUT = SYSTEM_DEFAULT
SQL_LOGIN_TIMEOUT = SYSTEM_DEFAULT
SQL_QUERY_TIMEOUT = NO_TIMEOUT
ServiceName = TRAFODION_DEFAULT_SERVICE
三、基本使用方法
3.1 使用帮助
odb64luo -h
3.2 查看可用数据源
odb64luo -lsdsn
3.3 分别创建一张oracle表和trafodion表
odb64luo -d orac -u odb -p odb -x "create table testcopy(id int, name char(20))"
odb64luo -d orac -u odb -p odb -x "create table testcopy(id int, name char(20))"
3.4 往oracle数据库插入一些测试数据
odb64luo -d orac -u odb -p odb -x "insert into testcopy values(1, 'hello')"
odb64luo -d orac -u odb -p odb -x "insert into testcopy values(2, 'world')"
3.5 将数据从Oracle导到Trafodion
odb64luo -d orac:traf -u odb:trafodion -p odb:traf123 -cp src=testcopy:tgt=testcopy
3.6 验证结果
odb64luo -d traf -u trafodion -p traf123 -x "select * from testcopy"
四、影响性能的参数
4.1 parallel
parallel指定用多少组线程进行数据拷贝, parallel不是越大越好。 根据服务器配置合理的设置parallel可以达到最佳的性能。
odb64luo -d orac:traf -u odb:trafodion -p odb:traf123 -cp src=testcopy:tgt=testcopy:parallel=8
4.2 rows
rows指定odb一次提交多少数据量, 有两种设置方法:
4.2.1 rows=10000, 表示最多10000行提交一次。
odb64luo -d orac:traf -u odb:trafodion -p odb:traf123 -cp src=testcopy:tgt=testcopy:parallel=8:rows=10000
4.2.2 rows=M128, 表示最大128M的数据量提交一次
odb64luo -d orac:traf -u odb:trafodion -p odb:traf123 -cp src=testcopy:tgt=testcopy:parallel=8:rows=M128
4.3 loadcmd
loadcmd指定odb用那种加载方式, loadcmd=UL会使用UPSERT USING LOAD语句, 通常这种方式可以得到最佳的性能。
odb64luo -d orac:traf -u odb:trafodion -p odb:traf123 -cp src=testcopy:tgt=testcopy:rows=M128:parallel=10:loadcmd=UL
五、编码问题
从Oracle导数据到Trafodion数据库, 如果有中文字符,通常会涉及到编码转换。Trafodion推荐用utf-8存储中文, 源数据库的中文数据编码如果不是utf-8编码, 最终需要转换成utf8编码存储到Trafodion数据库。Oracle的ODBC驱动和Trafodion的ODBC驱动都支持编码转换, 都有相应的参数配置, 如果配置不好就会出现导入数据为乱码或是编码转换报错的情况。
控制Oracle ODBC驱动拿到的数据编码的参数是一个环境变量:NLS_LANG
告诉Trafodion ODBC驱动客户端的数据是什么编码的参数是DSN的配置项:ClientCharSet
下图是odb从Oracle导数据导Trafodion的简单数据流图
从上图可以看出, odb本身并不会修改数据编码, 乱码问题通常会出现在Trafodion ODBC尝试将ClientCharSet指定编码的数据转换成utf8, 比如 export NLS_LANG="Simplified Chinese_china".ZHS16GBK, 但是在Trafodion的数据源却设置了ClientCharSet=utf-8, 结果就导致了编码错乱。
所以, 解决编码问题的关键就是保证NLS_LANG的编码和ClientCharSet指定的编码一致。