A-A+
logmnr常见使用方法
logmnr常见使用方法,以前的一个测试例子。
--数据库版本
SQL> select * from gv$version;
INST_ID BANNER
---------- ----------------------------------------------------------------
1 Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Prod
1 PL/SQL Release 10.2.0.5.0 - Production
1 CORE 10.2.0.5.0 Production
1 TNS for Linux: Version 10.2.0.5.0 - Production
1 NLSRTL Version 10.2.0.5.0 - Production
2 Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Prod
2 PL/SQL Release 10.2.0.5.0 - Production
2 CORE 10.2.0.5.0 Production
2 TNS for Linux: Version 10.2.0.5.0 - Production
2 NLSRTL Version 10.2.0.5.0 - Production
10 rows selected.
--准备配置:
--打开数据库补充日志功能
SQL> select LOG_MODE from v$database; LOG_MODE ------------ ARCHIVELOG SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database; SUPPLEME SUP SUP -------- --- --- NO NO NO SQL> alter database add supplemental log data; <<如果不开启supplemental log,则在查询日志分析表的时候,username列将为空;以及发生行迁移的redo无法追踪。 Database altered. SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database; SUPPLEME SUP SUP -------- --- --- YES NO NO
--设置会话时间格式
SQL> alter session set nls_date_format ='yyyy/mm/dd hh24:mi:ss'; Session altered. SQL> select sysdate from dual; SYSDATE ------------------- 2012/09/18 10:35:13
--创建测试数据
SQL> create tablespace test datafile '+DATA/racdb/test01.dbf' size 2m;
Tablespace created.
SQL> create user test identified by test default tablespace test quota unlimited on test;
User created.
SQL> grant resource,connect to test;
Grant succeeded.
SQL> conn test/test;
Connected.
SQL> create table test(id number,name varchar2(10));
Table created.
SQL> select a.group#,thread#,member,b.status,archived from v$logfile a,v$log b where a.group#=b.group# order by 1;
GROUP# THREAD# MEMBER STATUS ARC
---------- ---------- ------------------------- ---------------- ---
1 1 +DATA/racdb/redo01.log CURRENT NO
2 1 +DATA/racdb/redo02.log INACTIVE YES
3 2 +DATA/racdb/redo03.log INACTIVE YES
4 2 +DATA/racdb/redo04.log CURRENT NO
SQL> conn test/test
Connected.
SQL> insert into test values(1,'yallonking');
1 row created.
SQL> conn /as sysdba
Connected.
SQL> create user yallonking identified by yallonking default tablespace test quota unlimited on test;
User created.
SQL> grant connect,resource to yallonking;
Grant succeeded.
SQL> conn yallonking/yallonking
Connected.
SQL> create table yallonking (id number,name varchar2(10));
Table created.
SQL> insert into yallonking values (2,'test');
1 row created.
SQL> commit;
Commit complete.
SQL> conn test/test
Connected.
SQL> alter table test modify name varchar2(20);
Table altered.
SQL> update test set id=3 where id=1;
1 row updated.
SQL> delete from test where id=3;
1 row deleted.
SQL> commit;
Commit complete.
SQL> insert into test values (4,'test')
2 ;
1 row created.
SQL> rollback;
Rollback complete.
SQL> conn /as sysdba
Connected.
SQL> alter system switch logfile;
System altered.
SQL> alter system checkpoint;
System altered.
SQL> select a.group#,thread#,member,b.status,archived from v$logfile a,v$log b where a.group#=b.group# order by 1;
GROUP# THREAD# MEMBER STATUS ARC
---------- ---------- ------------------------- ---------------- ---
1 1 +DATA/racdb/redo01.log INACTIVE YES
2 1 +DATA/racdb/redo02.log CURRENT NO
3 2 +DATA/racdb/redo03.log INACTIVE YES
4 2 +DATA/racdb/redo04.log CURRENT NO
示例一:查看最后一个归档日志中所有的操作信息
注:此logmnr查询视图中含有未提交事务,且输出按时间顺序输出
--确定归档日志
SQL> select name from v$archived_log where first_time=(select max(first_time) from v$archived_log); NAME -------------------------------------------------------------------------------- +DATA/racdb/archivelog/2012_09_18/thread_1_seq_5.278.794314659
--将日志添加到logmnr中
SQL> execute dbms_logmnr.add_logfile(logfilename=>'+DATA/racdb/archivelog/2012_09_18/thread_1_seq_5.278.794314659',options=>dbms_logmnr.new); PL/SQL procedure successfully completed.
--使用logmnr进行分析
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog + dbms_logmnr.print_pretty_sql); PL/SQL procedure successfully completed.
--查询logmnr视图
select username,(xidusn||'.'||xidslt||'.'||xidsqn)as xid,sql_redo,sql_undo from v$logmnr_contents where username in ('TEST','YALLONKING');
--结束logmnr
SQL> execute dbms_logmnr.end_logmnr(); PL/SQL procedure successfully completed.
示例二:查看最后一个归档日志中所有的操作信息
注:此logmnr查询视图中只含有已提交事务,且输出按时间顺序按用户分组输出
--确定归档日志
SQL> select name from v$archived_log where first_time=(select max(first_time) from v$archived_log); NAME -------------------------------------------------------------------------------- +DATA/racdb/archivelog/2012_09_18/thread_1_seq_5.278.794314659
--将日志添加到logmnr中
SQL> execute dbms_logmnr.add_logfile(logfilename=>'+DATA/racdb/archivelog/2012_09_18/thread_1_seq_5.278.794314659',options=>dbms_logmnr.new); PL/SQL procedure successfully completed.
--使用logmnr进行分析
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog + dbms_logmnr.committed_data_only + dbms_logmnr.print_pretty_sql); PL/SQL procedure successfully completed.
--查询logmnr视图
select username,(xidusn||'.'||xidslt||'.'||xidsqn)as xid,sql_redo,sql_undo from v$logmnr_contents where username in ('TEST','YALLONKING');
--结束logmnr
SQL> execute dbms_logmnr.end_logmnr(); PL/SQL procedure successfully completed.