1. 程式人生 > 實用技巧 >ORACLE遷移MYSQL之load和ETL

ORACLE遷移MYSQL之load和ETL

前言

ORACLE和MYSQL是目前市面上使用最廣泛的兩款關係型資料庫軟體,因為兩款資料庫在儲存過程,函式,觸發器和sql等語法上存在較大差異,所以遷移一套完整的ORACLE 到MYSQL,需要處理好不同資料型別的差異和各種編碼的差異。此文章主要分享了遷移資料上的一些方法和資料型別上的一些區別對比和選擇。

環境說明:

源資料庫(ORACLE 資料庫):
ip:192.169.100.107 單機

目標資料庫(mysql資料庫),目標端需要安裝ORACLE客戶端,或者直接複製ORACLE的lib庫到目標庫。
ip : 192.169.100.247 單機

遷移前的資料型別對比:

注意:

   1
.mysql中的date型別為日期型別(YYYY-MM-DD) 範圍:1000-01-01/9999-12-31 ,不包含時間值,所以可根據情況判斷使用date型別還是datetime型別替換oracle的date型別(取決於源端是否包含具體時間),推薦使用datetime 替換date型別。 2.如果oracle源端使用的日期格式預設值時(default sysdate),MYSQL端只能使用使用timestamp DEFAULT CURRENT_TIMESTAMP,因為msql 只有timestamp 才能使用預設時間為系統時間。 3.mysql 端預設字符集推薦使用:utf8mb4。

一、load的方式遷移資料。

對於生產環境的資料庫,動輒上TB 甚至PB級的資料量和數千張表,對於這樣的資料量和表的數量,我們就需要考慮比較快捷的方式去遷移資料。

資料的匯出有很多有方式,比如oralce可以使用:PL/SQL、toad、Navicat for ORACLE或者其他工具匯出資料,但是這些工具往往會因為資料量的問題而受到各種侷限,對於少量的資料時,使用這些工具是比較合適的,但是當資料量達到海量時,不僅匯出速度無法保證,而且無法直接落地到伺服器,從而大大的限制了我們對資料的處理。

因此我推薦一個小的工具包sqlload2(或者也可以直接使用ketle將資料直接匯出),該工具可快速的將源資料匯出成為txt/csv(推薦csv格式,csv格式可以更好的處理分隔符和封閉符的問題),因為在正式環境中,匯入的資料的正確性尤為重要,生產資料又可能出現各種特殊的符號,僅僅使用傳統的逗號作為分隔符已無法完全保證資料在匯出或者匯入時能正確的分隔,所以需要同時使用分隔符和封閉符,這樣才能保證資料的正確性,經過多次驗證建議使用特使的16進位制字元:0x07 作為分隔符,並且該工具支援並行匯出、以及多種分隔符、封閉符、自動拆分檔案和萬用字元等等豐富的功能。

  1. 遷移流程(以下模擬一個源庫包含大量資料,並且業務無法長時間停止,需要增量更新)
  2. 需要用到的工具列表:
1.ORACLE檔案匯出工具sqlludr2 

連結:https://pan.baidu.com/s/1JVo1BETvTJXPQQHburfVOg
提取碼:fxwf
複製這段內容後開啟百度網盤手機App,操作更方便哦

2.ETL工具ketle

kettle可自行到官網下載:https://www.hitachivantara.com/en-us/products/data-management-analytics.html?source=pentaho-redirect(kettle為開源軟體,後續也有推出收費版本)

3.使用sqlldr2匯出資料並使用load載入資料:

1.安裝ORACLE客戶端,並配置好環境變數:

安裝之後建立network/admin/資料夾,然後建立檔案tnsnames.ora(用於連線源端ORACLE資料庫)
zkl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = IP地址)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl )
(SERVER=DEDICATED )
    (INSTANCE_NAME = testdb1)
)

2.配置好oracle的環境變數,指定lib 庫

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORALCE_HOME/jlib:ORACLE_HOME/rdbms/jlib

3.上傳sqlludr2工具並使用如下命令匯出數檔案

./sqluldr2_linux64_10204.bin USER=使用者名稱/密碼@IP地址:埠號/資料庫名稱 query="查詢語句" table=表名稱 head=no charset=utf8 field=0x07 file=/sqlfile^CJ_WXMACINFO.csv log=/sqlfile/log.txt file=/sqlfile/data/WJ_WXMACINFO%B.CSV size=20MB safe=yes

常用引數說明:(更多引數可以參考:./sqluldr2_linux64_10204.bin help=yes)

