静态表oracle迁移greenplum方案

1、  流程

 

Sqluldr2:这个是楼方鑫大神开发的一个基于oracle oci的导出工具。需要单独下载。是一个直接可用的可执行文件。这个工具依赖一些oracle的动态链接库,需要在装有oracle环境(装client也行)执行。

https://yq.aliyun.com/articles/210400?utm_content=m_30850

平面文件:就是用文本工具直接可读的文件。比如win下常见的txt格式、csv格式文件。

Gpfdist:这个是greenplum自带的并行文件分发程序,用于支持gp外部表和加载数据(通过gpload)。因为依赖gp自带的一些链接库,需要在装有gp环境执行。这个服务需要单独启动。

http://gpdb.docs.pivotal.io/4330/utility_guide/admin_utilities/gpfdist.html

Gpload:这个是gp自带的加载外部数据入gp的工具,跟oracle的sql*loader功能差不多。这个是封装gpfdist实现的,因此依赖gpfdist服务环境、python2.6.2以上版本。具体可查看以下官方文档。

http://www.cnblogs.com/daojiao/p/4595597.html

http://gpdb.docs.pivotal.io/4330/utility_guide/admin_utilities/gpload.html#topic1

 

2、  操作步骤

1、  oracle数据库上传Sqluldr2可执行程序。

2、  使用Sqluldr2导出oracle数据(直接执行该命令查看帮助)。

./sqluldr2linux64.bin  user=wjf/1@dreamer query="select * from wjf.wjf_001" file=/tmp/123.txt text=text field=0x2c record=0x0a quote='"' charset=utf8

导出后的文本格式如下:

User:指定用户密码和连接库。

Query:指定导出数据

File:指定导出文件名。

Text:指定输出文件格式。Csv第一行为列名展示,text没有,若是csv,导入前把第一样删去。

Field:指定列与列的分隔符。

Record:指定行与行的分隔符。

Quote:指定列的边界。csv默认就是双引号,text默认为空。

Charset:指定目标端的字符集。

ID,VC,TM(text=CSV下才有)

"2","fjie\n\tsfjie","2017-10-19 10:21:09"

"2","fjie\n\tsfjie","2017-10-19 10:21:09"

"c","fjie\n\tsfjie","2017-10-19 10:21:09"

 

3、  复制导出文件到greenplum服务器。

4、  配置启动gpfdist服务(gpfdist –help查看帮助)。

gpfdist -d /home/gpadmin/wjf_test/ -p 8085 -l /home/gpadmin/wjf_test/gpfdist.log &

-d:指定平面文件存放路径。

-p:指定gpfdist使用的端口号。

-l:指定存放的日志文件。

启动成功后,可通过ps –ef |grep gpfdist,netstat –anp|grep gpfdist查看进程和监听。

5、  Greenplum库新建导入表结构。

6、  配置gpload控制文件,导入数据(直接执行该命令可查看帮助)。

新建一个控制文件my_q.yml(格式可通过帮助获得)。

---

VERSION: 1.0.0.1

DATABASE: wjf

USER: gpadmin

HOST: csdb

PORT: 5432

GPLOAD:

   INPUT:

    - SOURCE:

         LOCAL_HOSTNAME:

           - csdb

         PORT: 8085

         FILE:

           - /home/gpadmin/wjf_test/123.txt

    - COLUMNS:

           - vc: character varying

           - id: character varying

           - tm: timestamp

    - FORMAT: csv

    - ERROR_LIMIT: 25000

    - LOG_ERRORS: TrueD

    - QUOTE: '”'

   OUTPUT:

    - TABLE: wjf.wjf_001

    - MODE: INSERTS

控制文件要注意COLUMNS字段顺序,该字段名与greenplum库表名一致。

该文件为python解析格式,严格区分行前空格。

执行导入命令。

gpload -f my_1.yml  -l gpload.log

-f:指定控制文件。

-l:指定认知文件。

 

3、  相关问题

效率情况说明

特殊字符处理

1、脚本运行环境python3.6 2、脚本忽略LOB字段数据 3、脚本生成以^为分割符的csv格式文件 4、脚本避免转义字符将‘\’替换为‘/’,数据中存在分割符:^转换为# 5、特殊字符处理:删除:'\u0000','"',oracle数据回车符:'\r','\n' 6、支持按分区导入 7、支持内存处理数据导入greenplum,导入失败生成csv格式文件,方便排错 8、支持生成csv格式文件导入greenplum。 9、传递不同配置文件,多次执行达到并行处理(注意内存溢出) 例: 执行脚本 生成日志目录 配置文件 python3 Main_Mem.py ProcessLog1 config1.ini & python3 Main_Mem.py ProcessLog2 config2.ini & python3 Main_Mem.py ProcessLog3 config3.ini & python3 Main_Mem.py ProcessLog4 config4.ini & 10、采用python 中的copy_from方法实现导入greenplum 11、各目录用途: conf :存放配置文件 etl_dat: 存放导出数据 log :存放输出日志 py_tool 存放编写工具脚本: DBconn: 数据库连接池配置及查询返回方法 DumpCsv:导出csv文件方法 Log:日志输出方法 DataBase:判断是否存在、或分区是否有数据、是否为分区、数据导出、分区遍历、指定分区导出等方法 py_main:主程序目录: Main_Mem.py:主程序目录: 运行:python3 Main_Mem.py ProcessLog1 config.ini 12、主程序需要修改目录参数: if __name__ == '__main__': #引用编写的包 sys.path.append('/home/oracle/PyETL2.0/py_tool') import Log,DataBase,DumpCsv #输出日志路径: path = '/home/oracle/PyETL2.0/log/'+sys.argv[1] isExists = os.path.exists(path) if not isExists: os.makedirs(path) #shutil.move(path,path+) logger = Log.log(path) #读取配置文件 config = Confile('/home/oracle/PyETL2.0/conf/', sys.argv[2]) 13、后期还会更新,欢迎提供宝贵意见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值