ORACLE和MYSQL是目前市面上使用最廣泛的兩款關系型數據庫軟件,因為兩款數據庫在存儲過程,函數,觸發器和sql等語法上存在較大差異,所以遷移一套完整的ORACLE到MYSQL,需要處理好不同數據類型的差異和各種編碼的差異。此文章主要分享了遷移數據上的一些方法和數據類型上的一些區別對比和選擇。
源數據庫(ORACLE數據庫):
ip:192.169.100.107單機
目標數據庫(mysql數據庫),目標端需要安裝ORACLE客戶端,或者直接復制ORACLE的lib庫到目標庫。
ip: 192.169.100.247單機
mysql中的date類型為日期類型(YYYY-MM-DD) 范圍:1000-01-01/9999-12-31 ,不包含時間值,所以可根據情況判斷使用date類型還是datetime類型替換oracle的date類型(取決于源端是否包含具體時間),推薦使用datetime 替換date類型。
如果oracle源端使用的日期格式默認值時(default sysdate),MYSQL端只能使用使用timestamp DEFAULT CURRENT_TIMESTAMP,因為msql 只有timestamp 才能使用默認時間為系統時間。
mysql 端默認字符集推薦使用:utf8mb4,具體根據情況而定。
對于生產環境的數據庫,動輒上TB甚至PB級的數據量和數千張表,對于這樣的數據量和表的數量,我們就需要考慮比較快捷的方式去遷移數據。
數據的導出有很多有方式,比如oralce可以使用:PL/SQL、toad、NavicatforORACLE或者其他工具導出數據,但是這些工具往往會因為數據量的問題而受到各種局限,對于少量的數據時,使用這些工具是比較合適的,但是當數據量達到海量時,不僅導出速度無法保證,而且無法直接落地到服務器,從而大大的限制了我們對數據的處理。
因此我推薦一個小的工具包sqlload2(或者也可以直接使用ketle將數據直接導出),該工具可快速的將源數據導出成為txt/csv(推薦csv格式,csv格式可以更好的處理分隔符和封閉符的問題),因為在正式環境中,導入的數據的正確性尤為重要,生產數據又可能出現各種特殊的符號,僅僅使用傳統的逗號作為分隔符已無法完全保證數據在導出或者導入時能正確的分隔,所以需要同時使用分隔符和封閉符,這樣才能保證數據的正確性,經過多次驗證建議使用特使的16進制字符:0x07作為分隔符,并且該工具支持并行導出、以及多種分隔符、封閉符、自動拆分文件和通配符等等豐富的功能。
(以下模擬一個源庫包含大量數據,并且業務無法長時間停止,需要增量更新)
ORACLE文件導出工具sqlludr2
鏈接:https://pan.baidu.com/s/1JVo1BETvTJXPQQHburfVOg
提取碼:fxwf
ETL工具ketle
kettle可自行到官網下載:https://www.hitachivantara.com/en-us/products/data-management-analytics.html?source=pentaho-redirect(kettle為開源軟件,后續也有推出收費版本)
安裝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) ) |
配置好oracle的環境變量,指定lib 庫
export ORACLE_BASE=/u01/app/oracle |
上傳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.binhelp=yes)
query:query參數如果整表導出,可以直接寫表名,如果需要查詢運算和where條件,query=“sql文本”,也可以把復雜sql寫入到文本中由query調用。 |
示例:(導出db庫里面的test表里面的前10條數據,并且分4個并行線程,導出的文件每20M截斷)
./sqluldr2_linux64_10204.bin USER=test/test@10.10.10.10/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 |
后續可寫入腳本批量導出。
使用load在目標數據庫批量入庫:
load data infile /tmp/test.csv into table db.test character set utf8 fields terminated by 0x07 enclosed by "; |
ETL是數據抽取(Extract)、清洗(Cleaning)、轉換(Transform)、裝載(Load)的過程。是構建數據倉庫的重要一環,用戶從數據源抽取出所需的數據,經過數據清洗,最終按照預先定義好的數據倉庫模型,將數據加載到數據倉庫中去。(典型的ETL工具:商業軟件:Informatica、IBM Datastage、Oracle ODI、Microsoft SSIS…開源軟件:Kettle、Talend、CloverETL、Kettle,Octopus …)
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺里,然后以一種指定的格式流出。
Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。
新建轉換,配置增量更新:
在核心對象中分別選擇兩個表輸入,作為舊數據源和新數據源,分別配置數據庫連接;
字段選擇用來規范來源數據的格式和類型;
合并記錄用于對比新舊數據源的差異,并將數據對比的結果放到標志字段中;
Switch/Case用來決定差異的數據是應該更新還是修改還是刪除。
標志字段值說明:
1) windows下調用kettle程序:
cd C:softkettledata-integration kitchen /file C:softjob名稱 /level Basic /logfile E: iming.log @pause |
2) 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的的遷移和增量更新配置完成。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130097.html
摘要:為了避免這種情況,可以針對表短期內被兩個以上的語句所加載執行一個大的數據壓縮。通常,對一張大表執行數據壓縮會花費大量的時間幾分鐘到幾小時不等。 本文介紹了如何將數據從現有的RDBMS遷移到Trafodion數據庫。從其它的RDBMS或外部數據源向Trafodion集群中導入大量的重要數據,可以通過下面兩步完美實現: 在Trafodion集群中,將數據從源頭導入Hive表。使用下列方...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20