近期涉及一個BI項目初期階段,構建數據倉庫時遇到不少問題,主要問題,來源已下幾個方面:
1 不同業務數據放在不同類型的數據庫(oracle和mysql的,excel等等)。
2 源端數據庫種類不同,表結構創建語句與設計不一,導致不好同步問題。
3 源端數據庫只提供只讀狀態,無法對源端做起停和寫操作。
4 源數據庫中沒有定義和更新時間字段無法做到增量同步。
於是糾結與選什么類型的同步方案。
其實方案很多,比如oracle中sqldevelop中的sqlload,也嘗試使用mysql的mysqldump,python,OGG,可以說只有實踐才知道各有缺點。詳細請看https://www.cnblogs.com/andy6/p/6959028.html。就知道 為什么選擇kettle當做選擇方案?
下面具體介紹如何使用kettle實現oracle到mysql增量同步,也是做一個總結。
1 選擇服務(cpu,磁盤空間,內存盡量好點,安裝 Ubuntu,下載安裝kettle軟件,安裝mysql。kettle安裝和mysql安裝很簡單, 注意的是安裝完kettle需要的lib打oracle和mysql的jar包。否則無法遠程連接數據庫。配置主機網卡,保證網絡通暢。
2 打開kettle,新建事務,增加控件文本文件輸入,復制記錄到結果:文件輸入打開其實就是你需要同步的文本文件,文本文件中的內容就是你需要同步的表名稱。這里需要把表名稱賦值給一個字段值。
。
3 獲取到結果后,我們需求把結果賦值給一個變量。做好分開事務編寫。並定義變量名稱。適用於整個循環。
4 新建事務,創建各個數據庫鏈接,創建表輸入和表輸出。注意表輸入和表輸出變量的運用和提交次數。
(我這里是因為中間數據倉庫用的mysql,因為每張表幾乎沒有時間字段,如果有編輯時間字段,建議新增變量,以時間作為增量同步的時間戳,所以在oracle端為每張表創建了增量物化視圖。每張表增量同步的只同步生產業務表的不等於自身增量物化視圖的數據,以表的偽列rowid作為增量的唯一標示和判斷是否是增量的條件。每張表同步完后,會定制任務重新立即刷新增量物化視圖,這樣循環,就會做到增量同步的效果,又不會有數據缺損,之前也做過全量數據同步,時間是增量同步的幾十倍,可見數據量大了,只有利用增量同步效果才是最佳。)
1 創建數據庫鏈接
2 創建表輸入輸出。
4 在oracle端創建增量物化視圖,這里需要先創建物化視圖日志,在創建增量物化視圖,mysql端類似oracle的表結構。mysql
端創建相同的表結構時會遇到很多問題。(1 同步數據產生亂碼問題, mysql數據庫鏈接出增加utf8
2 批量創建表語句這里使用了網上給的fnc_table_to_mysql函數,批量生產mysql端的建表語句,但是結構差強人意,需要自己調整才能在mysql端創建,問題有oraclenumber在mysql端往往不能定義int,必須是bigint 長度問題。varchar問題等,遇到具體問題,需要查看kettle的報錯日志解決。)
5 數據庫鏈接建好之后,在mysql端創建相同表結構后,接下來常見job.我這里job都是運用之前創建好的事務,最后一個是刷新物化增量物化視圖用的, 意思就是向mysql每次同步完增量數據后,繼續刷新oracle增量物化視圖,這樣才不會產生時間差數據未同步問題。
6 新建job,制定自動化任務。把第一個事務和后面創建的job進行組合成一個自動化流程,這里注意無法一個jOB實現所有功能,因為有個變量循環問題。可以定義每10分中刷新一次,或者每天刷新一次。這里看具體需求。
7 mysql到mysql的數據同步。
建議federated引擎表。可以遠程實時訪問數據。這里具體操作不做陳述。類似與oracle dblink,但是有很大的不同。
8 這樣數據倉庫搭建完畢,既能實時訪問遠程只讀mysql對其性能無影響,又能訪問oracle,並在自己的數據庫構建數據倉庫模型。