日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

oracle logminer java_Oracle logminer

發布時間:2023/12/19 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle logminer java_Oracle logminer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、logminer的用途日志文件中存放著所有進行數據庫恢復的數據,記錄了針對數據庫結構的每一個變化,也就是對數據庫操作的所有DML語句。logminer 工具即可以用來分析在線,也可以用來分析離線日志文件,即可以分析本身自己數據庫的重作日志文件,也可以用來分析其他數據庫的重作日志文件。總的說來,logminer工具的主要用途有:

1.跟蹤數據庫的變化:可以離線的跟蹤數據庫的變化,而不會影響在線系統的性能。

2. 回退數據庫的變化:回退特定的變化數據,減少point-in-time recovery的執行。

3.優化和擴容計劃:可通過分析日志文件中的數據以分析數據增長模式。

二、安裝logminer

要安裝logminer工具,必須首先要運行下面這樣兩個腳本:

l. $ORACLE_HOME/rdbms/admin/dbmslm.sql

2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql

這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。

SQL>?@?/rdbms/admin/dbmslm.sql

程序包已創建。

授權成功。

同義詞已創建。

SQL>?@?/rdbms/admin/dbmslmd.sql

程序包已創建。

同義詞已創建。

SQL>?show?user

USER?為?"SYS"

三、使用logminer工具

下面將詳細介紹如何使用logminer工具。

1、創建數據字典文件(data-dictionary)

前面已經談到,logminer工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態性能視圖(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動logminer時創建)組成。在使用logminer工具分析redo log文件之前,必須使用DBMS_LOGMNR_D 包將數據字典導出為一個文本文件。該字典文件是可選的,但是如果沒有它,logminer解釋出來的語句中關于數據字典中的部分(如表名、列名等)和數值都將是16進制的形式,我們是無法直接理解的。

例如,下面的sql語句: INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三');

logminer解釋出來的結果將是下面這個樣子, insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));

創建數據字典的目的就是讓logminer引用涉及到內部數據字典中的部分時為他們實際的名字,而不是系統內部的16進制。數據字典文件是一個文本文件,使用包DBMS_LOGMNR_D來創建。如果我們要分析的數據庫中的表有變化,影響到庫的數據字典也發生變化,這時就需要重新創建該字典文件。另外一種情況是在分析另外一個數據庫文件的重作日志時,也必須要重新生成一遍被分析數據庫的數據字典文件。首先指定數據字典文件的位置,也就是添加一個參數UTL_FILE_DIR,該參數值為服務器中放置數據字典文件的目錄。重新啟動數據庫,使新加的參數生效,然后創建數據字典文件。

SQL>?show?user

USER?為?"SYS"

SQL>?show?parameter?utl_file_dir

NAME?????????????????????????????????TYPE????????VALUE

------------------------------------?-----------?------------------------------

utl_file_dir?????????????????????????string

SQL>?alter?system?set?utl_file_dir='/u01/app/logminer'?scope=spfile;

系統已更改。

SQL>?shutdown?immediate

數據庫已經關閉。

已經卸載數據庫。

ORACLE?例程已經關閉。

SQL>?startup

ORACLE?例程已經啟動。

Total?System?Global?Area??238530560?bytes

Fixed?Size??????????????????1335724?bytes

Variable?Size?????????????150998612?bytes

Database?Buffers???????????83886080?bytes

Redo?Buffers????????????????2310144?bytes

數據庫裝載完畢。

數據庫已經打開。

SQL>?show?parameter?utl_file_dir

NAME?????????????????????????????????TYPE????????VALUE

------------------------------------?-----------?------------------------------

utl_file_dir?????????????????????????string??????/u01/app/logminer

SQL>?exec?dbms_logmnr_d.build(?'dictionary.ora',?'/u01/app/logminer');

PL/SQL?過程已成功完成。

開始之前

SQL>?show?user

USER?為?"SYS"

SQL>?select?SUPPLEMENTAL_LOG_DATA_MIN?from?v$database;

SUPPLEME

--------

NO

SQL>?alter?database?add?supplemental?log?data;

數據庫已更改。

SQL>?select?SUPPLEMENTAL_LOG_DATA_MIN?from?v$database;

SUPPLEME

--------

YES

