ORACLE迁移GP实践

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

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

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

1. ora2pg的使用

地址: https://github.com/darold/ora2p

关系图如下:

需要安装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_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 float
10 SKIP    fkeys pkeys ukeys indexes checks
11 NLS_LANG    AMERICAN_AMERICA.UTF8
12 PG_DSN        dbi:Pg:dbname=easyetl;host=127.0.0.1;port=5432
13 PG_USER    easyetl
14 PG_PWD    password
15 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里面.

sqluldr网址:  http://www.anysql.net/tools/sqluldr_comming.html

gpload参照文章:  http://www.itpub.net/thread-1423310-1-1.html

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 1
fi

pipename=$1
tablename=$2
control=$3
condition=$4

mknod $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 yaml
import subprocess
import sys
import os

# Script starts from here
paramnum=len(sys.argv)
datadt=20140820
condition="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
时间: 2024-10-11 11:31:12

ORACLE迁移GP实践的相关文章

从Oracle迁移到MySQL的各种坑及自救方案

当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪些问题呢? 在以前的工作中,我迁移过Oracle到Informix.Oracle和SQLServer.Oracle到MySQL. 在目前的公司又因为去O的关系,做了大量的迁移工作,栽了不少坑,所以和大家交流一下在迁移的过程中的一些实践. 分享大纲: 去O前的准备与考虑 确定目标数据库 表和数据对象的

vmware P2V迁移同步实践

                         作者 :杨 坚 第一部分:P2V迁移 P2V迁移需要使用VMware vCenter Converter Standalone 5.0 ,该软件提供了一种易于使用的解决方案,可以从物理机(运行 Windows 和 Linux).其他虚拟机格式及第三方映像格式自动创建 VMware 虚拟机.通过简单易用的向导驱动界面和集中管理控制台,Converter Standalone 无需任何中断或停机便可快速而可靠地转换多台本地物理机和远程物理机.通过在数

java项目数据库从oracle迁移到mysql 中 java部分的一些修改

java项目数据库从oracle迁移到mysql: mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用:http://blog.csdn.net/afgasdg/article/details/6941712. pom.xml文件中dependency修改:http://mvnrepository.com/artifact/mysql/mysql-connector-java/6.0.6. =======================

oracle迁移postgres之-Ora2Pg

描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成SQL脚本,您可以加载到PostgreSQL数据库.Ora2Pg从Oracle数据库逆向工程可以使用巨大的企业数据库迁移或者复制一些Oracle数据成一个PostgreSQL数据库.它很容易使用,不需要任何Oracle数据库知识比提供所需的参数连接Oracle数据库. 安装 首先要感谢Gilles D

Oracle 10g数据仓库实践pdf

下载地址:网盘下载 本书主要讲述Oracle 10g数据仓库实践:数据仓库是近年来兴起的一种新的数据库应用,在各大数据库厂商纷纷宣布产品支持数据库,并提出一整套用以建立和使用数据仓库产品时,业界掀起落架了数据库热,感兴趣的朋友可以过来看看

适用MySQL Migration Toolkit 1.0 将oracle迁移到mysql中遇到的问题

这里主要说一下我在适用中碰到的问题,主要过程参考 http://www.cnblogs.com/duwenlei/p/3520759.html. 首先启动MySQLMigrationTool.exe 提示“initialized java loader”错误,如下图 后来发现是因为我的jdk是64位,而工具需要32位,再装个32位jdk,我装的是1.7,如果不想改环境变量启动参考 http://javabyraj.blogspot.com/2013/09/solution-for-initial

oracle迁移到mysql分库分表方案之——ogg(goldengate)

之前文章主要介绍了oracle 迁移到mysql,主要是原表原结构迁移,但是实际运维中会发现,到mysql以后需要分库和分表的拆分操作,这个时候,用ogg来做,也是很强大好用的.主要结合ogg的2个参数 参数1:filterUse a FILTER clause to select rows based on a numeric value by using basic operators or one or more Oracle GoldenGate column-conversion fu

ORACLE 迁移到 PG 之 ora2pg

1       ORACLE 迁移到 PG 1.1   使用ora2pg 工具 1.1.1     ora2pg简介 Ora2Pg是一个免费的工具,用于将Oracle数据库迁移到PostgreSQL兼容的模式.它连接您的Oracle数据库,自动扫描并提取它的结构或数据,然后生成可以装载到PostgreSQL数据库的SQL脚本.Ora2Pg可以从逆向工程Oracle数据库到大型企业数据库迁移,或者简单地将一些Oracle数据复制到PostgreSQL数据库中.它非常容易使用,并且不需要任何Orac

oracle迁移至ASM磁盘

1.登陆+ASM实例查看ASM磁盘是否正常 [[email protected] ~]$ export ORACLE_SID=+ASM[[email protected] ~]$ sqlplus  / as sysdba SQL> select name,state from  v$asm_diskgroup;