query:query引數如果整表匯出,可以直接寫表名,如果需要查詢運算和where條件,query=“sql文字”,也可以把複雜sql寫入到文字中由query呼叫。
head:是否匯出表頭
charset:指定字符集
field:預設是逗號分隔符,通過field引數指定分隔符
file:匯出的檔名
log:日誌檔案
size:對於大表可以輸出到多個檔案中,指定行數分割或者按照檔案大小分割rows=500000

示例:(匯出db庫裡面的test表裡面的前10條資料,並且分4個並行執行緒,匯出的檔案每20M截斷)
./sqluldr2_linux64_10204.bin USER=test/[email protected]/db query="select /*+ parallel(4) */ *from test where rownum<=100000" table=test head=no charset=utf8 field=0x07 file=/tmp/test.csv log=/tmp/log.txt file=/tmp/test%B.CSV size=20MB safe=yes

後續可寫入指令碼批量匯出。

4.使用load在目標資料庫批量入庫:
load data infile '/tmp/test.csv' into table db.test character set utf8 fields terminated by '0x07' enclosed by '"';

二、kettle做增量更新。

1.kettle簡介

ETL是資料抽取(Extract)、清洗(Cleaning)、轉換(Transform)、裝載(Load)的過程。是構建資料倉庫的重要一環,使用者從資料來源抽取出所需的資料,經過資料清洗,最終按照預先定義好的資料倉庫模型,將資料載入到資料倉庫中去。(典型的ETL工具:商業軟體:Informatica、IBMDatastage、OracleODI、MicrosoftSSIS…開源軟體:Kettle、Talend、CloverETL、Kettle,Octopus…)

Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上執行,綠色無需安裝,資料抽取高效穩定。Kettle中文名稱叫水壺,該專案的主程式設計師MATT希望把各種資料放到一個壺裡,然後以一種指定的格式流出。

Kettle這個ETL工具集,它允許你管理來自不同資料庫的資料,通過提供一個圖形化的使用者環境來描述你想做什麼,而不是你想怎麼做。

Kettle中有兩種指令碼檔案,transformation和job,transformation完成針對資料的基礎轉換,job則完成整個工作流的控制。

2.下載和安裝

1. kettle是一款開源軟體,下載過後無需安裝,解壓到任意目錄即可。由於Kettle是採用java編寫,因此需要在本地有JVM的執行環境;
2.找到解壓目錄下的data-integration,然後找到Spoon.bat (linux下找到spoon.sh),右鍵編輯設定java環境變數:
a.右鍵編輯Spoon.bat

b.配置java環境變數

c.配置java執行時允許的虛擬記憶體大小(如果業務量較大,建議調整)

d.右鍵以管理員方式執行Spoon.bat,啟動kettle程式:

3.配置資源庫

資源庫是指用來儲存kettle的配置資訊的原資料庫,我們可以將我們所有的kettle轉換和job,以及資料庫連線資訊直接儲存在資料庫中,這樣就不用每次新建轉換時都去配置資料庫連線。(該配置對全域性生效)

a.連線資源庫

b.彈出密碼框,預設密碼是admin,選擇+ 號新增一個資源庫,然後選擇第二個資料庫作為資源庫(也可以根據需求選擇其他作為資源庫),然後再點選新建,並設定好資源庫名稱。

c.然後在彈出的對話方塊中配置好資料庫的連線資訊(連線前需要先將資料庫的驅動放到kettle-6.1.0.1-196\data-integration\lib 目錄下):

4.新建轉換,配置增量更新:

a.在核心物件中分別選擇兩個表輸入,作為舊資料來源和新資料來源,分別配置資料庫連線;

b.欄位選擇用來規範來源資料的格式和型別;

c.合併記錄用於對比新舊資料來源的差異,並將資料對比的結果放到標誌欄位中;

d.Switch/Case用來決定差異的資料是應該更新還是修改還是刪除。

合併記錄:

Switch/Case 判斷:

標誌欄位的取值包含如下4種情況:

5.新建ob,並配置定時任務,即可完成自動增量更新:

a.新建job:

b.將通用物件中的start 、轉換和成功三個空間拖入到job中,並連線

c.選擇好建立的轉換,然後儲存:

d.配置定時任務:(也可以通過windows或者linux指令碼進行呼叫)

windows下呼叫kettle程式:
cd C:\soft\kettle\data-integration kitchen /file C:\soft\job名稱 /level Basic /logfile E:\timing.log @pause

linux下呼叫kettle程式:
./kitchen.sh -rep 192.168.0.13.PDI_Repository -user username -pass password -dir /目錄名稱 -job job名稱 -level=basic>>/log/job.log

至此使用load+kettle的的遷移和增量更新配置完成。