1. 程式人生 > >Oracle Logminer 做資料恢復 說明示例

Oracle Logminer 做資料恢復 說明示例

IBM DBA 小荷的blog上看到一個用Logminer 做資料恢復的例子。 雖然對Logminer 也瞭解一點,但是用Logminer 做恢復還真沒用過,所以也測試一下。 原文連結地址如下:

. 在測試之前講一點理論知識

1.1. 補充日誌(supplemental logging

先看一下補充日誌都包含哪些資訊和特性:

1)索引簇、鏈行和遷移行;

2)直接路徑插入;

3)摘取LogMiner字典到重做日誌;

4)跟蹤DDL

5)生成鍵列的SQL_REDOSQL_UNDO資訊;

6LONGLOB資料型別。

這裡我們重點看一下:

track DDL generate sql_redo and sql_undo.

Oracle online redo 會記錄DB的所有操作,包括DDL DML supplemental log支援track DDL 也就是說,我們可以直接去Mining DML的內容。 但是如果要去Mining DDL 內容,就必須先啟動supplemental logoracle 收集有關更多的DDL 資訊之後,我們才可以去Mining它的資訊。

因為我們可以根據歸檔和online redo 去恢復資料,所以這些DDL 的內容,即使不啟動 supplemental log

,對與Oracle 內部來說肯定是可以識別的,只是我們不能Mining出來。 只有啟動supplemental log之後,我們也就可以Mining出來了。

預設情況下Oracle 並沒有啟動supplemental log。因為記錄太多的內容會增加寫log的壓力。

SQL_REDO SQL_UNDO 是我們操作的SQLDDLDML)和用於回滾的SQL我們的恢復就是使用SQL_UNDO 來進行的。

在我們的DML DDL操作之前,需要先啟動supplemental log不然生成的SQL_REDO SQL_UNDO 是沒有經過資料字典轉換過的,這樣不具可讀性。

都是Oracle 內部的ID

啟動supplemental log

SQL>alter database add supplemental log data;

關閉supplemental log

SQL>alter database drop supplemental log data;

檢視 supplemental log

SQL>select supplemental_log_data_min from v$database;

1.2Logminer 的三種模式

在我之前整理過的Blog裡有詳細說明:

Oracle Logminer 說明

LogMiner dictionary

The LogMiner dictionary allows LogMiner to provide table and column names, instead of internal object IDs, when it presents the redo log data that you request.

LogMiner uses the dictionary to translate internal object identifiers and datatypes to object names and external data formats. Without a dictionary, LogMiner returns internal object IDs and presents data as binary data.

LogMiner字典用於將內部物件ID號和資料型別轉換為物件名和外部資料格式。使用LogMiner分析重做日誌和歸檔日誌時,應該生成LogMiner字典,否則將無法讀懂分析結果。

INSERT INTO HR.JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)VALUES('IT_WT','Technical Writer', 4000, 11000);

如果沒有資料字典進行轉換,解析之後的結果是:

insert into "UNKNOWN"."OBJ# 45522"("COL 1","COL 2","COL 3","COL 4") values (HEXTORAW('45465f4748'),HEXTORAW('546563686e6963616c20577269746572'),HEXTORAW('c229'),HEXTORAW('c3020b'));

這個就沒有什麼可讀性了。 現在我們來看三種模式。

1.2.1 Online Catalog

直接用DB的資料字典線上進行轉換。 要求DB必須處於open 狀態,只能Mining DML 只能反應當前版本表中的資訊。 即表沒有沒有進行DDL 修改。 只能Mining到表自修改之後到現在的資料。 之前的不能Mining

這是效率最高的。 但是缺點也擺在這。 系統表是關鍵表,用這種方法會增加DB的壓力。

1.2.2 Extracting a LogMiner Dictionary to the Redo Log Files

The process of extracting the dictionary to the redo log files does consume database resources, but if you limit the extraction to off-peak hours, then this should not be a problem, and it is faster than extracting to a flat file. Depending on the size of the dictionary, it may be contained in multiple redo log files. If the relevant redo log files have been archived, then you can find out which redo log files contain the start and end of an extracted dictionary.

To do so, query the V$ARCHIVED_LOG view, as follows:

SQL>SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';

SQL>SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';

使用這種方法必須啟動supplemental log 程序會講database dictionary的資訊extractonline redo log裡去,從而減少對在Mining時對資料庫資源的消耗。 如果database dictionary 非常大, 這時候在寫online redo的時候發生了歸檔的操作。 那麼可以通過上面的兩個SQL 來檢視。 因為dictionary資訊寫入了這些log檔案,所以在Mining時,這些檔案是必須包含在Mining裡的,不然會報ORA-1371的錯誤。

