总的说来,LogMiner工具的主要用途有:
l跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。
l回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。
l优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式
如果要使用LOGMNR分析日志,我们需要安装LogMiner工具。下面分享一下我安装LogMiner工具并使用LOGMNR的DICT_FROM_ONLINE_CATALOG分析REDO日志的过程。
0 环境准备
我们在Oracle11g进行操作。
点击(此处)折叠或打开
1 添加补充日志
如果我们需要捕获DML,就必须确保数据库的补充日志功能是打开的。(前面几天的测试中,由于没有添加该日志一直都没有成功,所以这一步尤为关键。)
首先我们通过查询v$database动态视图来获取补充日志的相关信息,如果数据库没有打开补充日志功能,我们可以通过执行alter database add supplemental log…语句来添加补充日志。
点击(此处)折叠或打开
-
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
-
-
-
SUP SUP
-
-
--- ---
-
-
-
NO NO
-
-
-
SQL>
-
-
SQL> alter database add supplemental log data(primary key,unique index) columns;
-
-
-
Database altered.
-
-
SQL>
-
-
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
-
-
-
SUP SUP
-
-
--- ---
-
-
-
YES YES
-
-
- SQL>
2 安装LogMiner工具
要安装LogMiner工具,必须首先要运行下面三个脚本,并且这三个脚本必须以SYS用户身份运行。
l $ORACLE_HOME/rdbms/admin/dbmslm.sql
l $ORACLE_HOME/rdbms/admin/dbmslmd.sql
l $ORACLE_HOME/rdbms/admin/dbmslms.sql
其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件;第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件;第三个脚本用来创建dbms_logmnr_session包并授权。
点击(此处)折叠或打开
-
SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql
-
-
-
Package created.
-
-
-
-
Grant succeeded.
-
-
-
-
Synonym created.
-
-
-
SQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
-
-
-
Package created.
-
-
-
-
Synonym created.
-
-
-
SQL> @$ORACLE_HOME/rdbms/admin/dbmslms.sql
-
-
-
Package created.
-
-
-
No errors.
-
-
-
Grant succeeded.
-
-
- SQL>
3 分析redo日志
首先我们需要执行一些DDL或DML操作作为分析素材,然后使用LOGMNR工具进行挖掘、分析。
3.1 执行DDL或DML操作
首先创建一个hoegh表,插入3条数据并提交;然后,删除一条记录,并提交。
点击(此处)折叠或打开
3.2 查看redo日志路径
通过查询v$log和v$logfile两个动态视图来获取当前状态为Current的redo日志文件路径。
点击(此处)折叠或打开
-
SQL> select * from v$log;
-
-
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
-
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
-
-
1 1 7 52428800 512 1 NO INACTIVE 898138 14-OCT-14 918641 07-AUG-15
-
2 1 8 52428800 512 1 NO ACTIVE 918641 07-AUG-15 919289 07-AUG-15
-
3 1 9 52428800 512 1 NO CURRENT 919289 07-AUG-15 2.8147E+14
-
-
SQL>
-
SQL> select group#,member from v$logfile;
-
-
GROUP# MEMBER
-
---------- ----------------------------------------------------------------------------------------------------
-
-
3 /u01/app/oracle/oradata/PROD1/redo03.log
-
2 /u01/app/oracle/oradata/PROD1/redo02.log
-
1 /u01/app/oracle/oradata/PROD1/redo01.log
-
- SQL>
3.3 添加redo日志
Oracle的LogMiner可以分析在线(online)和归档(offline)两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.NEW参数,后面文件使用dbms_logmnr.ADDFILE参数。
点击(此处)折叠或打开
-
SQL>
-
-
SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/PROD1/redo03.log',options=>dbms_logmnr.new);
-
-
-
PL/SQL procedure successfully completed.
-
-
- SQL>
3.4 开启LOGMNR挖掘日志
点击(此处)折叠或打开
-
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
-
-
-
PL/SQL procedure successfully completed.
-
-
-
SQL>
点击(此处)折叠或打开
-
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
-
-
-
PL/SQL procedure successfully completed.
-
-
- SQL>
3.5 查询挖掘结果
到现在为止,我们已经分析得到了redo日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。这个信息量可能很大,因此我们可以通过限定用户名和表名来查询特定表的操作。
3.5.1 查询redo信息
点击(此处)折叠或打开
-
SQL> select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where username='SCOTT' and table_name='HOEGH';
-
-
-
TO_CHAR(TIMESTAMP,' SQL_REDO
-
-
------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------
-
-
2015-08-07 13:44:15 create table hoegh(id number,name varchar2(20));
-
-
2015-08-07 13:44:26 insert into "SCOTT"."HOEGH"("ID","NAME") values ('1','hoegh');
-
-
2015-08-07 13:44:39 insert into "SCOTT"."HOEGH"("ID","NAME") values ('10','hoegh');
-
-
2015-08-07 13:44:45 insert into "SCOTT"."HOEGH"("ID","NAME") values ('100','hoegh');
-
- 2015-08-07 13:44:54 delete from "SCOTT"."HOEGH" where "ID" = '10' and "NAME" = 'hoegh' and ROWID = 'AAASwNAAEAAAAIOAAB
3.5.2 查询undo信息
点击(此处)折叠或打开
-
SQL> select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_undo from v$logmnr_contents where username='SCOTT' and table_name='HOEGH';
-
-
-
TO_CHAR(TIMESTAMP,' SQL_UNDO
-
-
------------------- ----------------------------------------------------------------------------------------------------
-
-
2015-08-07 13:44:15
-
-
2015-08-07 13:44:26 delete from "SCOTT"."HOEGH" where "ID" = '1' and "NAME" = 'hoegh' and ROWID = 'AAASwNAAEAAAAIOAAA';
-
-
2015-08-07 13:44:39 delete from "SCOTT"."HOEGH" where "ID" = '10' and "NAME" = 'hoegh' and ROWID = 'AAASwNAAEAAAAIOAAB';
-
-
2015-08-07 13:44:45 delete from "SCOTT"."HOEGH" where "ID" = '100' and "NAME" = 'hoegh' and ROWID = 'AAASwNAAEAAAAIOAAC';
-
- 2015-08-07 13:44:54 insert into "SCOTT"."HOEGH"("ID","NAME") values ('10','hoegh
3.6 停止LOGMNR挖掘日志
需要注意的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命周期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
最后,当我们完成redo日志的分析工作以后,可以使用过程DBMS_LOGMNR.END_LOGMNR来终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
点击(此处)折叠或打开
-
SQL>
-
-
SQL> exec dbms_logmnr.end_logmnr();
-
-
-
PL/SQL procedure successfully completed.
-
-
- SQL>