在面对海量数据的时候,oracle还是有一些限制,比如在单表10亿量级的查询等操作上,就算物理机器的内存已经设置很大,但是实际的效果也不尽人意,在这个时候,GP是可选方案之一。
我们这里没有采用软件从oracle到greenplum,如果使用软件自动设置的话,请自行搜索ora2pg的相关操作,这里采用的方案是使用sqluldr2来导出数据,然后通过greenplum的外部表用gpfdist来实现数据的加载和导入。
1.使用sqluldr2导出oracle数据
此工具是淘宝DBA开发的,后来部分功能收费了,但是基本功能还是可以使用的,地址http://www.anysql.net/tools/sqluldr2-non-free-features.html
复制sqluldr2_linux32_10204.bin(64位系统用sqluldr2_linux64_10204.bin)到$ORACLE_HOME的bin目录,重命名为sqluldr2.bin
使用实例:
-bash-3.2$ sqluldr2.bin USER=userid/keyword@db_name sql=get_tables.sql head=no FILE=/oracle/oradata/backup/stock.csv
-bash-3.2$ sqluldr2.bin USER=username/pwd@orcl query="select * from tb_idm_itg_his_cl " field=0x09 file=/home/oracle/cl.txt
0x09是tab
0x07是|
注意:数据中不能存在0x00,需要替换sed -i "s/\x00//g;/''/g" tablename.txt
这里需要说明的是虽然sqluldr2支持很多的分隔符,我们的第一感觉就是用tab作为分割符,但是在实际使用的过程中,0x09的配置会导致在后面greenplum读取外部表的时候报一些很奇怪的错误,下面给出实际使用的方式:
sqluldr2.bin USER=username/pwd@orcl query="select * from tb_idm_itg_his_cl " field=^ file=/home/oracle/cl.txt
导出277M数据用时14s,性能还是很不错的。然后将导出的数据scp到greenplum机器
2.在greenplum中开始gpfdist服务
gpfdist -d /home/greenplum-4.3/ext_files -p 8081 &
也可以-l指定log地址 -d是指load目录
开启gpfdist服务后,我们需要处理下文件,因为在创建外部表读取的时候出出现0x00错误,因为greenplum需要文件中不能出现0x0这样的数据。
(1)invalid byte sequence for encoding “UTF8”: 0x00 :原因两种一种字符存在0x00一种数据中有不可见字符如char(0)
前者:set id1_value=replace(id1_value,’0x00’,00)
后者:set id1_value=replace(id1_value,chr(0),null)
(2)ERROR: missing data for column :因为导出数据的时候使用了0x09的tab分隔符,换成^就没问题
sed -i "s/\x00//g;/''/g" tb_