To extract a LogMiner dictionary to the redo log files, the database must be open and in ARCHIVELOG mode and archiving must be enabled. While the dictionary is being extracted to the redo log stream, no DDL statements can be executed. Therefore, the dictionary extracted to the redo log files is guaranteed to be consistent (whereas the dictionary extracted to a flat file is not).

這個還有一個很大的問題在這。就是在進行extract的時候,所以的DDL 都會被掛住。即不能執行,只有當extract 結束以後,DDL 才能執行。如果extract 的時間很長,那麼DDL 被掛的時間也就很長。

雖然講生產庫上DDL 操作很少,但是這個extract directory to redo 操作也還是有風險的。 所以可行性最高的還是我們的第三種方法。

1.2.3 Extracting the LogMiner Dictionary to a Flat File

When the LogMiner dictionary is in a flat file, fewer system resources are used than when it is contained in the redo log files. Oracle recommends that you regularly back up the dictionary extract to ensure correct analysis of older redo log files.

Be sure that no DDL operations occur while the dictionary is being built.

同樣需要啟動supplemental log extract to online redo的時候,Oracle會限制DDL 執行,直到directory extract 結束。 extract to flat file的話,就需要使用者來保證這個一致性了。 而且每次進行挖掘的時候都需要extract一次,從而保證一致性。

這種方法的致命傷是需要設定 UTL_FILE_DIR引數,而該引數的生效必須重啟DB

我們這裡就是用extract to flat file來來演示資料恢復。

. Logminer恢復的示例

一般生產環境不會啟動supplemental log 所以用Logminer 方法來做資料恢復不是一種常用的方法。 對於DML 操作,還是有一定的可行性。 DDL 就不行。

而且在沒有啟動supplemental log的情況下,Mining出來的SQL_REDOSQL_UNDO資料是沒有進過資料字典進行轉換的,可讀性很差。如:

deletefrom"UNKNOWN"."OBJ# 54173"where"COL 1"=HEXTORAW('53434f5454')and"COL 2"=HEXTORAW('504b5f44455054')and"COL 3"ISNULLand"COL 4"=HEXTORAW('c3060c30')and"COL 5"=HEXTORAW('c3060c30')and"COL 6"=HEXTORAW('494e444558')and"COL 7"=HEXTORAW('7869061e14303a')and"COL 8"=HEXTORAW('7869061e14303a')and"COL 9"=HEXTORAW('323030352d30362d33303a31393a34373a3537')and"COL 10"=HEXTORAW('56414c4944')and"COL 11"=HEXTORAW('4e')and"COL 12"=HEXTORAW('4e')and"COL 13"=HEXTORAW('4e')andROWID='AAANOdAABAAATEmAAc';

insertinto"UNKNOWN"."OBJ# 54173"("COL 1","COL 2","COL 3","COL 4","COL 5","COL 6","COL 7","COL 8","COL 9","COL 10","COL 11","COL 12","COL 13")values(HEXTORAW('53434f5454'),HEXTORAW('504b5f44455054'),NULL,HEXTORAW('c3060c30'),HEXTORAW('c3060c30'),HEXTORAW('494e444558'),HEXTORAW('7869061e14303a'),HEXTORAW('7869061e14303a'),HEXTORAW('323030352d30362d33303a31393a34373a3537'),HEXTORAW('56414c4944'),HEXTORAW('4e'),HEXTORAW('4e'),HEXTORAW('4e'));

Logminer 可以作為Flashback 的一種補充。 關於Flashback 參考我的Blog

Oracle Flashback 技術總結

3.1 啟動supplemental log

[email protected](rac2)> alter database add supplemental log data;

Database altered.

[email protected](rac2)> select supplemental_log_data_min from v$database;

SUPPLEME

--------

YES

這個引數可以動態修改,不需要重啟DB

3.2 建立測試表

[email protected](rac2)> create table huaining as select * from dba_objects;

Table created.

[email protected](rac2)> select count(*) from huaining;

COUNT(*)

----------

50253

-- 檢視一下時間

[email protected](rac2)> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

[email protected](rac2)> select sysdate from dual;

SYSDATE

-------------------

這個時間之前的是我們的原始資料。 下面我們做一些DML 操作,做完操作之後,我們可以使用Flashback 去進行rollback 這裡我們使用LogminerMining 這些DML,然後用sql語句去進行rollback

3.3. 一些DML 操作

[email protected](rac2)> select distinct owner from huaining;

