首页 > 代码库 > ORACLE迁移GP实践
ORACLE迁移GP实践
1 ORACLE_HOME /home/oracle/client_1 2 ORACLE_DSN dbi:Oracle:host=192.168.11.1;sid=orcl 3 ORACLE_USER manager 4 ORACLE_PWD tiger 5 SCHEMA test 6 TYPE TABLE VIEW PACKAGE COPY 7 PG_NUMERIC_TYPE 0 8 PG_INTEGER_TYPE 1 9 DEFAULT_NUMERIC float10 SKIP fkeys pkeys ukeys indexes checks11 NLS_LANG AMERICAN_AMERICA.UTF812 PG_DSN dbi:Pg:dbname=easyetl;host=127.0.0.1;port=543213 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的实现过程
#!/bin/bashif [ $# -lt 3 ];then echo ‘Usage `basename $0` pipe tablename control‘ exit 1fipipename=$1tablename=$2control=$3condition=$4mknod $pipename p/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.log rm -rf $pipename
ora2gp.sh --生成control文件,包括管道文件名称.然后调用上述进程实现载入过程.
#!/usr/bin/env python#-*- coding:utf-8 -*-import yamlimport subprocessimport sysimport os# 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]=pipenamedataMap[‘GPLOAD‘][‘OUTPUT‘][0][‘TABLE‘]=tablenamedataMap[‘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()
VERSION: 1.0.0.1DATABASE: dwUSER: managerHOST: gpPORT: 5432GPLOAD: 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
ORACLE迁移GP实践