基於LOGMINER 的表DML誤操作恢復
經常遇到開發人員錯誤刪除,修改,插入等誤操作,事後又不知道具體操作哪些資料,希望把恢復到某某時間點,在資料庫開歸檔並有備份的情況的下有一下方法
1 閃回資料庫(需要開啟flashback)
2 異機資料庫不完全恢復(可基於部分表空間)
3 LOGMINER 日誌挖掘(需要設定supplemental logging)
對DML誤操作,如果flashback沒有開啟,只有選擇後兩種方法,如果資料庫較大對於第二種方法將比較笨重,需要準備新的機器,安裝軟體,複製備份,執行恢復。在開啟supplemental logging(建議資料庫開啟supplemental logging最小模式,對日誌量影響較小),情況下則可以選擇LOGMINER。
關於使用logminer 需要開啟supplemental logging 官方文件有明確說明
Database-Level Supplemental Logging
There are two types of database-level supplemental logging: minimal supplemental logging and identification key logging, as described in the following sections. Minimal supplemental logging does not impose significant overhead on the database generating the redo log files. However, enabling database-wide identification key logging can impose overhead on the database generating the redo log files. Oracle recommends that you at least enable minimal supplemental logging for LogMiner
---挖掘過程
一 建立使用者
create user logmnr_user identified by logmnr_user;
grant connect,resource,dba to logmnr_user;
alter user logmnr_user default tablespace TBS_XINHUA40_MZMX_1
二 複製源表
create table LOGMNR_USER.D405 nologging as select * from FANGCHENG40.D405 where 1=2;
alter table LOGMNR_USER.D405 add r_rowid varchar2(1000);
create index LOGMNR_USER.D405_ROWID on LOGMNR_USER.D405(r_rowid);
把源表的rowid 作為新表的一個欄位,方便快速更新
insert /*+ append */ into LOGMNR_USER.D405(D405_01,
D405_02,
D405_03,
D405_04,
D405_05,
D405_06,
D405_07,
D405_08,
D405_09,
D405_10,
r_rowid) Select D405_01,
D405_02,
D405_03,
D405_04,
D405_05,
D405_06,
D405_07,
D405_08,
D405_09,
D405_10,
rowid
From FANGCHENG40.D405;
commit;
exec dbms_stats.gather_table_stats(ownname => 'LOGMNR_USER',tabname => 'D405',granularity => 'ALL',cascade => true);
三 修改引數
alter system set utl_file_dir='/home/oracle' scope=spfile;
shutdown immediate
startup
四 生成字典
exec dbms_logmnr_d.build('dictionary.ora','/home/oracle');
五 新增需要的日誌
查詢需要新增的日誌
select name from v$archived_log a where a.FIRST_TIME>=to_date('&DT','yyyy-mm-dd HH24:mi:ss')
新增日誌
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56140_690352144.dbf',Options=>dbms_logmnr.new);
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56141_690352144.dbf',Options=>dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56142_690352144.dbf',Options=>dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56143_690352144.dbf',Options=>dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56144_690352144.dbf',Options=>dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56145_690352144.dbf',Options=>dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile(LogFileName=>'/data3/archivelog/1_56146_690352144.dbf',Options=>dbms_logmnr.addfile);
六 挖日誌
exec dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/dictionary.ora');
七 logmnr的資料暫時儲存在一個表裡面,免得再次查詢時候不用再次新增歸檔日誌
create table logmnr_user.tab_logmnr_contents nologging as select * from v$logmnr_contents where 1=2;
insert /*+ append */ into logmnr_user.tab_logmnr_contents select * from v$logmnr_contents;
commit;
八 結束日誌挖掘
exec dbms_logmnr.end_logmnr;
---處理資料階段
一 檢測是否發生過DDL
select operation
from LOGMNR_USER.TAB_LOGMNR_CONTENTS
WHERE
SEG_NAME = 'D405' AND
SEG_OWNER = 'FANGCHENG40'
group by operation
二 處理資料
根據新增加的R_ROWID列UPDATE DELETE
declare i int;
begin
i:=0;
for aa in (select replace(replace(SQL_UNDO,'"FANGCHENG40"','"LOGMNR_USER"'),'ROWID','R_ROWID') sql_undo
from LOGMNR_USER.TAB_LOGMNR_CONTENTS
WHERE
SEG_NAME = 'D405' AND
SEG_OWNER = 'FANGCHENG40'
and operation in ('INSERT','UPDATE','DELETE')
and TIMESTAMP>=to_TIMESTAMP('2013-12-02 09:17:00','yyyy-mm-dd hh24:mi:ss')
order by to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss') desc) loop
execute immediate replace(aa.sql_undo,';','');
i:=i+1;
end loop;
dbms_output.put_line(to_char(i));
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15747463/viewspace-1062487/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flashback Query 針對DML誤操作的恢復
- 表資料被誤操作的恢復
- Oracle恢復誤操作刪除掉的表Oracle
- 動手為王——利用logminer挖掘日誌恢復誤操作
- Oracle10g中FLASHBACK TABLE語句恢復DML誤操作Oracle
- logminer恢復誤覆蓋更新的資料
- Oracle 11g 主動選擇的不完全恢復,基於SCN的,DML操作Oracle
- 【MySQL】恢復誤操作的方法MySql
- oracle資料庫災難挽救應急方案之DML誤操作恢復Oracle資料庫
- 使用Logminer工具分析DML和DDL操作
- 利用undo的閃回特性恢復錯誤操作的表
- 9i新特性之Flashback Query的應用---針對DML誤操作的恢復
- Mysql update誤操作恢復MySql
- 基於GTID恢復誤篡改資料
- 使用Logminer來分析具體的DML操作日誌
- 使用 Oracle logminer 挖掘日誌恢復誤刪資料以及查詢操作者Oracle
- 基於 Vuex 的時移操作(撤回/恢復)實現Vue
- 閃回 錯誤的DML 操作
- logminer來恢復在表DDL之前被刪除的資料
- 【RMAN】rm -rf 誤操作的恢復過程
- oracle logminer恢復truncate table的資料Oracle
- oracle實驗記錄 (恢復-表空間基於時間點恢復(rman))Oracle
- DB2 恢復誤刪除的表DB2
- (個人)利用日誌挖掘恢復誤操作
- [20141218]誤操作刪除dual表的恢復.txt
- 基於資料塊的恢復
- 【北亞資料恢復】誤操作導致雲伺服器表被truncate,表內資料被delete的資料恢復資料恢復伺服器delete
- 為什麼我的logminer分析不出scott使用者的dml操作?
- oracle實驗記錄 (恢復-表空間基於時間點恢復(手動))Oracle
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- flashback database 恢復誤刪除的表空間。Database
- MySQL誤操作後如何快速恢復資料MySql
- 【RMAN】表空間基於時間點的RMAN恢復-TSPITR
- oracle基於SCN增量恢復Oracle
- 基於cancel的資料庫恢復資料庫
- Oracle基於時間點的恢復Oracle
- LogMnr-誤DML後使用logmnr對資料進行恢復
- 特殊的恢復操作