需求描述
對于數據分析人員來說,工作的基礎是數據,沒有數據分析就無從談起,即巧婦難為無米之炊。
#數據庫# #數據遷移# #Oracle#
然而,數據分析往往在實驗環境或者準生產環境中開展,而數據分布在生產環境,因此需要將生產環境的部分數據導入到準生產環境中。因為網絡隔離和權限管理的原因,無法直接在生產庫和準生產庫之間應用數據遷移工具。目前的辦法是:將生產庫中的數據以數據文件形式導出,然后通過安全手段傳送到準生產環境,然后在準生產環境中應用Kettle等數據遷移工具實現數據的導入。
下面的實驗路徑如下:生產數據文件-->Mysql臨時庫-->準生產Oracle庫。

Logo
將數據導入到MySQL臨時庫中(基于Navicat)
使用Navicat的導入向導可以便捷地將文本文件中的數據導入到Mysql庫中,從而為下一步通過Kettle遷移至Oracle做準備,同時可以做一些臨時性的分析。具體導入步驟如下:
1.選擇數據庫下面的【表】,選擇【導入向導】

導入向導
2.選擇要導入的數據文件格式,常見的txt、csv、excel等。

選擇文件格式
3.選擇分隔符。如果是csv文件的話保持默認就可以了,如果是用|等分割的txt文件,則需要進行調整。

選擇分隔符
4.選擇目標表。選擇要把數據導入的數據表,可以是不存在的表,也可以是已存在的表。不存在的表需要新建,已存在的則需要去掉新建表下面的勾選。

選擇數據表
5.調整表結構。在這一步,可以看到從文本文件中解析出來的表結構,即字段名稱、字段類型等,同時可以根據需要對字段類型、長度和主鍵進行設定。我們這里先不做任何調整,看看后面什么結果。

調整表結構
6.附加選項。設定文本文件的起始和結束行數,設定首行是否為列名,設定日期和數值型數據的格式等。

附加選項
7.選擇導入模式。選擇數據導入模式,有追加、更新、刪除、復制等幾種模式,我們選擇“復制”,即新建表并將數據導入其中。

8.開始導入(失敗)。在第7步的基礎上執行下一步,然后點擊開始,執行導入操作。很遺憾,導入失敗,報“row size too large.XXXXX”的錯誤(見下圖)。
這個錯誤是因為,在前面的設置中,我們將每個字段都設置為Varchar類型且長度為255,且寬表字段數量N過多(N>100),255*N超出了Mysql的限制(65535)。因此,解決方法是調整字段類型及長度,使之低于Mysql的限制。

開始導入

導入報錯
9.按需調整字段類型及長度,這里主要調整的是長度,由255調減至32,夠用了。

調整字段類型長度
10.再次導入(成功)。調整完字段類型及長度后,再次執行導入,顯示導入成功,驗證發現數據確已入庫。

再次導入

數據驗證
Mysql數據向Oracle遷移(基于Kettle)
基于Navicat完成了數據文件的導入之后,下一步就是利用Kettle實現數據在Mysql數據庫和Oracle數據庫上的遷移,具體操作過程如下:
1.新建轉換。打開Kettle,新建轉換,為數據遷移做準備。

新建轉換
2.選擇表輸入并將表輸入組件拖入主功能區。

選擇表輸入
3.編輯表輸入節點并選擇源數據庫類型,這里選擇Mysql。

編輯表輸入

選擇源數據庫
4.完成數據庫連接的配置。包括主機名、端口、數據庫名稱、數據表、用戶名、密碼等,通過測試可驗證數據庫是否已正確連接。

配置數據庫連接

5.完成表輸出配置。完成表輸入配置后,選擇表輸出并拖至主功能區,按照表輸入配置的方式完成表輸出的配置,只是這里要配置Oracle的數據庫連接,包括主機名、數據庫、數據表、用戶名、密碼、端口等。同樣的,可以通過測試驗證是否已連接成功。

表輸出配置

表輸出測試
6.建立表輸入與表輸出的連接,即在主功能區中,點擊表輸入的箭頭并拖至表輸出的箭頭處。

建立輸入節點和輸出節點的連接
7.啟動轉換(失敗)。點擊主功能區左上角的三角形按鈕,啟動轉換。
很遺憾,轉換失敗,表輸出節點上出現了紅色標識。通過查看日志發現,這是因為在表輸出中配置的數據表不存在,導致數據無法插入。所以,解決的辦法就是新建數據表。如果通過create新建就太吃力了,還好可以通過配置解決,詳見第8步。

啟動轉換

啟動轉換

轉換失敗
8.建立輸出數據表。在Oracle數據連接配置界面中,選擇【數據庫字段】,然后點擊【獲取字段】,選擇Mysql數據庫中的輸入表,即可自動生成目標表的建表語句,執行建表語句即可完成目標表的構建。

獲取字段

選擇mysql表
9.啟動轉換(成功)。再次啟動轉換,沒有報錯,意味著轉換成功。

轉換成功
中文亂碼,如何解決?
完成Mysql向Oracle的數據遷移后,通過PL/SQL查詢發現數據表中的中文亂碼,顯然這是因為兩邊數據編碼不一致造成的,解決方法就是配置編碼使兩邊保持一致。
1.查看Oracle的數據編碼,可以看出是GBK,下一步就是把Mysql的編碼調整成GBK。

查看Oralce編碼
2.配置Mysql編碼。在表輸入的配置環節,在【高級】中增加“set names gbk;”,在【選項】中增加“characterEncoding:gbk”。

set names gbk

characterencoding:gbk
3.配置完成后,再次執行轉換任務,驗證發現中文正常顯示。

數據驗證
總結
本文通過一個具體的業務場景逐步介紹了數據的遷移過程,總結如下:
- Navicat提供了較好的數據導入工具,可以實現數據文件的快速入庫。
- Kettle可以快捷地實現數據在異構數據庫中的遷移,配置項豐富,操作簡單。
- 使用Navicat進行數據導入時,要注意設置合理的表結構,不能超過Mysql限制,否則會導入失敗。
- 在使用Kettle進行數據在Mysql和Oracle中的遷移時,一是要確保目標Oracle表的存在,如不存在則需要配置或新建,二是要注意編碼一致,避免出現總問亂碼。
我是會說科技,關注我,一起聊聊數據、科技、IT、安全、金融那些瑣事。####