oracle迁移需要注意配置文件,ORACLE迁移GP实践

最近在做oracle到greenplum的迁移实践,步骤如下:

1. 使用ora2pg实现Oracle的数据结构迁移到GP的实现过程

2. Oracle的数据迁移到GP的实现过程

1. ora2pg的使用

关系图如下:

09c76066fcb57014cb4eb66a9f3bc11b.png

需要安装DBD-oracle,DBD-pg,DBI模块,配置conf后可以把oracle的数据结构(table,view,package等)转化成PG的数据结构.也可以配置直接把oracle库的数据导入到PG里面.

环境参数:

OS RHEL6.5 64bit

Oracle client 10.2.0.5.0

GP 4.2.6.0

模块的参数在图上已经详细标注出来了.模块的安装标准的perl安装方法:

perl Makefile.PL

make

make test

make install

介绍一下配置文件:

1 ORACLE_HOME /home/oracle/client_12 ORACLE_DSN dbi:Oracle:host=192.168.11.1;sid=orcl3 ORACLE_USER manager4 ORACLE_PWD tiger5 SCHEMAtest6 TYPE TABLE VIEWPACKAGE COPY7 PG_NUMERIC_TYPE 0

8 PG_INTEGER_TYPE 1

9 DEFAULT_NUMERIC float

10 SKIP fkeys pkeys ukeys indexes checks11 NLS_LANG AMERICAN_AMERICA.UTF812 PG_DSN dbi:Pg:dbname=easyetl;host=127.0.0.1;port=5432

13 PG_USER easyetl14 PG_PWD password15 OUTPUT output.sql

1-4 配置源端Oracle的信息

5    oracle的schema取值

6    准备转化的数据类型,也包括导数据的copy命令

7-9  用来转化oracle的number(p,s)到PG的类型:

7表示是否使用PG内部的数据类型,0表示不使用,1表示使用

8表示在7设置为0时,如果8设置为1,则类型number(p)的定义变更为integer;如果8设置为0,则number(p)也转化为numeric(p)

9表示是8设置为1的时候,类型number转化为float,如果8设置为0,则9不起作用.

简单的设置,如果7,8均设置为0,那么number(p) --> numeric(p),number(p,s) --> numeric(p,s), number --> numeric

10 约束们是否需要创建

11 语言选择

12-14 配置目的端PG(GP亦可),如果这三行信息不配置,也没关系,可以生成oracle转化为PG的脚本

15 生成文件

迁移中出现的情况:

(1) 表可以完全迁移过去

(2) 视图里面如果没有起别名的话,也需要手动添加别名

(3) package需要手动修改.注:ver13版本的package生成需要把perform/decode屏蔽掉,因为这二点未做好,模块为PLSQL.pm.

当然package转化不仅仅只是这部分东西,主要的有:

a 别名需要显示写出

b 隐式转化要显示写出

c 函数的差异(GP官方有一套Oracle的函数实现,基本上够用)

d oracle里面非标准写法,如: a left join b写成 a,b where a.xx=b.xx(+)

2. Oracle的数据迁移到GP的实现过程

使用sqluldr2把数据从oracle unload出来到一个named pipe上,然后通过gpload把数据载入到GP里面.

dataload.sh

关键点有二个:

(1) sqluldr先生成数据,传到管道里面.gpload读取配置文件,从管道取数据,自己启动gpfdist,生成External table,载入GP库

(2) 当数据量少的时候,即sqluldr进程结束后,gpload进程还没完全启动.这个时候,gpload就一直等待管道里面的数据到来,hang住了.为了解决这个问题,特意在sqluldr的presql

里面添加dbms_lock.sleep(2),这样就可以保证sqluldr进程结束前,gpload进程已经启动了.或者可以直接写c来指定管道.

#!/bin/bash

if [ $#-lt 3 ];then

echo ‘Usage `basename $0` pipe tablename control‘

exit 1fi

pipename=$1tablename=$2control=$3condition=$4mknod$pipenamep/root/software/sqluldr2 user=manager/tigerd@orcl query="select * from $tablename where $condition" field=0x7c file=$pipename

charset=utf8 text=CSV safe=yes persql="begin dbms_lock.sleep(2); end;" &gpload-f $control -l gpload.logrm-rf $pipename

ora2gp.sh --生成control文件,包括管道文件名称.然后调用上述进程实现载入过程.

#!/usr/bin/env python#-*- coding:utf-8 -*-

importyaml

importsubprocess

importsys

importos

#Script starts from here

paramnum=len(sys.argv)

datadt=20140820condition="1=1"tplpath="/root/template/"pipepath="/tmp/pipe"batname="/root/script/dataload.sh"

if (paramnum == 1):

print ‘Usage:‘+ sys.argv[0]+‘tablename ‘sys.exit()

elif(paramnum == 2):

tablename=sys.argv[1]

elif(paramnum == 3):

tablename=sys.argv[1]

datadt=sys.argv[2]

elif(paramnum == 4):

tablename=sys.argv[1]

datadt=sys.argv[2]

condition=sys.argv[3]

else:

print ‘Usage:‘+ sys.argv[0]+‘tablename datadt condition. (datadt condition is optional)!‘sys.exit()

pid=os.getpid()

pipename=pipepath+str(pid)

f = open(tplpath+"gp_template_load.ctl")

dataMap =yaml.load(f)

f.close()

dataMap[‘GPLOAD‘][‘INPUT‘][0][‘SOURCE‘][‘FILE‘][0]=pipename

dataMap[‘GPLOAD‘][‘OUTPUT‘][0][‘TABLE‘]=tablename

dataMap[‘GPLOAD‘][‘INPUT‘][6][‘ERROR_TABLE‘]=tablename+‘_err‘filename=tplpath+tablename+‘.ctl‘f = open(filename,‘w‘)

yaml.dump(dataMap,f)

f.close()

handle=subprocess.Popen([batname,pipename,tablename,filename,condition])

handle.communicate()

control文件模板

VERSION: 1.0.0.1

DATABASE: dw

USER: manager

HOST: gp

PORT: 5432

GPLOAD:

INPUT:

- SOURCE:

LOCAL_HOSTNAME:

- gp

FILE:

- /tmp/mypipe

PORT_RANGE: [8001,9000]

- FORMAT: csv

- DELIMITER: ‘,‘

- QUOTE: ‘"‘

- HEADER: true

- ERROR_LIMIT: 10000

- ERROR_TABLE: tablename_err

OUTPUT:

- TABLE: tablename

- MODE: INSERT

PRELOAD:

- TRUNCATE: true

原文:http://www.cnblogs.com/gobird/p/3967373.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值