OWNER

------------------------------

MDSYS

TSMSYS

DMSYS

PUBLIC

OUTLN

CTXSYS

OLAPSYS

SYSTEM

EXFSYS

SCOTT

ORACLE_OCM

DBSNMP

ORDSYS

ORDPLUGINS

SYSMAN

XDB

SYS

WMSYS

SI_INFORMTN_SCHEMA

19 rows selected.

[email protected](rac2)> delete from huaining where owner='SCOTT';

6 rows deleted.

[email protected](rac2)> commit;

Commit complete.

[email protected](rac2)> update huaining set owner='DAVE' where object_id<20;

18 rows updated.

[email protected](rac2)> commit;

Commit complete.

假設N長時間過去了,已經超過了UNDO retention的時間,沒辦法進行Flashback,這時候就可以用Logminer來把這段時間內的DML操作給挖出來,然後用SQL_UNDOsql執行一下,就恢復出來。

3.4 設定資料字典目錄

[email protected](rac2)> show parameter utl

NAMETYPEVALUE

----------------------------- ----------------------- ----------

create_stored_outlinesstring

utl_file_dirstring

現在為空,沒有值

[email protected](rac2)> alter system set utl_file_dir='/u01/backup' scope=both;

alter system set utl_file_dir='/u01/backup' scope=both

*

ERROR at line 1:

ORA-02095: specified initialization parameter cannot be modified

--必須重啟才能生效

[email protected](rac2)> alter system set utl_file_dir='/u01/backup' scope=spfile;

System altered.

3.5 重啟例項

[[email protected] u01]$ sh crs_stat.sh

NameTargetStateHost

------------------------------ ---------- ----------------

ora.anqing.anqing1.instONLINEONLINErac1

ora.anqing.anqing2.instONLINEONLINErac2

ora.anqing.dbONLINEONLINErac1

ora.rac1.ASM1.asmONLINEONLINErac1

ora.rac1.LISTENER_RAC1.lsnrONLINEONLINErac1

ora.rac1.gsdONLINEONLINErac1

ora.rac1.onsONLINEONLINErac1

ora.rac1.vipONLINEONLINErac1

ora.rac2.ASM2.asmONLINEONLINErac2

ora.rac2.LISTENER_RAC2.lsnrONLINEONLINErac2

ora.rac2.gsdONLINEONLINErac2

ora.rac2.onsONLINEONLINErac2

ora.rac2.vipONLINEONLINErac2

