环境信息:@H_404_2@
Greenplum@H_404_2@:Greenplum Version: 'postgres (Greenplum Database) 4.3.8.2 build 1'@H_404_2@
Oracle@H_404_2@:Release 11.2.0.1.0 Production@H_404_2@
@H_404_2@
1.@H_404_2@ Oracle@H_404_2@客户端部署
在使用sqluldr2@H_404_2@工具之前,首先需要在Greenplum(@H_404_2@以下都称为GP)@H_404_2@的Master@H_404_2@节点部署Oracle@H_404_2@客户端,因为sqluldr2@H_404_2@需要使用libclntsh.so@H_404_2@等共享库。@H_404_2@
假如你想省事的话,也直接从Oracle@H_404_2@服务器将安装目录拷贝过来,然后配置以下环境变量就可以了。@H_404_2@
@H_404_2@
为了防止配置Oracle@H_404_2@环境变量会影响GP@H_404_2@数据库客户端工具的使用,我们单独给Oracle@H_404_2@客户端创建一个用户,然后来单独配置Oracle@H_404_2@环境变量,就不和GP@H_404_2@参合到一起了。@H_404_2@
首先创建oracle@H_404_2@用户组和用户:@H_404_2@
groupadd -g 1000 dba@H_404_2@
groupadd -g 10001 oinstall@H_404_2@
useradd -u 1002 -d /var/lib/oracle -s /bin/bash -g oinstall -G dba -m oracle@H_404_2@
passwd oracle@H_404_2@
@H_404_2@
比如这里,我们就直接将Oracle@H_404_2@服务器的软件安装目录product@H_404_2@@H_404_2@拷贝过来,并放到/var/lib/oracle@H_404_2@下面:@H_404_2@
[root@CDHA oracle]# pwd@H_404_2@
/var/lib/oracle@H_404_2@
@H_404_2@
[root@CDHA oracle]# chown -R oracle:oinstall /var/lib/oracle@H_404_2@
@H_404_2@
[root@CDHA oracle]# ll@H_404_2@
drwxrwxrwx 3 oracle oinstall 4096 Jul 11 22:14 product@H_404_2@@H_404_2@
-rwxrwxrwx 2 oracle oinstall 185766 Mar 13 2013 sqluldr2_linux64_10204.bin@H_404_2@
@H_404_2@
最后我们配置Oracle@H_404_2@的相关环境变量,添加到Oracle@H_404_2@的家目录的.bashrc@H_404_2@文件中:@H_404_2@
export ORACLE_BASE=/var/lib/oracle@H_404_2@
export ORACLE_HOME=/var/lib/oracle/product/11.2.0/dbhome_1@H_404_2@
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib@H_404_2@
export PATH=$ORACLE_HOME/bin:/sbin:/usr/sbin:/usr/ccs/bin:/usr/bin:/sbin:$PATH:/bin@H_404_2@
export TNS_NAMES=$ORACLE_HOME/network/admin@H_404_2@
export TNS_ADMIN=$ORACLE_HOME/network/admin@H_404_2@
@H_404_2@
# CLASSPATH must include the following JRE locations:@H_404_2@
CLASSPATH=${ORACLE_HOME}/rdbms/jlib:${CLASSPATH}@H_404_2@
export CLASSPATH=$CLASSPATH:/opt/oracle/product/11/network/jlib@H_404_2@
@H_404_2@
#@H_404_2@将GP@H_404_2@的环境信息也配置进来,后面需要使用gpload@H_404_2@访问GP@H_404_2@数据库
source /usr/local/greenplum-db/greenplum_path.sh@H_404_2@
@H_404_2@
export MASTER_DATA_DIRECTORY=/hadoopdata1/master/gpseg-1@H_404_2@
export PGPORT=5432@H_404_2@
export PGUSER=gpadmin@H_404_2@
export PGDATABASE=template1@H_404_2@
@H_404_2@
2.@H_404_2@ sqluldr2@H_404_2@安装部署
下载sqluldr2_linux64_10204.bin@H_404_2@文件,如果你的环境是windows@H_404_2@或者linux32@H_404_2@位的,请下载对应的文件。@H_404_2@
我们可以将这个文件重新命名并放到下面的路径中或者建立一个软链接(@H_404_2@这个路径我们已经配置到PATH@H_404_2@中)@H_404_2@:@H_404_2@
[oracle@CDHA ~]$ pwd@H_404_2@
/var/lib/oracle@H_404_2@
[oracle@CDHA ~]$ ll product/11.2.0/dbhome_1/bin/sqluldr2@H_404_2@@H_404_2@
-rwxrwxrwx 2 oracle oinstall 185766 Mar 13 2013 product/11.2.0/dbhome_1/bin/sqluldr2@H_404_2@
@H_404_2@
我们来验证一下:@H_404_2@
[oracle@CDHA ~]$ sqluldr2 @H_404_2@
@H_404_2@
sql*UnLoader: Fast Oracle Text Unloader (GZIP,Parallel),Release 4.0.1@H_404_2@
(@) Copyright Lou Fangxin (Anysql.net) 2004 - 2010,all rights reserved.@H_404_2@
@H_404_2@
License: Free for non-commercial useage,else 100 USD per server.@H_404_2@
@H_404_2@
Usage: sqlULDR2 keyword=value [,keyword=value,...]@H_404_2@
@H_404_2@
Valid Keywords:@H_404_2@
user = username/password@tnsname@H_404_2@
query = select statement@H_404_2@
field = separator string between fields@H_404_2@
record = separator string between records@H_404_2@
rows = print progress for every given rows (default,1000000) @H_404_2@
file = output file name(default: uldrdata.txt)@H_404_2@
log = log file name,prefix with + to append mode@H_404_2@
fast = auto tuning the session level parameters(YES)@H_404_2@
text = output type (MysqL,CSV,MysqLINS,ORACLEINS,FORM,SEARCH).@H_404_2@
charset = character set name of the target database.@H_404_2@
ncharset= national character set name of the target database.@H_404_2@
parfile = read command option from parameter file @H_404_2@
@H_404_2@
for field and record,you can use '0x' to specify hex character code,@H_404_2@
\r=0x0d \n=0x0a |=0x7c,=0x2c,\t=0x09,:=0x3a,#=0x23,"=0x22 '=0x27@H_404_2@
可以看到非常详细的帮助说明。@H_404_2@
@H_404_2@
@H_404_2@
3.@H_404_2@ gpload@H_404_2@简单介绍
gpload@H_404_2@是GP@H_404_2@中提供的用来进行数据装载的工具,其可以看做是对gpfdist@H_404_2@的封装,所以依赖gpfdist@H_404_2@组件。
gpload@H_404_2@通过它的控制文件指定装载的细节信息。所以编写控制文件是用好gpload@H_404_2@的关键所在。gpload@H_404_2@的控制文件采用YAML1.1@H_404_2@文档格式编写,因此它必须得是有效的YAML@H_404_2@格式。
这一块的内容我在博客http://www.jb51.cc/article/p-csmiruzk-mm.html中已经介绍过了,大家可以看一下。本章主要介绍将Oracle@H_404_2@数据直接迁移到GP@H_404_2@数据库中。@H_404_2@
@H_404_2@
4.@H_404_2@ 实现Oracle@H_404_2@数据直接并行加载到GP@H_404_2@的原理@H_404_2@
使用gpload@H_404_2@,一方面我们可以实现GP@H_404_2@中不能直接实现的merge@H_404_2@操作,另外通过结合命名管道,我们可以实现无落地文件的并行快速加载。从而帮助我们提高海量数据加载效率,也避免了使用传统落地文件方式加载的过大存储开销,以及超大文件落地过程导致的加载性能瓶颈。@H_404_2@
本文使用的方法是通过Linux@H_404_2@的命名管道,gpload@H_404_2@,以及sqluldr2@H_404_2@程序(@H_404_2@用于oracle@H_404_2@数据的快速卸载)@H_404_2@实现从Oracle@H_404_2@到GP@H_404_2@无落地文件快速加载。@H_404_2@
@H_404_2@
场景:将Oracle@H_404_2@的iphone_user_detail@H_404_2@表加载到GP@H_404_2@数据库的iphone_user_detail@H_404_2@表中。@H_404_2@
首先,我们创建gpload@H_404_2@的控制文件,gpload.ctl@H_404_2@内容如下:@H_404_2@
---@H_404_2@
VERSION: 1.0.0.1@H_404_2@
DATABASE: zhangyun_db@H_404_2@
USER: zhangyun@H_404_2@
HOST: CDHA@H_404_2@
PORT: 5432@H_404_2@
GPLOAD:@H_404_2@
INPUT:@H_404_2@
- SOURCE:@H_404_2@
LOCAL_HOSTNAME:@H_404_2@
- CDHA@H_404_2@
PORT: 46666@H_404_2@
FILE:@H_404_2@
- /var/lib/oracle/iphone_user_detail/iphone_user_detail_file@H_404_2@
- FORMAT: text@H_404_2@
- DELIMITER: E'\001'@H_404_2@
- NULL_AS: ''@H_404_2@
- ENCODING: utf8@H_404_2@
- ERROR_LIMIT: 25@H_404_2@
- ERROR_TABLE: err_iphone_user_detail@H_404_2@
OUTPUT:@H_404_2@
- TABLE: ann_gbs_safe.iphone_user_detail@H_404_2@
- MODE: INSERT@H_404_2@
@H_404_2@
然后编写脚本export_iphone_user_detail.sh@H_404_2@,用于执行数据迁移工作:@H_404_2@
#!/bin/bash@H_404_2@
mknod /var/lib/oracle/iphone_user_detail/iphone_user_detail_file p@H_404_2@
sqluldr2 user=zy/xxxxxx@192.168.1.122:1521/salesdb query="select /*+ parallel(8)*/ deptno,fmi,location,iphone_number from pps.iphone_user_detail" field=0x01 charset=utf8 safe=yes FILE=/var/lib/oracle/iphone_user_detail/iphone_user_detail_file &@H_404_2@
gpload -f gpload.ctl -V -l gpload.log@H_404_2@
rm -rf /var/lib/oracle/iphone_user_detail/iphone_user_detail_file@H_404_2@
@H_404_2@
6.@H_404_2@ 执行export_iphone_user_detail.sh@H_404_2@脚本,并查看日志@H_404_2@
在执行脚本之前,确保GP@H_404_2@中已经创建好了iphone_user_detail@H_404_2@表。@H_404_2@
[oracle@CDHA ~]$ bash export_iphone_user_detail.sh@H_404_2@
2016-07-13 14:47:00|INFO|gpload session started 2016-07-13 14:47:00@H_404_2@
2016-07-13 14:47:00|INFO|started gpfdist -p 21211 -P 21212 -f "/var/lib/oracle/iphone_user_detail/iphone_user_detail_file" -t 30@H_404_2@
0 rows exported at 2016-07-13 14:47:03,size 0 MB.@H_404_2@
1000000 rows exported at 2016-07-13 14:47:10,size 719 MB.@H_404_2@
2000000 rows exported at 2016-07-13 14:47:18,size 1451 MB.@H_404_2@
3000000 rows exported at 2016-07-13 14:47:25,size 2154 MB@H_404_2@
.……………………….@H_404_2@
等执行完成后,就可以进入GP@H_404_2@数据库中查看。@H_404_2@
zhangyun_db=# select count(*) from iphone_user_detail;@H_404_2@
count@H_404_2@
--------@H_404_2@
194000000@H_404_2@
(1 row)@H_404_2@