問題描述
- 開發同事在在14點左右發現任務表
task_info資料不正確,3個小時之前的資料消失了,資料截止時間11:38:27
問題分析
-
查詢過dba_source,只找到一個洗掉該表的存盤程序,而且也不會造成這種情況;
-
根據現象,懷疑有人在11:38左右做了delete操作且沒有寫where條件,把整表資料全部洗掉;
-
關聯查詢dba_hist_active_sess_history,gv$sql未發現相關陳述句
-
關聯查詢gv$active_session_history,gv$sql也未發現相關陳述句
-
可能時間太久,sql已經不在快取中 ,根據推測時間精確查找gv$active_session_history,發現有delete操作,且通過等待事件引數和object_id都確定為這個表,但是sql缺失,不能確定是否是該條記錄,且通過machine等資訊看,還是一個iis站點程式,一般情況程式不會犯這等錯誤
select t.* from v$active_session_history t where t.sample_time between to_date('2020-11-26 11:36:00','yyyy-mm-dd hh24:mi:ss') and to_date('2020-11-26 11:40:00','yyyy-mm-dd hh24:mi:ss') and t.SQL_OPNAME not in ('SELECT','INSERT','UPDATE') -
通過logminer決議日志查看相關資訊
-
恢復相關時刻的日志
select t.FIRST_TIME, t.NAME, t.BLOCKS * t.BLOCK_SIZE / 1024 / 1024 size_mb, t.NEXT_TIME, t.COMPLETION_TIME from v$archived_log t order by first_time desc; -
通過rman恢復相關歸檔日志
run{ ALLOCATE CHANNEL CH1 DEVICE TYPE DISK; ALLOCATE CHANNEL CH2 DEVICE TYPE DISK; ALLOCATE CHANNEL CH3 DEVICE TYPE DISK; ALLOCATE CHANNEL CH4 DEVICE TYPE DISK; set archivelog destination to '+DG_FLASH_ARCH'; restore archivelog from time 'sysdate-5/24'; } -
執行logminer
begin dbms_logmnr.add_logfile('+dg_flash_arch/rac/ARCHIVELOG/2020_11_26/thread_2_seq_119065.391.1057504707',dbms_logmnr.new); --dbms_logmnr.add_logfile('+DG_FLASH_ARCH/rac/archivelog/2020_11_26/thread_2_seq_119065.391.1057504707',dbms_logmnr.ADDFILE); end; begin dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only); end; create table t1 tablespace USERS as select * from v$logmnr_contents where table_name='TASK_INFO' and OPERATION='DELETE'; select t1.machine_name,t1.client_id,t1.* from t1 order by t1.client_id desc; begin DBMS_LOGMNR.END_LOGMNR();end;
-
-
查詢machine_name,client_id,session#編號資訊都是沒有有效資訊
-
最后發現有決議redo結果中有事務id,對比v$active_session_history中之前找到的那條記錄,發現決議出來的事務號跟其一致,這下就證實了是程式洗掉的
-
問題回轉給開發查找代碼,最終找到相應代碼,并整改,
總結
查找程序中,線索屢次中斷,還好沒放棄,最后意外通過事務號一錘定音,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/228970.html
標籤:Oracle