[

相關推薦

Oracle Logminer 資料恢復 說明示例

在IBM DBA 小荷的blog上看到一個用Logminer 做資料恢復的例子。 雖然對Logminer 也瞭解一點,但是用Logminer 做恢復還真沒用過,所以也測試一下。

MySQL使用binlog日誌資料恢復

MySQL的binlog日誌是MySQL日誌中非常重要的一種日誌,記錄了資料庫所有的DML操作。通過binlog日誌我們可以進行資料庫的讀寫分離、資料增量備份以及伺服器宕機時的資料恢復。 定期備份固然可以在伺服器發生宕機的時候快速的恢復資料,但傳統的全量備份不可能做到實時,

因突然斷電造成Oracle破壞的資料恢復方法

我公司因一客戶的資料庫出現突然斷電,致使資料庫被破壞,無法進入資料庫,也無法匯出oracle中的資料,因我同事急電求助,所以經過研究,我將資料復原了.現將資料復原方法寫出來,供同行們參考.  1.如果資料庫版本是9.2以上的話,可以用一個nid工具修改sid等,這個工具的具體

Oracle Logminer 分析重日誌RedoLog和歸檔日誌ArchiveLog

cti data 格式 保存 命令 重啟 msl dba object 在實際開發過程中,有時我們很有可能需要某個表的操作痕跡,或通過記錄的SQL語句進行有目的性的數據恢復(此時POINT-IN-TIME恢復已經滿足不了更細的粒度)、或僅僅是查看;

ORACLE環境故障型別分析及資料恢復方案

一、基於ORACLE 資料庫環境的常見資料災難;故障表現: 1、ORACLE資料庫無法啟動或無法正常工作。 2、ORACLE ASM儲存破壞。 3、ORACLE資料檔案丟失。 4、ORACLE資料檔案部分損壞。 5、ORACLE DUMP檔案損壞。 二、解決方案 ◆檢測

【JEECG示例文件】使用Kettle從mysql向oracle中抽取資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

oracle備份之rman_恢復資料檔案

測試環境:redhat 5.5 oracle 11g 測試步驟: 1.備庫 2.插資料 3.刪dbf 4.關閉並啟動到mount 5.restore 6.recover 7.開啟 RMAN> backup database; Starting back

JAVA利用enum結合testng資料驅動示例

資料驅動是做自動化測試中很重要的一部分,資料來源的方案也是百花八門了,比如利用外部檔案,直接在@DataProvider中寫死等等,我們今天介紹一下利用enum來做資料來源,先來看一下enum的寫法: public enum EnumData { PAY_RESERVE(1, "支付預約

oracle容災之truncate資料恢復

在我的另外幾篇文章中,介紹了關於資料庫閃回的一些內容,對於drop和delete的資料閃回。對於truncate,可能有一些資料庫知識的應該會知道,在正常邏輯中,如果我們將表truncate掉了,是找不回來了,TRUNCATE TABLE 是一次性地從表中刪除所有的資料並不把單獨的刪除操

Oracle的日誌挖掘恢復資料

  oracle日誌挖掘是一種十分強大的資料恢復技術,只要你保障你的歸檔日誌和重做日誌是完整的,那麼就可以將你的資料恢復到任何時刻。簡單敘述一下日誌挖掘的基本原理,然後進行一個簡單的小實驗。   日誌挖掘時基於redo日誌和歸檔日誌的基礎之上來進行日誌載入並進行恢復,挖掘,挖掘,挖的就是你的re

oracle誤刪除資料恢復方法

學習資料庫時,我們只是以學習的態度,考慮如何使用資料庫命令語句,並未想過工作中,如果誤操作一下,都可能導致無可挽回的損失。當我在工作中真正遇到這些問題時,我開始尋找答案。 今天主要以oracle資料庫為例,介紹關於表中資料刪除的解決辦法。(不考慮全庫備份和利用歸檔日誌

恢復oracle 中誤刪的表 或delete 刪掉的資料恢復

查看回收站中表  drop表之後的恢復 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin; SQL>flashback

ORACLE資料庫表及資料恢復

恢復刪除表(保證表還在回收站,並未被purge掉) --flashback table 表名 to before drop恢復刪除表。 恢復刪除資料1: ALTER TABLE table_name

oracle 資料恢復,只有oradata資料夾裡的檔案,沒有備份檔案的資料庫恢復,重灌系統後,oracle 10g資料庫恢復

格式化重灌系統後,才想起來oracle 10g 資料庫沒有做備份,開始以為很麻煩,沒想到資料庫恢復的還挺順利的 恢復方法: 1,把原來的資料庫檔案備份,(D:\oracle\product\10.2.0\oradata\gqxt),重新命名即可,我命名為gqxt_old,(

oracle誤刪除資料之後的恢復方法

  今天要刪除表中的資料,不小心刪錯,而且提交了事務,這些資料要從頭再來,估計今天就全耽誤在這事上面了,只能在網上找資料,看了很多資料,現在自己也歸納一下   刪除表中的資料由三種方法:   delete刪除一條資料  drop和truncate刪除表格中資料   1.d

oracle體系結構+資料檔案+控制檔案+重日誌檔案+邏輯儲存結構+表空間

oracle體系結構 1:物理儲存結構 由儲存在磁碟的作業系統檔案組成,這些檔案主要是資料檔案(*.dbf),控制檔案(*.ctl),重做日誌檔案(*.log) 2:邏輯儲存結構 一物理儲存結構

Oracle閃回查詢恢復delete刪除資料

1、執行 select * from A as of timestamp sysdate-10/1440;     該SQL語會查找出距離現在10分鐘之前A表的所有資料。     sysdate-10/1440表示距離現在10分鐘之前,1440這個數字表示一天有

Oracle誤刪資料、誤修改資料恢復

select * from com_parameter(表名) as of timestamp TO_TIMESTAMP('2015-08-03 9:00:00','YYYY-MM-DD HH24:MI

oracle 鎖表與解鎖、資料恢復

SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) LOCK_LEVEL, o.owner,o.object_name,o.object_type, s.sid,s.serial#,s

ORACLE DBA工具收集(Oracle DUL/AUL/ODU 恢復工具,可以脫離Oracle執行環境,直接從資料檔案中讀取記錄)

    遇到效能問題要進行調優時, 常常不知道要怎麼調優, 原因是不知道在哪兒出現了效能問題, 所以需要藉助於有效的效能工具. oramon是一個很有效的效能資料收集工具, 從基本效能檢視(如V$SYSSTAT和V$SESSION等)中取出有效的效能資料, 進行橫向縱向聯合比較分析, 如不同時間點的邏輯