oracle跟蹤使用者 (有空再研究一下)

zhouxianwang發表於2015-04-14

是誰偷了我的資料!!!!

time: 2008年5月15日 19:09:25
author: skate

前兩天發現評論表的在指定時間以前的資料都被刪除,領導要知道是誰幹的,但使用者透過應用程式

刪除也無法查到具體的人,因為資料庫只記錄和他直接相連的應用程式的資訊,無法定位到客戶端

的資訊,但像我遇到的這樣的情況,可能性大的就是個別人透過自己的pc機運算元據庫,這時我們

就要靠oracle的logminer工具來分析日誌了,下面我就來一起體驗下logminer的威力吧,呵呵

步驟

1.資料庫的supplemental的狀態調整
2.建立資料庫級別的觸發器,用以記錄客戶的登入資訊
3.安裝logminer
4.建立logminer資料字典(如果沒有建立資料自己,而是線上分析,看見的不是原始sql,而是
                       被oracle格式化的sql語句)
5.新增需要分析的日誌
6.分析日誌
7.檢視結果(v$logmnr_contents)


一。
前提準備:

最好用sys使用者,否則你要授權的

要透過logminer檢視到客戶端的資訊,我們就是檢視v$database檢視,看其supplemental_log_data_min的
狀態。
v$logmnr_contents中的客戶端的資訊。都是從v$session檢視中讀出的,要讓v$session記錄客戶端的資訊

我們就要 設定  supplemental_log_data_min 為on

YES為開啟狀態,會記錄session_info,username等資訊
NO為關閉狀態,不會記錄sesion_info,username等資訊


1. 檢視 supplemental 狀態

SYS at skate>  select name ,supplemental_log_data_min from v$database;

NAME      SUPPLEME
--------- --------
OMOVO     NO

 

2. 修改supplemental的狀態

SYS at skate>  alter database add supplemental log data;

Database altered.


3.確認supplemental的狀態

SYS at skate>  select  name,supplemental_log_data_min from v$database;

NAME      SUPPLEME
--------- --------
OMOVO     YES

1 row selected.

 

需要注意的是,這個引數資訊是記錄在控制檔案的,所以10G資料庫一旦被重建了控制檔案,那麼這個引數會再次恢復到預設狀態,也就是NO的狀態。
所以重建控制檔案後,要記得修改這個引數


二. 建立資料庫級別的觸發器

若果要讓v$logmnr_contents中的session_info記錄客戶端ip,但SESSION_INFO中我們並不能直接看到IP,
不過我們還是有辦法的,因為這個SESSION_INFO裡面的內容其實是日誌從V$SESSION檢視裡提取的,我們可以
在生產資料庫中建立一個追蹤客戶端IP地址的觸發器:

create or replace trigger on_logon_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
/


現在,我們就可以在V$SESSION檢視的CLIENT_INFO列中看到新登入的客戶端IP地址了。那麼現在就可以在
session_info 中看客戶端的ip了


三。 安裝logminer

1.

logminer實際上是由兩個pl/sql內建包(dbms_logmnr和dbms_logmnr_d)和4個v$動態效能檢視組成的.

v$logmnr_logs
v$logmnr_contents
v$logmnr_parameters

  安裝logminer首先要以sys管理員的身份執行這個pl/sql指令碼

  sql> conn /as sysdba

  sql> @/rdbms/admin/dbmslm.sql

  sql> @/rdbms/admin/dbmslmd.sql


2. 修改引數 utl_file_dir引數

這個引數是靜態引數,修改後需要資料庫,才會起作用,如果不重啟資料庫
在建立資料字典時會報錯,下面是建立的過程


SYS at skate>  alter system set utl_file_dir=/home/oracle/logminerlog scope=spfile;
alter system set utl_file_dir=/home/oracle/logminerlog scope=spfile
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified


SYS at skate>  alter system set utl_file_dir='/home/oracle/logminerlog' scope=spfile;

