一、背景
上一篇文章(單表數據遷移)用kettle實現了一張表的數據遷移。但實際情況中,數據庫會有幾百,幾千張表,而kettle的表輸入和表輸出只能選擇一張表,我們不可能一個個地填寫表名。這時候,我們要考慮 通過循環實現多表的數據遷移。
二、前期准備
與單表數據遷移類似
准備好Oracle和MySQL的庫,Oracle到Oracle也可以,轉移,只是必須提前在kettle文件夾的lib目錄下放入各個數據庫的依賴。
電腦可以連接Oracle和MySQL。
下載好kettle,並把Oracle和MySQL的驅動包放在kettle文件夾的lib目錄下。
如果第一次使用kettle,建議先看上一篇文章 《單表數據遷移》,上一篇很詳細地介紹了新建轉換、新建節點、新建數據庫連接等問題。
三、批量數據遷移
1.讀取需要遷移的表(轉換)
方法一:從數據庫讀取所有表
// mysql查詢該數據庫的所有表 select table_name from information_schema.tables where table_schema=當前數據庫名 and table_type='base table';
點擊文件——新建——轉換,在左側的 核心對象 標簽下選擇 輸入 下的 表輸入,雙擊添加到右側的轉換面板,再選擇 作業 下的 復制記錄到結果 ,雙擊添加到右側的轉換面板。
接下來配置表輸入,雙擊 表輸入 的圖標,橙色區域為必填項。如果是兩個庫表結構一致,導入所有表,可用語句
select table_name from user_tables //
且千萬不要在語句后面加分號,會報錯。如果只有部分表結構一致且要導入,可用語句來過濾掉源數據庫沒有的表,否則就會報錯。
select table_name from user_tables where table_name!='T_XZQH' and table_name !='BASE_BUSINESS_INFO'
新建mysql的數據庫連接,數據庫連接的配置參考上一篇文章(注意是mysql的連接),新建好連接,記得測試一下是否連接成功。
SQL語句填寫的就是mysql查詢所有表的語句,table_schema 為你的mysql數據庫名。
配置好點擊下方的預覽,看一下查出來的表名對不對。
現在已經把mysql中的表名都查出來,最后會根據這些表名查詢oracle的數據庫。
復制記錄到結果 不需要配置。
保存這個轉為“tables in mysql.ktr”。
方法二:從Excel讀取所需的表
還有一種方法,是把需要遷移數據的表名寫到Excel中,從Excel中讀取表名。
如果mysql庫和oralce庫的表不一一對應,比如mysql中有的表但oracle中沒有,那用第一種方法查出的表名,用於轉換會報錯(因為oracle找不到表)。這時候,篩選出兩個庫都有的表並寫到Excel中,從Excel讀取表更合適。
Excel寫成下面的格式,讀取時會把第一行的內容作為查詢出來的字段名。
點擊文件——新建——轉換,在左側的 核心對象 標簽下選擇 輸入 下的 Excel輸入,雙擊添加到右側的轉換面板,再選擇 作業 下的 復制記錄到結果 ,雙擊添加到右側的轉換面板。
接下來配置Excel輸入,雙擊 Excel輸入 的圖標,按以下步驟配置。
首先是 文件 標簽。 在文件或目錄 那一行點擊 瀏覽,選擇上面整理好的Excel表格。再點擊 增加,選中的文件 一欄就會出現路徑。
接下來是 工作表 標簽。點擊下方的 獲取工作表名稱,雙擊選擇記錄表名的sheet1,點擊確定。sheet1就出現在 要讀取的工作表列表 中。
最后是 字段 標簽。點擊下面的 獲取來自頭部數據的字段,開始前,允許清空列的列表。把Excel中的第一行讀取為字段名。
最后點擊最下方的預覽記錄,查看是否正確讀取了表名。
把這個轉換保存為“aa.ktr”。
2.把這些表名設置成變量(轉換)
新建轉換,在左側的 核心對象 標簽下選擇 作業 下的 從結果獲取記錄,雙擊添加到右側的轉換面板,再選擇 作業 下的 設置變量 ,雙擊添加到右側的轉換面板。
接下來配置這兩個節點。
雙擊 從結果獲取記錄,填寫字段名稱和類型(獲取表名時,兩種方法的字段都寫成了table_name,就是為了這里讀取字段時可以統一)。
雙擊 設置變量,字段名稱仍然是table_name,為取到的字段取一個變量名,比如“vtable”,變量活動類型如下。
把這個轉換保存成set table name.ktr。
3.根據變量設置表輸入和表輸出(轉換)
這個步驟和單表遷移的步驟相同,新建一個轉換,添加表輸入和表輸出節點。
表輸入 的配置仍然是新建oracle的數據庫連接,填寫sql查詢語句。與單表遷移不同,查詢語句from后不填表名,填寫上一步設置的變量名 vtable,這個變量保存了所有的表名。因為還沒有把這些步驟關聯起來,所以現在不能預覽數據。
表輸出 的配置仍然是新建mysql的數據庫連接,但目標表需要填寫與表輸入一致的變量名 vtable,提交記錄數量是指每插入1000條記錄commit一次。如果定時循環同步數據,可以勾選裁剪表或者忽略插入錯誤兩種方式,第一種方式裁剪表即 truncate table ,即更新時先刪除所有表中所有數據,然后再把源數據庫數據重新提交,可以實現真正意義上的同步,只是最好在夜里定時更新,以免項目數據出問題。第二種,忽略插入錯誤,因為這整個流程是根據主鍵id同步的,如果有主鍵重復的就會報錯,無法插入。所以忽略這個錯誤,只插入新增的數據,之前那些已有的數據,因為主鍵重復會報錯停止,忽略插入錯誤后,可以繼續執行。指定數據庫字段這個選項需要注意,如果源數據庫表與目標數據庫表數據結構,字段等完全一致,可以不用勾選。如果源數據庫表比目標數據庫表新增了字段,那么執行會停止報錯(源數據庫表字段比目標數據庫表字段多會報錯,反過來則沒事)。勾選此項后,就會忽略源數據庫多余字段,只把源數據庫與目標數據庫相同的表字段數據更新。
。
注意:kettle中變量的寫法是 ${變量名}。
把這個轉換保存成insert data into mysql.ktr。
4.把以上的三個轉換連接(作業)
到此為止,我們新建了是三個轉換,分別是:
從Excel表讀取表名並復制到結果(aa.ktr)
或者直接查詢表名,復制到結果
從結果獲取記錄並設置成變量(set table name.ktr)
根據變量進行表輸入和表輸出(insert data into mysql.ktr)
接下來把這些轉換連接成作業(JOB)。
第一個作業
首先把第2、3個轉換結合起來。點擊 文件——新建——作業,在左側的 核心對象 標簽下選擇 通用,雙擊添加一個 start ,兩個 轉換 和一個 成功 到右側的作業面板,這些作業項都可以改名字。把這個作業保存為insert into mysql.kjb。
點擊兩個轉換可以修改作業項名稱,點擊瀏覽選擇對應的轉換。第一個轉換對應 set table name.ktr,第二個轉換對應 insert data into mysql.ktr。
第二個作業
接下來把第一個轉換與第一個作業結合。點擊 文件——新建——作業,在左側的 核心對象 標簽下選擇 通用,雙擊添加一個 start ,一個 轉換 ,一個 作業 和一個 成功 到右側的作業面板,這些作業項都可以改名字。
配置轉換和作業,把轉換對應到 tables in mysql.ktr 或者 aa.ktr。把作業對應到 insert into mysql.kjb,同時在execution那里選擇 執行每一個輸入行 用於循環。
這個作業就是最終需要的作業。
5.開始導數
點擊作業面板左上角的三角形,運行這個作業。
點擊執行即可。
執行過程如下,日志記錄了遷移的過程。
成功會有提示,過程中出錯會終止,執行完作業可以去navicat查看mysql的表。
四、步驟總結
在mysql里查找當前庫下有哪些表格,或者從整理好的Excel讀取,輸出到結果記錄
從結果記錄里面每次取一行,設置成變量vtable
針對每次使用的變量值,去oracle數據源里生成對應的表輸入(通過變量生成)
把變量賦給表輸出的表名,其他配置不變,因為表名和字段都和源端oracle是一樣的
針對每個“輸出到結果記錄”做循環,插入每個oracle表的數據到mysql