32.Oracle深度学习笔记——LogMiner使用

32.Oracle深度学习笔记——LogMiner使用

 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50831854


LogMiner是Oracle数据库提供的一个工具,它用于分析重做日志和归档日志所记载的事务操作.

从8i开始提供的用于分析重做日志信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D两个package

D是字典的意思。它既能分析redo log file,也能分析归档后的archive log file。在分析日志的过程中需要使用数据字典,一般先生成数据字典文件后使用,10g版本还可以使用在线数据字典

LogMiner可以跟踪Oracle数据库的所有DML、DDL和DCL操作,从而取得执行这些操作的时间顺序、执行这些操作的用户等信息。

LogMiner的安装

创建DBMS_LOGMNR

创建DBMS_LOGMNR_D

12C直接可以安装。

LogMiner两种使用类型,一种是使用源数据库的数据字典分析DML操作,别一种是摘取LogMiner数据字典到字典文件分析DDL操作。

1.  使用源数据库

查看补充日志

默认情况下,Oracle数据库没有提供任何补充日志,从而导致默认情况下LogMiner无法支持以下特征:

  (1)索引簇、链行和迁移行;

  (2)直接路径插入;

  (3)摘取LogMiner字典到重做日志;

  (4)跟踪DDL;

  (5)生成键列的SQL_REDO和SQL_UNDO信息;

  (6)LONG和LOB数据类型。

因此,为了充分利用LogMiner提供的特征,必须激活补充日志。

查看如下:

sys@TOADDB> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROMV$DATABASE;

SUPPLEME

--------

NO

如果是YES 或者IMPLICIT则表明已经生效了,否则需要启动:

     SQL> ALTER DATABASEADD SUPPLEMENTAL LOG DATA;

          Database altered.

sys@TOADDB>SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEME

--------

YES

建立日志分析列表

查看日志路径:

sys@TOADDB> select member from v$logfile;

MEMBER

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

+DATA/toaddb/redo5.log

+DATA/toaddb/redo6.log

添加要分析的日志文件

sys@TOADDB> Executedbms_logmnr.add_logfile(logfilename=>'+DATA/toaddb/redo5.log',options=>dbms_logmnr.new);

PL/SQL procedure successfully completed.

继续添加:

sys@TOADDB> executedbms_logmnr.add_logfile(logfilename=>'+DATA/toaddb/redo6.log',options=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

移除分析日志文件

SQL> execute  dbms_logmnr.remove_logfile(logfilename=>'+DATA/toaddb/redo5.log');   

启动LogMiner

SQL> executedbms_logmnr.start_logmnr(Options=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQLprocedure successfully completed.

查看日志分析结果

SQL> selectusername,scn,timestamp,sql_redo from v$logmnr_contents

结束LogMiner

SQL> executedbms_logmnr.end_logmnr;

2.  摘取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'));

设置参数

查看参数:

sys@TOADDB> show parameter utl;

NAME                                        TYPE       VALUE

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

create_stored_outlines                string

utl_file_dir                              string

设置

alter system set utl_file_dir='/home/oracle/logminer'scope=spfile;

重启数据库

查看:

sys@TOADDB> show parameter utl;

NAME                                        TYPE       VALUE

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

create_stored_outlines                string

utl_file_dir                              string     /home/oracle/logminer

CREATE DIRECTORY utlfile AS '/home/oracle/logminer';

 

建立字典文件

sys@TOADDB> Execute dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location=>'/home/oracle/logminer');

LogMnr Dictionary File Opened

Procedure executed successfully - LogMnrDictionary Created

PL/SQL procedure successfully completed.

添加日志文件

sys@TOADDB>Executedbms_logmnr.add_logfile(logfilename=>'+DATA/toaddb/redo5.log',options=>dbms_logmnr.new);

PL/SQL procedure successfully completed.

继续添加:

sys@TOADDB> executedbms_logmnr.add_logfile(logfilename=>'+DATA/toaddb/redo6.log',options=>dbms_logmnr.addfile);

移除分析日志文件

SQL> execute  dbms_logmnr.remove_logfile(logfilename=>'+DATA/toaddb/redo6.log');   

 

启动LogMiner

 Execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logminer/dictionary.ora');

查询分析日志结果:

SQL> selectusername,scn,timestamp,sql_redo from v$logmnr_contents;

 需要特别注意的是,v$logmnr_contents内容保存了日志的内容,只在当前会话有效,

观察分析结果(v$logmnr_contents)

得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。

SELECT sql_redo FROMv$logmnr_contents; 

如果想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户LOGMINER对表EMP所作的一切工作。

SELECT sql_redo FROM v$logmnr_contents WHEREusername='TPCC' AND table_name='T'; 

例如:

通过TPCC用户进行操作如下:

tpcc@TOADDB> create table T(name varchar2(10),idnumber);

Table created.

tpcc@TOADDB> insert into t values ('ok',1);

1 row created.

tpcc@TOADDB> commit;

Commit complete.

然后查看如下:

tpcc@TOADDB> SELECT sql_redo FROM v$logmnr_contentsWHERE username='TPCC' AND table_name='T';

 

SQL_REDO

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

create table T(name varchar2(10),idnumber);

insert into"TPCC"."T"("NAME","ID") values ('ok','1');

结束LogMiner

SQL>execute dbms_logmnr.end_logmnr;

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Oracle)