執行轉換時如何讓Kettle記錄錯誤並繼續執行?——記一種解決方案
如題,近幾天在利用Kettle進行資料遷移的工作(也就是把資料全量匯入到新資料庫中,其中有些欄位有些許調整),在寫好指令碼並執行後發現一個很嚴重的問題——每次指令碼在執行到某個位置的時候就會意外停止,如下兩圖所示
而自帶的日誌中提示類似如下:
2017/05/12 14:43:07 - 表輸出.0 - ORA-12592: TNS: 包錯誤
2017/05/12 11:37:46 - 表輸出。0 Caused by : java.sql.BatchUpdateException: ORA-01438:值大於為此列指定的允許精度
百度谷歌了一下這種錯誤,是屬於Oracle的錯誤,在關於kettle的提問當中也有人遇到類似錯誤,但是在樓下回復的內容中並沒有找到太多有用的資訊。
所以猜想其中可能有部分資料是“髒資料”,導致插入到新資料庫中時報錯,至於圖中在表輸出時數量都是整百是因為在指令碼的“表輸出”環節中設定了預設為1000條提交一次,也就是1000條commit一次,而當這一千條中有資料插不進去的時候,當然會報錯了,那麼我們現在大概知道了錯誤的原因,我們要想怎麼解決它……
下面有兩個疑問:
- 我怎麼能越過錯誤資料並記錄下來直接進行下面資料的提交
我怎麼能找出來這些錯誤資料?具體到每條?
後來專程因為這個去我的兩個kettle群裡問了一下,結果有一個人回答了我說讓我用日誌,後來私聊他問具體情況的時候他過半小時沒回我於是我用出了殺手鐗——給紅包,把我QQ錢包裡僅有的四塊錢塞在了裡面,這樣他處於好奇心一定會點開,那麼在中國,拿了錢你還能不辦事嗎(滑稽),雖然最後他也沒有給出特別有建設性的建議,但是我修改了一下指令碼,至少解決了出了錯就越過的需求
這裡我們看到了表輸入的地方輸入時有28W,是因為我中間進行強制暫停了,實際上源資料大概有128W
我在後面加了這個 表輸入的地方填的是500 現在空操作裡有31000條資料 就是大概有至少62個錯誤 ,也就是說現在的這個指令碼可以實現的功能就是—— 遇到錯誤可以略過,但是連同錯誤資料一起提交的其他資料也上傳不了,
這當然也不是我們想要的
因為在使用kettle的轉換過程中 我們發現在連線每兩個步驟的時候如果慢一點鬆開滑鼠我們是可以看到有輸出步驟和錯誤輸出步驟的選項,而後者就是為了我們這種需求而存在的,在這個步驟中一旦遇到了錯誤 ,我們可以讓它去執行下面的語句。
總結一下可以理解成:之前版本的沒有錯誤處理的相當於只有一個if語句,那麼如果一旦不滿足 就跳出來報錯,而我們第二種解決方案也就是上圖 ,加了一個else功能,如果不滿足,那麼還有備選,或者這裡理解成一個try塊也是一樣的。
那麼我們是不是可以繼續增加功能呢 比如把下面的空操作換成別的 比如。。。日誌?
但是在接下來的實踐中,kettle轉換中的“寫日誌”步驟貌似是要連結資料庫的,那麼問題就來了,我只是想知道這些錯誤資料是哪些,然後找出來,改正它,再匯入到新的資料庫而已,我為了找出這幾個錯誤資料還要建表??,想想公司配的電腦,想想連結Oracle時那緩慢的速度於是瞬間打消了念頭,。。
那麼。。。
我們為啥不在它後面加上別的輸出呢,比如txt?excel???
於是我先使用了txt 並把日誌型別設定成詳細日誌(其它的還有 沒有日誌 最小日誌 ,基本日誌,除錯,行級日誌等),執行了一會後發現實在是太多太多了, ——瞬間清屏了,,一個可拉的滾動條只能看見兩秒鐘內的資料傳輸,而且包括輸出成功的資料(真是夠詳細的=。=),而且txt在看資料的時候特別不方便,於是下面又用了錯誤日誌 + excel輸出
考慮到每次提交都會把連帶一起commit的資料也扔掉,所以在“表輸入”的時候選項改成了1,為了找出錯誤就是如此喪心病狂,已經無所謂效率了
最後如下
也就是這128W的資料中有62個髒資料來阻止我們正常進行資料遷移,好可恨啊!
那麼我們下面只要好好分析一下這些髒資料到底是哪裡出了問題,然後改正它們,最後再把所有的資料重新匯入,問題就應該全部解決了。。
但是這裡還有個最後的問題,這種解決方案是最優的嗎?我們為了保證正確資料的不缺失而讓每次提交的資料量為1 ,這樣大大降低了效率,但是目前我還沒有更好的解決方案,也不知道該問誰,但是最後看問題解決了就很好,如果有哪位大牛在看到這裡,如果有更好的解決方案請與本人聯絡,本人一定虛心學習。
相關文章
- 記錄錯誤並繼續執行:錯誤事件記錄子句 --轉事件
- Lumen 實時記錄 SQL 執行解決方案SQL
- IIS 7.5 解析錯誤 命令執行漏洞解決方案
- fabric執行記錄
- go 學習記錄--如何執行Go
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(2)(轉)執行緒
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(1)(轉)執行緒
- iOS 多執行緒記錄(一)iOS執行緒
- php返回資料後如何讓程式繼續執行其它操作PHP
- KETTLE一行一行執行方法
- 解決單執行緒QT UI 載入進度條實時顯示方案記錄執行緒QTUI
- vagrant homestead 錯誤記錄以及解決方案
- Kettle筆記3-三種執行方式:圖形/命令列/API筆記命令列API
- 執行create table as 報ora-600的錯誤的解決方案
- 記錄ORACLE語句的執行時間Oracle
- Java多種方法實現等待所有子執行緒完成再繼續執行Java執行緒
- Python 執行js的2種解決方案PythonJS
- 執行無法解決的編譯錯誤編譯
- 執行spoon.bat時Kettle無法啟動問題解決BAT
- 記一次 Laravel 定時任務不按時執行的 Bug 追查記錄及修復方案Laravel
- 求救!!!!!!jsp執行錯誤;(轉)JS
- 執行緒池小記錄執行緒
- R語言記錄程式執行的時間R語言
- virtualbox 錯誤解決記錄
- 如何在JavaScript中實現某個方法執行超時後則繼續執行其它方法?JavaScript
- 執行錯誤集
- 基於Spring的Web專案執行時切換資料來源的一種解決方案SpringWeb
- 以autotrace檢視執行計劃時換行的解決
- laravel-MIX 非手冊環境下無法正常執行,解決方案記錄Laravel
- CentOS 中yum命令執行錯誤解決辦法CentOS
- 執行impdp時出現ORA-39154錯誤的解決案例
- Java程式碼執行記憶體溢位詳解及解決方案Java記憶體溢位
- Web命令執行筆記(持續更新)Web筆記
- 評“MySQL 隱式轉換引起的執行結果錯誤”MySql
- 十九:從庫MTS多執行緒並行回放(一)(筆記)執行緒並行筆記
- iOS 多執行緒記錄(二)iOS執行緒
- postgresal使用錯誤解決 (記錄篇)
- kettle執行定時任務,kitchen.batBAT