ORACLE遷移GP實踐

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   for   

最近在做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 64bitOracle client 10.2.0.5.0GP 4.2.6.0模組的參數在圖上已經詳細標註出來了.模組的安裝標準的perl安裝方法:perl Makefile.PLmakemake testmake 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 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的實現過程

 使用sqluldr2把資料從oracle unload出來到一個named pipe上,然後通過gpload把資料載入到GP裡面.sqluldr網址:  http://www.anysql.net/tools/sqluldr_comming.htmlgpload參照文章:  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/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()
control檔案模板
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實踐

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.