supplemental logging(擴充日志):在通常情況下,redo log 只記錄的進行恢復所必需的信息,但是這些信息對于我們使用redo log進行一些其他應用時是不夠的,例如在 redo log中使用rowid唯一標識一行而不是通過Primary key,如果我們在另外的數據庫分析這些日志并想重新執行某些dml時就可能會有問題,因為不同的數據庫其rowid代表的內容是不同的。在這時候就需要一些額外的信息(columns)加入redo log,這就是supplemental logging。supplemental logging分為兩個級別database_level and table_level,其中database_level級別分為兩種,minimal supplemental logging and identification key logging,其中minimal supplemental logging不會顯著增加系統的負擔,但是identification key logging對系統負擔比較大,在默認情況下oracle不會設置任何supplemental logging,但是如果要使用logminer,oracle建議至少設置minimal supplemental logging。我在使用logminer是,不設置minimal supplemental logging,從v$logmnr_contents中幾乎得不到任何信息。

2、創建要分析的日志文件列表

Oracle的重作日志分為兩種,在線(online)和離線(offline)歸檔日志文件,下面就分別來討論這兩種不同日志文件的列表創建。

(1)分析在線重作日志文件

SQL>?show?user

USER?為?"SYS"

SQL>?select?*?from?v$log;

GROUP#????THREAD#??SEQUENCE#??????BYTES??BLOCKSIZE????MEMBERS?ARC?STATUS???????????FIRST_CHANGE#?FIRST_TIME?????NEXT_CHANGE#?NEXT_TIME

----------?----------?----------?----------?----------?----------?---?----------------?-------------?--------------?------------?--------------

1??????????1?????????67???52428800????????512??????????1?YES?INACTIVE????????????????643449?14-12月-11???????????653614?15-12月-11

2??????????1?????????68???52428800????????512??????????1?NO??CURRENT?????????????????653614?15-12月-11???????2.8147E+14

3??????????1?????????66???52428800????????512??????????1?YES?INACTIVE????????????????614556?13-12月-11???????????643449?14-12月-11

SQL>?select?*?from?v$logfile;

GROUP#?STATUS??TYPE????MEMBER???????????????????????????????????????????????????????IS_

----------?-------?-------?------------------------------------------------------------?---

1?????????ONLINE??/u01/app/oracle/oradata/orcl/redo01.log??????????????????????NO

2?????????ONLINE??/u01/app/oracle/oradata/orcl/redo02.log??????????????????????NO

3?????????ONLINE??/u01/app/oracle/oradata/orcl/redo03.log??????????????????????NO

SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log',?dbms_logmnr.new);

PL/SQL?過程已成功完成。

SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log',?dbms_logmnr.addfile);

PL/SQL?過程已成功完成。

SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log',?dbms_logmnr.addfile);

PL/SQL?過程已成功完成。

刪除列表中的日志文件:exec dbms_logmnr.add_logfile('/u01/app/Oracle/oradata/orcl/redo03.log', dbms_logmnr.removefile);

關于這個日志文件列表中需要分析日志文件的個數完全由你自己決定,但這里建議最好是每次只添加一個需要分析的日志文件,在對該文件分析完畢后,再添加另外的文件。

3、使用logminer進行日志分析

(1)無限制條件

SQL>?exec?dbms_logmnr.start_logmnr(?dictfilename=>'/u01/app/logminer/dictionary.ora');

PL/SQL?過程已成功完成。

(2)有限制條件

通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數的設置(參數含義見表1),可以縮小要分析日志文件的范圍。通過設置起始時間和終止時間參數我們可以限制只分析某一時間范圍的日志。

如下面的例子,我們僅僅分析2004年9月18日的日志,:

SQL> EXECUTE dbms_logmnr.start_logmnrdictfilename => '/u01/app/logminer/dictionary.ora',starttime => to_date('2006-02-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),endtime => to_date(''2004-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));

也可以通過設置起始SCN和截至SCN來限制要分析日志的范圍:

SQL> EXECUTE dbms_logmnr.start_logmnr( dictfilename => '/u01/app/logminer/dictionary.ora', startscn => 20, endscn => 50);

參數

參數類型

默認值

含義

StartScn

數字型(Number)

0

分析重作日志中SCN≥StartScn日志文件部分

EndScn

數字型(Number)

0

分析重作日志中SCN≤EndScn日志文件部分

StartTime

日期型(Date)

1998-01-01

分析重作日志中時間戳≥StartTime的日志文件部分

EndTime

日期型(Date)

2988-01-01

分析重作日志中時間戳≤EndTime的日志文件部分

DictFileName

字符型(VARCHAR2)

0

字典文件,該文件包含一個數據庫目錄的快照。使用該文件可以使得到的分析結果是可以理解的文本形式,

4、觀察分析結果(v$logmnr_contents)

一共有四個表,詳細說明如下

V$LOGMNR_DICTIONARY-------查詢使用的數據字典文件

SQL>?select?filename?from?v$logmnr_dictionary;

FILENAME

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

/u01/app/logminer/dictionary.ora

V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的參數

SQL>?select?*?from?v$logmnr_parameters;

START_DATE?????REQUIRED_START?END_DATE????????START_SCN?REQUIRED_START_SCN????END_SCN????OPTIONS?INFO?????????????????????????????????STATUS

--------------?--------------?--------------?----------?------------------?----------?----------?--------------------------------?----------

01-1月?-11?????????614556??????????????????0??????????0??????????0???????????????????????????????????????????0

V$LOGMNR_LOGS-------查詢分析的日志文件

SQL>?select?filename?from?v$logmnr_logs;

FILENAME

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

/u01/app/oracle/oradata/orcl/redo03.log

/u01/app/oracle/oradata/orcl/redo01.log

/u01/app/oracle/oradata/orcl/redo02.log

V$LOGMNR_CONTENTS-------日志文件的內容

到現在為止,我們已經分析得到了重作日志文件中的內容。動態性能視圖v$logmnr_contents包含logminer分析得到的所有的信息。SQL> select scn,timestamp,sql_redo from v$logmnr_contents;

如果我們僅僅想知道某個用戶對于某張表的操作,可以通過下面的SQL查詢得到,該查詢可以得到用戶DB_ZGXT對表SB_DJJL所作的一切工作。

SQL>?select?operation,sql_redo,sql_undo?from?v$logmnr_contents?where?seg_owner='U1'?and?seg_name='TEST';

未選定行

operation 指的是操作 ,sql_redo 指的是實際操作,sql_undo 指的是用于取消的相反操作。

需要強調一點的是,視圖v$logmnr_contents中的分析結果僅在我們運行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在。這是因為所有的logminer存儲都在PGA內存中,所有其他的進程是看不到它的,同時隨著進程的結束,分析結果也隨之消失。最后,使用過程DBMS_LOGMNR.END_LOGMNR終止日志分析事務,此時PGA內存區域被清除,分析結果也隨之不再存在。

SQL>?exec?dbms_logmnr.end_logmnr;

PL/SQL?過程已成功完成。

SQL>?select?*?from?v$logmnr_contents;

select?*?from?v$logmnr_contents

*

第?1?行出現錯誤:

ORA-01306:?在從?v$logmnr_contents?中選擇之前必須調用?dbms_logmnr.start_logmnr()

四、其他注意事項

我們可以利用logminer日志分析工具來分析其他數據庫實例產生的重作日志文件,而不僅僅用來分析本身安裝logminer的數據庫實例的redo logs文件。使用logminer分析其他數據庫實例時,有幾點需要注意:

1. logminer必須使用被分析數據庫實例產生的字典文件,而不是安裝logminer的數據庫產生的字典文件,另外必須保證安裝logminer數據庫的字符集和被分析數據庫的字符集相同。

2. 被分析數據庫平臺必須和當前logminer所在數據庫平臺一樣,也就是說如果我們要分析的文件是由運行在UNIX平臺上的Oracle 9i產生的,那么也必須在一個運行在UNIX平臺上的Oracle實例上運行logminer,而不能在其他如Microsoft NT上運行logminer。當然兩者的硬件條件不一定要求完全一樣。

3. logminer日志分析工具僅能夠分析Oracle 8以后的產品,對于8以前的產品,該工具也無能為力。

五、結語

logminer對于數據庫管理員(DBA)來講是個功能非常強大的工具,也是在日常工作中經常要用到的一個工具,借助于該工具,可以得到大量的關于數據庫活動的信息。其中一個最重要的用途就是不用全部恢復數據庫就可以恢復數據庫的某個變化。另外,該工具還可用來監視或者審計用戶的活動,如你可以利用logminer工具察看誰曾經修改了那些數據以及這些數據在修改前的狀態。我們也可以借助于該工具分析任何Oracle 8及其以后版本產生的重作日志文件。另外該工具還有一個非常重要的特點就是可以分析其他數據庫的日志文件??傊?#xff0c;該工具對于數據庫管理員來講,是一個非常有效的工具,深刻理解及熟練掌握該工具,對于每一個數據庫管理員的實際工作是非常有幫助的。

六、例子

首先用一個用戶u1做一些dml操作:

SQL>?show?user

USER?為?"U1"

SQL>?delete?from?t1?where?id=3;

已刪除?1?行。

SQL>?insert?into?t1?values(3,'test');

已創建?1?行。

SQL>?commit;

提交完成。

SQL>?update?t1?set?value?=?'v3'?where?id?=?3;

已更新?1?行。

SQL>?commit;

提交完成。

SQL>?select?*?from?t1;

ID?VALUE

----------?----------

1?v1

2?v2

3?v3

開始分析:

SQL>?show?user

USER?為?"SYS"

SQL>?alter?system?switch?logfile;

系統已更改。

SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2011_12_15/o1_mf_1_80_7gmqb6t5_.arc',?dbms_logmnr.new);

PL/SQL?過程已成功完成。

SQL>?exec?dbms_logmnr.start_logmnr(dictfilename=>'/u01/app/logminer/dictionary.ora');

PL/SQL?過程已成功完成。

查看結果:

SQL>?select?filename?from?v$logmnr_dictionary;

FILENAME

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

/u01/app/logminer/dictionary.ora

SQL>?select?*?from?v$logmnr_parameters;

START_DATE?????REQUIRED_START?END_DATE????????START_SCN?REQUIRED_START_SCN????END_SCN????OPTIONS?INFO?????????????????????????????????STATUS

--------------?--------------?--------------?----------?------------------?----------?----------?--------------------------------?----------

01-1月?-11?????????653614??????????????????0??????????0??????????0???????????????????????????????????????????0

SQL>?select?filename?from?v$logmnr_logs;

FILENAME

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

/u01/app/oracle/oradata/orcl/redo02.log

SQL>?select?operation,sql_redo,sql_undo?from?v$logmnr_contents?where?seg_owner='U1'?and?seg_name='T1';

OPERATION???????SQL_REDO???????????????????????????????????????????SQL_UNDO

---------------?--------------------------------------------------?--------------------------------------------------

DELETE??????????delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"?insert?into?"U1"."T1"("ID","VALUE")?values?('3','v

=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAC';??????????3');