System altered.

SYS at skate>  exec dbms_logmnr_d.build(dictionary_filename=>'logminer',dictionary_location=>'/home/oracle/logminerlog');
BEGIN dbms_logmnr_d.build(dictionary_filename=>'logminer',dictionary_location=>'/home/oracle/logminerlog'); END;

*
ERROR at line 1:
ORA-01336: specified dictionary file cannot be opened
ORA-29280: invalid directory path
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3474
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3552
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: at line 1


SYS at skate>  host mkdir /home/oracle/logminerlog

SYS at skate>   exec dbms_logmnr_d.build(dictionary_filename=>'logminer',dictionary_location=>'/home/oracle/logminerlog');
BEGIN dbms_logmnr_d.build(dictionary_filename=>'logminer',dictionary_location=>'/home/oracle/logminerlog'); END;

*
ERROR at line 1:
ORA-01336: specified dictionary file cannot be opened
ORA-29280: invalid directory path
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3474
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3552
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: at line 1

雖然我修改了utl_file_dir,但還沒起作用,所用要重啟資料庫

重啟資料庫

SYS at skate>  shutdown immediate


SYS at skate>  startup
ORACLE instance started.

Total System Global Area  440401920 bytes
Fixed Size                  1262260 bytes
Variable Size             306187596 bytes
Database Buffers          130023424 bytes
Redo Buffers                2928640 bytes
Database mounted.
Database opened.

確認utl_file_dir引數值

SYS at omovo>  show parameter utl_file_dir

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      /home/oracle/logminerlog

四.建立資料字典

SYS at skate> exec dbms_logmnr_d.build(dictionary_filename =>'dictionary.ora',dictionary_location => '/home/oracle/logminerlog');

dictionary_filename資料庫字典的名字隨便起


4.新增分析日誌


SYS at skate> exec dbms_logmnr.add_logfile(logfilename=>'/oracle_data/omovo/redo03.log',options=>dbms_logmnr.new);
SYS at skate> exec dbms_logmnr.add_logfile(logfilename=>'/oracle_data/omovo/redo01.log',options=>dbms_logmnr.andfile);

為了減少檢視的資料量,加快分析的時間,可以把分析過的日誌從檢視中刪除

SYS at skate> exec dbms_logmnr.add_logfile(logfilename=>'/oracle_data/omovo/redo03.log',options=>dbms_logmnr.removefile);
SYS at skate> exec dbms_logmnr.add_logfile(logfilename=>'/oracle_data/omovo /redo01.log',options=>dbms_logmnr.removefile);


四、分析

exec dbms_logmnr.start_logmnr(dictfilename=>'C:/oracle/logs/dictionary.ora');   -----如果不用字典就不能看見原始sql,只能看見被oracle處理過的sql語句


exec dbms_logmnr.start_logmnr   -----只能看見被oracle處理過的sql語句,無法辨別他處理的具體內容

 

例子:
select timestamp,commit_timestamp,table_space,session#,serial#,username,session_info,sql_redo,operation,table_name,seg_name,seg_owner
from v$logmnr_contents
where seg_owner=upper('movo_new')
and   operation=upper('insert')


select session_info,sql_redo from v$logmnr_contents where upper(operation) = 'UPDATE'  and upper(sql_redo) like '%M_%'

select to_char(timestamp,'YYYY-MM-DD HH24:MI:SS') time,sql_redo from v$logmnr_contents where seg_owner='XYGDATA' and seg_name='T_ST_WEIGH' and upper(operation)='UPDATE';

 


六、結束分析
SQL> execute dbms_logmnr.end_logmnr;

--待續

七. 如何分析rman備份集中的日誌

 

--- end ----


source:http://blog.csdn.net/wyzxg/article/details/2449409


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27036311/viewspace-1575756/,如需轉載,請註明出處,否則將追究法律責任。

相關文章