1. 程式人生 > 其它 >Oracle資料庫丟失表排查思路

Oracle資料庫丟失表排查思路

Oracle資料庫丟失表排查思路

說明:由於系統採用ID取模分表法進行Oracle資料儲存,某日發現Oracle資料庫中缺少對應的幾張業務資料表,遂進行相關問題查詢,簡單記錄一下排查思路;

  1. 由於我們程式碼中實現思路是判斷如果沒有對應的表會自動建立,所以首先需要查詢一下缺失資料庫表的建立時間
SELECT * FROM dba_objects where OBJECT_NAME LIKE 'LOG_5%' AND owner = 'Geoff';
  1. 通過查詢Oracle執行SQL歷史記錄,資料庫表的刪除時間段
select * from v$sqlarea b
   where b.FIRST_LOAD_TIME between '2022-05-31/21:30:00' and'2022-05-31/23:30:00'` 
    order by b.FIRST_LOAD_TIME;
  1. 通過上述SQL還是無法查詢具體表的刪除時間,故查詢當前使用者的資料庫回收站
SELECT * FROM recyclebin_temp WHERE TYPE = 'TABLE' ORDER BY droptime DESC;
  1. 通過回收站查詢到相應的已刪除資料庫表,並將資料庫已刪除表恢復至刪除前,包含表中資料
flashback TABLE LOG_505 to before drop RENAME to LOG_505_temp ;
  1. 因為資料恢復時,系統已新建資料庫表併產生資料,所以需要將新老資料都恢復到資料庫表中
--查詢當前資料庫表中的最大ID
SELECT ID FROM WORK_DUTY_LOG_505_temp ORDER BY ID DESC;
--修改序列步長至最大ID
ALTER sequence SEQ_WORK_DUTY_LOG_505 INCREMENT BY 3538;
SELECT SEQ_WORK_DUTY_LOG_505.nextval FROM dual;
--恢復序列步長為預設值1
ALTER sequence SEQ_WORK_DUTY_LOG_505 INCREMENT BY 1;

--建立觸發器,並將表中資料手動插入到從回收站恢復的臨時表中
CREATE OR REPLACE TRIGGER T_WORK_DUTY_LOG_505 BEFORE INSERT ON WORK_DUTY_LOG_505_temp REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW 
begin
 select SEQ_WORK_DUTY_LOG_505.Nextval into:new.ID from dual;  --base_login_user_id序列名稱  --ID給ID裝上序列
end;

--刪除觸發器
DROP TRIGGER T_WORK_DUTY_LOG_505;
--將臨時表中整合完成的資料恢復至原資料庫表中
INSERT INTO  WORK_DUTY_LOG_505 SELECT * FROM WORK_DUTY_LOG_505_temp
--查詢確認
SELECT * FROM WORK_DUTY_LOG_505 ORDER BY ID DESC;

寫在最後:

通過後續排查,發現可能是因為程式碼中判斷相關程式碼查詢結果有誤,導致相關表被誤刪除,暫時通過註釋下方刪除表結構程式碼避免問題復發,相關原因後續繼續排查