日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle logminer java_Oracle logminer

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

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

1.跟蹤數(shù)據(jù)庫的變化:可以離線的跟蹤數(shù)據(jù)庫的變化,而不會影響在線系統(tǒng)的性能。

2. 回退數(shù)據(jù)庫的變化:回退特定的變化數(shù)據(jù),減少point-in-time recovery的執(zhí)行。

3.優(yōu)化和擴容計劃:可通過分析日志文件中的數(shù)據(jù)以分析數(shù)據(jù)增長模式。

二、安裝logminer

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

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

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

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

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

程序包已創(chuàng)建。

授權成功。

同義詞已創(chuàng)建。

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

程序包已創(chuàng)建。

同義詞已創(chuàng)建。

SQL>?show?user

USER?為?"SYS"

三、使用logminer工具

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

1、創(chuàng)建數(shù)據(jù)字典文件(data-dictionary)

前面已經談到,logminer工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態(tài)性能視圖(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動logminer時創(chuàng)建)組成。在使用logminer工具分析redo log文件之前,必須使用DBMS_LOGMNR_D 包將數(shù)據(jù)字典導出為一個文本文件。該字典文件是可選的,但是如果沒有它,logminer解釋出來的語句中關于數(shù)據(jù)字典中的部分(如表名、列名等)和數(shù)值都將是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'));

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

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;

系統(tǒng)已更改。

SQL>?shutdown?immediate

數(shù)據(jù)庫已經關閉。

已經卸載數(shù)據(jù)庫。

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

數(shù)據(jù)庫裝載完畢。

數(shù)據(jù)庫已經打開。

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;

數(shù)據(jù)庫已更改。

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

SUPPLEME

--------

YES

supplemental logging(擴充日志):在通常情況下,redo log 只記錄的進行恢復所必需的信息,但是這些信息對于我們使用redo log進行一些其他應用時是不夠的,例如在 redo log中使用rowid唯一標識一行而不是通過Primary key,如果我們在另外的數(shù)據(jù)庫分析這些日志并想重新執(zhí)行某些dml時就可能會有問題,因為不同的數(shù)據(jù)庫其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不會顯著增加系統(tǒng)的負擔,但是identification key logging對系統(tǒng)負擔比較大,在默認情況下oracle不會設置任何supplemental logging,但是如果要使用logminer,oracle建議至少設置minimal supplemental logging。我在使用logminer是,不設置minimal supplemental logging,從v$logmnr_contents中幾乎得不到任何信息。

2、創(chuàng)建要分析的日志文件列表

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

(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);

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

3、使用logminer進行日志分析

(1)無限制條件

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

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

(2)有限制條件

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

如下面的例子,我們僅僅分析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);

參數(shù)

參數(shù)類型

默認值

含義

StartScn

數(shù)字型(Number)

0

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

EndScn

數(shù)字型(Number)

0

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

StartTime

日期型(Date)

1998-01-01

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

EndTime

日期型(Date)

2988-01-01

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

DictFileName

字符型(VARCHAR2)

0

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

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

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

V$LOGMNR_DICTIONARY-------查詢使用的數(shù)據(jù)字典文件

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

FILENAME

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

/u01/app/logminer/dictionary.ora

V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的參數(shù)

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-------日志文件的內容

到現(xiàn)在為止,我們已經分析得到了重作日志文件中的內容。動態(tài)性能視圖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內存區(qū)域被清除,分析結果也隨之不再存在。

SQL>?exec?dbms_logmnr.end_logmnr;

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

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

select?*?from?v$logmnr_contents

*

第?1?行出現(xiàn)錯誤:

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

四、其他注意事項

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

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

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

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

五、結語

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

六、例子

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

SQL>?show?user

USER?為?"U1"

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

已刪除?1?行。

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

已創(chuàng)建?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;

系統(tǒng)已更改。

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的全部內容,希望文章能夠幫你解決所遇到的問題。

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