背景:程序正常運行中,突然技術支持人員反映數據庫數據好久沒有增加,於是乎各種排查問題,但是一直沒有找到原因,由於代碼比較久,也不是本人所寫,更氣的是居然用的是oracle數據庫,並且是通過java代碼調用存儲過程。存儲過程中包含了大量的邏輯。而java服務的日志也就少的可憐,根本無法排查出具體問題,唯一可以確認的是存儲過程有問題。
1.首先排查存儲過程,從上到下依次看,一共二百多行的代碼,花了一小時看了一遍,感覺沒什么問題,於是又通過手動輸入參數,通過plsql測試存儲過程,也沒什么問題。
2.經歷了第一步,感覺整個世界都不好了,於是開始拆解存儲過程邏輯,將存儲過程邏輯轉移到java代碼中(改寫了半天),打印詳細日志,每一句sql都打印日志。終於在一句insert處出現了問題,返回結果 內部錯誤。
3.針對這張表,開始了有一個坑,
a. select * from tableName; 完全沒有問題。
b. select count(*) from tableName; 提示 ORACLE 報ORA-08103: 對象不再存在錯誤.
wtf?什么情況??明明數據庫用眼睛是可以看到這個表的,並且select * 是可以正常查詢出數據的,難道是眼睛有問題?於是又開始了三次同樣的sql,還是同意的結果,於是終於拿出了神器 google,google一圈發現都是說數據損壞,導致無法插入。
c. 復制表咯。create table tableNameNew as select * from tableName;
d. 刪除原來的表 (本來想重命名的,但是重命名失敗,於是直接刪除)
e.重命名新表名為舊表名。
大功告成!!!!!!!!!!!!oracle線上使用檢查會出現崩潰還有用戶被鎖定的情況,很崩潰。