LogMiner

 用LogMiner分析重做日志或归档日志2007-08-02 15:56
Oracle LogMiner是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,
使用该工具可以轻松获得Oracle重作日志文件(归档日志文件)中的具体内容。
LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图(Oracle8i内置包的一部分)组成,
它作为Oracle数据库的一部分来发布,是8i产品提供的一个完全免费的工具。当然logminer是占用系统资源的,
所以不要在系统繁忙期在主机上操作。

1. 安装LogMiner

LogMiner工具实际上是由两个PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四个V$动态性能视图(
视图是在利用过程DBMS_LOGMNR.START_LOGMNR启动LogMiner时创建)组成。安装LogMiner工具,要运行两个脚本,这两个脚本必须均以SYS管理员身份运行。

$sqlplus '/as sysdba'
SQL> @?/rdbms/admin/dbmslm.sql         --用来创建DBMS_LOGMNR包,该包用来分析日志文件。
SQL> @?/rdbms/admin/dbmslmd.sql         --用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

2. 创建LogMiner所需的数据字典文件

该字典文件是可选的,但是如果没有它,LogMiner解释出来的语句中关于数据字典中的部分(如表名、列名等)
和数值都将是16进制的形式,我们是无法直接理解的。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,
这时就需要重新创建该字典文件。
首先我们需要修改初始化参数,添加UTL_FILE_DIR=/opt/oracle/log,重新启动数据库使新加的参数生效,然后创建数据字典文件。

SQL> set lines 10000
SQL> show parameter utl_file_dir
NAME                                  TYPE                              VALUE
------------------------------------ -------------------------------- ------------------------------
utl_file_dir                          string                            /opt/oracle/log

测试数据,建表tab_test并插入数据:

$sqlplus wacos/oss
SQL> create table tab_test (col varchar2(20));
SQL> insert into tab_test values ('logminer');
SQL> commit;
SQL> alter system switch logfile;   --切换日志产生归档文件

检查归档文件路径和名称:

$sqlplus '/as sysdba'
SQL> archive log list
Database log mode               Archive Mode
Automatic archival              Enabled
Archive destination             /opt/oracle/db01/app/oracle/product/9.2.0/dbs/arch
Oldest online log sequence      20650
Next log sequence to archive    20652
Current log sequence            20652
$ cd /opt/oracle/db01/app/oracle/product/9.2.0/dbs/arch
$ ls -l *20651*
-rw-r-----    1 oracle    dba       1236480 Aug   2 15:16 1_20651.dbf
该归档文件是 /opt/oracle/db01/app/oracle/product/9.2.0/dbs/arch/1_20651.dbf

然后创建数据字典文件:(需要一些时间)
SQL> exec sys.dbms_logmnr_d.build(dictionary_filename=>'test.dat',dictionary_location=>'/opt/oracle/log');

创建数据字典的目:让LogMiner引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部
的16进制。
数据字典文件是一个文本文件,使用包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'));

3. 添加日志文件

Oracle的重作日志分为两种,在线(online)和离线(offline)归档日志文件。关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,
但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。和添加日志分析列表相对应,
使用过程 'dbms_logmnr.removefile' 也可以从列表中移去一个日志文件。

$sqlplus '/as sysdba'
SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/db01/app/oracle/product/9.2.0/dbs/arch/1_20651.dbf', Options=>dbms_logmnr.new);

可以添加另一个日志文件:
SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/db01/app/oracle/product/9.2.0/dbs/arch/1_20652.dbf',Options=>dbms_logmnr.addfile);

也可以移出日志文件:
SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/db01/app/oracle/product/9.2.0/dbs/arch/1_20652.dbf', Options=>dbms_logmnr.removefile);

4. 分析日志

--无限制条件:
SQL> exec dbms_logmnr.start_logmnr( DictFileName => '/opt/oracle/log/test.dat');


--限制起始时间和终止时间参数:(注意时间参数要合理,否则会出ORA-01291错)
SQL> exec dbms_logmnr.start_logmnr( DictFileName => '/opt/oracle/log/test.dat',
StartTime => to_date('2007-8-2 15:10:00','YYYY-MM-DD HH24:MI:SS'), EndTime => to_date('2007-8-2 15:16:59','YYYY-MM-DD HH24:MI:SS'));

--限制起始SCN和截止SCN:
SQL> exec dbms_logmnr.start_logmnr(DictFileName => '/opt/oracle/log/test.dat',StartScn => 4140835823,EndScn => 4140836247);

dbms_logmnr.start_logmnr函数的原型为:
PROCEDURE start_logmnr(
      startScn         IN   NUMBER default 0 ,
      endScn         IN   NUMBER default 0,
      startTime        IN   DATE default '',
      endTime          IN   DATE default '',
      DictFileName      IN   VARCHAR2 default '',
      Options         IN   BINARY_INTEGER default 0);
分析后通过dbms_logmnr.end_logmnr语句释放内存。

5. 查看分析结果

到现在为止,动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。
这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
SQL> select operation,sql_redo,sql_undo from v$logmnr_contents where rownum < 2;

查询后会自动断开session?如果提示ORA-01306错误,可能是另开一个session查看得。
因为仅允许执行了分析的SESSION可以查看信息,如果需要其他SESSION查看可将其内容存在其他表中。通过ctas一下解决了:
SQL> drop table logmnr_contents;
SQL> create table logmnr_contents as
select scn,timestamp,commit_timestamp,seg_owner,seg_name,seg_type_name,table_space,
         row_id,session_info,username,operation,sql_redo,sql_undo
from v$logmnr_contents
where operation IN ('DDL','UPDATE','DELETE','INSERT','DIRECT INSERT')
and seg_owner not in ('SYS','SYSTEM');

然后用其它用户和工具,比如使用TOAD去查询logmnr_contents表数据:
SQL> conn wacos/oss
SQL> select * from sys.logmnr_contents where seg_name = 'TAB_TEST';

--追踪数据库结构变化情况,即DDL操作:
SQL> select timestamp,sql_redo from sys.logmnr_contents where upper(sql_redo) like '%CREATE%';

--追踪更新表的客户端程序和用户相关信息:
SQL> select session_info,sql_redo from sys.logmnr_contents where upper(operation) = 'UPDATE'   and upper(sql_redo) like '%service%';

最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,即使你不用end_logmnr,在你的SESSION结束后,v$logmnr_contents也不再存在:
SQL> exec DBMS_LOGMNR.END_LOGMNR;

6. v$logmnr_contents主要字段解释

SCN 特定数据变化的系统更改号,可用 select dbms_flashback.get_system_change_number from dual; 获得当前改变号。
TIMESTAMP 数据改变发生的时间
COMMIT_TIMESTAMP 数据改变提交的时间
SEG_OWNER 段的所有者名称
SEG_NAME 数据发生改变的段名称
SEG_TYPE 数据发生改变的段类型
SEG_TYPE_NAME 数据发生改变的段类型名称
TABLE_SPACE 变化段的表空间
ROW_ID 特定数据变化行的ID
SESSION_INFO 数据发生变化时用户进程信息,如login_username=WACOS client_info= OS_username=oracle Machine_name=ITDB
OS_terminal= OS_process_id=2782 OS_program name=sqlplus@ITDB (TNS V1-V3)
OPERATION 重做记录中记录的操作(如INSERT)
SQL_REDO 可以为重做记录重做指定行变化的SQL语句
SQL_UNDO 可以为重做记录回退或恢复指定行变化的SQL语句

 

你可能感兴趣的:(oracle,sql,数据库,session,insert,Dictionary)