INSERT??????????insert?into?"U1"."T1"("ID","VALUE")?values?('3','t?delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"

est');??????????????????????????????????????????????=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';

UPDATE??????????update?"U1"."T1"?set?"VALUE"?=?'v3'?where?"VALUE"??update?"U1"."T1"?set?"VALUE"?=?'test'?where?"VALUE

=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';?????????"?=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';

SQL>?select?operation,sql_redo,sql_undo,seg_owner,seg_name?from?v$logmnr_contents;

OPERATION???????SQL_REDO???????????????????????????????????????????SQL_UNDO???????????????????????????????????????????SEG_OWNER???????SEG_NAME

---------------?--------------------------------------------------?--------------------------------------------------?---------------?---------------

START???????????set?transaction?read?write;

DELETE??????????delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"?insert?into?"U1"."T1"("ID","VALUE")?values?('3','v?U1??????????????T1

=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAC';??????????3');

INTERNAL

INSERT??????????insert?into?"U1"."T1"("ID","VALUE")?values?('3','t?delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"?U1??????????????T1

est');??????????????????????????????????????????????=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';

COMMIT??????????commit;

START???????????set?transaction?read?write;

UPDATE??????????update?"U1"."T1"?set?"VALUE"?=?'v3'?where?"VALUE"??update?"U1"."T1"?set?"VALUE"?=?'test'?where?"VALUE?U1??????????????T1

OPERATION???????SQL_REDO???????????????????????????????????????????SQL_UNDO???????????????????????????????????????????SEG_OWNER???????SEG_NAME

---------------?--------------------------------------------------?--------------------------------------------------?---------------?---------------

=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';?????????"?=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';

COMMIT??????????commit;

已選擇8行。

結束分析:

SQL>?exec?dbms_logmnr.end_logmnr;

PL/SQL?過程已成功完成。

總結

以上是生活随笔為你收集整理的oracle logminer java_Oracle logminer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。