執行轉換時如何讓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 解析錯誤 命令執行漏洞解決方案
- vagrant homestead 錯誤記錄以及解決方案
- fabric執行記錄
- go 學習記錄--如何執行Go
- iOS 多執行緒記錄(一)iOS執行緒
- 解決單執行緒QT UI 載入進度條實時顯示方案記錄執行緒QTUI
- Kettle筆記3-三種執行方式:圖形/命令列/API筆記命令列API
- php返回資料後如何讓程式繼續執行其它操作PHP
- Excel宏執行時提示錯誤1004的三個解決方法Excel
- Java多種方法實現等待所有子執行緒完成再繼續執行Java執行緒
- 執行錯誤集
- 基於Spring的Web專案執行時切換資料來源的一種解決方案SpringWeb
- 評“MySQL 隱式轉換引起的執行結果錯誤”MySql
- 執行緒池小記錄執行緒
- Laravel Mix執行時關於es2015報錯解決方案Laravel
- 記一次 Laravel 定時任務不按時執行的 Bug 追查記錄及修復方案Laravel
- 執行 PHP artisan migrate 時報長度錯誤的解決辦法?PHP
- laravel-MIX 非手冊環境下無法正常執行,解決方案記錄Laravel
- Java程式碼執行記憶體溢位詳解及解決方案Java記憶體溢位
- wsl docker裡執行ollama並使用nvidia gpu的一些記錄DockerGPU
- iOS 多執行緒記錄(二)iOS執行緒
- linux 清空歷史執行記錄Linux
- 十九:從庫MTS多執行緒並行回放(一)(筆記)執行緒並行筆記
- Web命令執行筆記(持續更新)Web筆記
- win10執行jade提示399錯誤怎麼辦_win10執行jade提示399錯誤的解決方法Win10
- 主執行緒等待所有其他執行緒執行完畢,然後再繼續執行主執行緒的邏輯,有以下幾種方法可以實現:執行緒
- 關於 Composer dump-autoload 執行報錯解決方案
- 應用儲存過程執行報錯解決方案儲存過程
- 執行一個專案中間報錯裝包過程記錄
- Win10執行無法儲存歷史記錄怎麼辦 win10開始執行記錄不儲存如何解決Win10
- (轉)解決XMind執行卡頓
- 使用不可變Java記錄Record來避免多執行緒併發錯誤 - foojayJava執行緒
- 通過 HelloWorld 瞭解 Java 程式執行過程以及執行時記憶體Java記憶體
- Flutter: 解決執行時錯誤 java.lang.UnsatisfiedLinkError...couldn't find "libflutter.so"FlutterJavaError
- steam確認錯誤執行此操作時出現問題怎麼解決
- WCF執行錯誤:“此集合已經包含方案 http 的地址”的解決辦法HTTP
- JS繼續學習記錄(一)JS
- 透過DNS TXT記錄執行powershellDNS