参考自:https://blog.csdn.net/yes_is_ok/article/details/79296614sql
原文转自:http://blog.itpub.net/26736162/viewspace-2141148/数据库
官方文档地址:https://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL1559oracle
logminer使用注意:工具
LogMiner工具既能够用来分析在线日志,也能够用来分析离线日志文件,既能够分析自己本身数据库的重做日志文件,也能够用来分析其它数据库的重做日志文件。性能
当分析其它数据库的重做日志文件时,须要注意的是,LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件。ui
另外,必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。源数据库(Source Database)平台必须和分析数据库(Mining Database)平台同样。spa
logminer的使用:操作系统
1、安装logminer工具.net
在默认状况下,Oracle已经安装了LogMiner工具。如果没有安装,则能够运行下面两个脚本:日志
$ORACLE_HOME/rdbms/admin/dbmslm.sql $ORACLE_HOME/rdbms/admin/dbmslmd.sql
这两个脚本必须均以SYS用户身份运行。
其中第一个脚本用来建立DBMS_LOGMNR包,该包用来分析日志文件。
第二个脚本用来建立DBMS_LOGMNR_D包,该包用来建立数据字典文件。
若要使普通用户具备日志挖掘的权限,则能够执行以下的SQL进行赋权:
GRANT EXECUTE ON DBMS_LOGMNR TO LOGMINER_TEST;
脚本执行完毕后,LogMiner包含两个PL/SQL包和几个视图:
一、DBMS_LOGMNR_D包,包括一个用于提取数据字典信息的过程,即DBMS_LOGMNR_D.BUILD()过程,还包含一个重建LogMiner表的过程,DBMS_LOGMNR_D.SET_TABLESPACE。在默认状况下,LogMiner的表是建在SYSTEM表空间下的。
二、DBMS_LOGMNR包,它有3个存储过程:
ADD_LOGFILE(NAME VARCHAR2,OPTIONS NUMBER) 用来添加或删除用于分析的日志文件 START_LOGMNR(START_SCN NUMBER,END_SCN NUMBER,START_TIME NUMBER,END_TIME NUMBER,DICTFILENAME VARCHAR2,OPTIONS NUMBER) 用来开启日志分析,同时肯定分析的时间或SCN窗口以及确认是否使用提取出来的数据字典信息 END_LOGMNR()存储过程用来终止分析会话,它将回收LogMiner所占用的内存
与LogMiner相关的数据字典视图:
V$LOGHIST:显示历史日志文件的一些信息
V$LOGMNR_DICTIONARY:由于LOGMINER能够有多个字典文件,因此该视图显示字典文件信息
V$LOGMNR_PARAMETERS:显示LOGMINER的参数
V$LOGMNR_LOGS:显示用于分析的日志列表信息
V$LOGMNR_CONTENTS:LOGMINER结果
2、LogMiner的数据字典
为了彻底地转换Redo Log中的内容,LogMiner须要访问一个数据库字典。
LogMiner使用该字典将Oracle内部的对象标识符和数据类型转换为对象名称和外部的数据格式。没有字典,LogMiner将使用16进制字符显示内部对象ID。
例如,对于以下的SQL语句:
INSERT INTO emp(name, salary) VALUES ('John Doe', 50000);
在没有数据字典的状况下,LogMiner将显示为:
INSERT INTO Object#2581(col#1, col#2) VALUES (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
LogMiner提供了3种提取字典文件的方式:
① 将字典文件提取为一个Flat File(平面文件或中间接口文件)
② 将字典文件提取为Redo Log
③ 使用Online Catalog(联机日志)
下面分别介绍这3种方式:
① 将字典文件提取为一个Flat File(平面文件或中间接口文件)
为了将数据库字典信息提取为Flat File,须要使用带有STORE_IN_FLAT_FILE参数的DBMS_LOGMNR_D.BUILD程序。
DBMS_LOGMNR_D.BUILD程序须要访问一个可以放置字典文件的目录。由于PL/SQL 程序一般不能直接访问用户目录,必须手动指定一个由DBMS_LOGMNR_D.BUILD程序使用的目录。
为了指定该目录,必须修改初始化文件中的UTL_FILE_DIR参数:
ALTER SYSTEM SET UTL_FILE_DIR ='/home/oracle' SCOPE=SPFILE;
而后从新启动数据库。确保在建立Flat File文件的过程当中,不能有DDL操做被执行。
在建立Flat File文件时,数据库必须处于OPEN状态,而后执行DMBS_LOGMNR_D.BUILD程序:
EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/home/oracle');
脚本执行完成后会在/home/oracle下生成一个dictionary.ora的文本文件。该文件中包含一系列的建表语句和插入语句。
② 将字典文件提取为Redo Log
为了将字典文件提取为Redo日志,数据库必须处于OPEN状态,而且处于归档模式。
将字典提取为Redo日志的过程当中,数据库系统不能有DDL语句被执行。
为了将字典提取为Redo日志,须要使用带有STORE_IN_REDO_FILES参数的DBMS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
须要注意的是,将字典文件提取为Redo文件的时候须要开启附加日志,以下所示:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
在这些Redo日志被归档以后,能够经过查询V$ARCHIVED_LOG视图来查询:
SELECT *
FROM V$ARCHIVED_LOG A
WHERE A.NAME IS NOT NULL
AND (A.DICTIONARY_BEGIN = 'YES' OR A.DICTIONARY_END = 'YES');
若是将字典信息提取为Redo文件,那么在使用DBMD_LOGMNR.ADD_LOGFILE指定所须要分析的日志文件时,须要将这些包含字典信息的Redo文件也添加进去。同时在使用START_LOGMNR开始分析时,须要指定DICT_FROM_REDO_LOGS的参数。
③ 使用Online Catalog(联机日志)
为了使LogMiner直接使用数据库当前使用的字典,在开始LogMiner时能够指定将联机目录做为字典源:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
使用联机目录,意味着不须要再提取字典文件,是开始分析日志的最快的方式。除了能够分析联机Redo日志外,还能够在和产生归档日志文件相同的系统上分析归档日志文件。然而,记住联机目录只能重建应用于表的最新版本上的SQL语句。一旦表被修改,联机目录就没法反映出表以前的版本。这就意味着LogMiner不能重建执行于表的旧版本上的SQL语句。
(三)跟踪DDL语句
当LogMiner被启动时,它会自动建立本身的内部字典。若是源字典是Flat File字典或Redo日志中的字典,则可使用DDL_DICT_TRACKING参数来跟踪DDL语句。DDL跟踪默认是关闭的。为了打开这一功能,能够在启动LogMiner时使用DDL_DICT_TRACKING参数:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DDL_DICT_TRACKING);
当使用DDL_DICT_TRACKING时,须要注意以下几点:
v 当使用联机目录(Online catalog)时,也就是当使用DICT_FROM_ONLINE_CATALOG参数时,是不能使用DDL_DICT_TRACKING选项的。
v 使用DDL_DICT_TRACKING时,要求数据库处于OPEN状态。
v 尽可能为LogMiner的表提供一个单独的表空间。默认状况下LogMiner的表是建立在SYSTEM表空间中的。使用DBMS_LOGMNR_D.SET_TABLESPACE能够在一个单独的表空间中重建这些LogMiner的表:SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');。
(四)过滤LogMiner返回的数据
可使用COMMITTED_DATA_ONLY参数来只显示那些被提交的事务:
SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.COMMITTED_DATA_ONLY);
当使用这一参数时,LogMiner将全部的DML操做按照事务的关系组合在一块儿。这些事务按照它们被提交的顺序显示出来。
可使用SKIP_CORRUPTION参数来忽略redo日志中的全部错误:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.SKIP_CORRUPTION);
可使用使用STARTTIME和ENDTIME参数按照时间过滤数据,还可使用STARTSCN和ENDSCN参数按照SCN(System Change Number)来过滤数据。
BEGIN
DBMS_LOGMNR.START_LOGMNR(STARTSCN => 23573690,ENDSCN => 23632671,OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);
END;
/
BEGIN
DBMS_LOGMNR.START_LOGMNR(STARTTIME => '2015-06-03 11:10:12',ENDTIME => '2015-06-03 11:13:06',OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);
END;
/
(五)典型的LogMiner步骤
一个典型的LogMiner的操做包含以下步骤:
一、进行初始化设置:开启附加日志,设置LogMiner的表空间,设置UTL_FILE_DIR参数的值;
二、提取一个字典:将字典文件提取为Flat File或Redo日志,或者直接使用Online Catalog;
三、指定须要分析的Redo日志文件:利用DBMS_LOGMNR.ADD_LOGFILE来添加日志;
四、开始LogMiner:执行DBMS_LOGMNR.START_LOGMNR来启动LogMiner;
五、查询V$LOGMNR_CONTENTS视图;
六、结束LogMiner:经过执行EXECUTE DBMS_LOGMNR.END_LOGMNR来结束分析。
在使用LogMiner以前须要确认Oracle是否带有进行LogMiner分析包,通常来讲Windows操做系统Oracle10g以上都默认包含。若是不能确认,能够DBA身份登陆系统,查看系统中是否存在运行LogMiner所须要的dbms_logmnr、dbms_logmnr_d包,若是没有须要安装LogMiner工具,必须首先要运行下面这样两个脚本:
一、$ORACLE_HOME/rdbms/admin/dbmslm.sql
二、$ORACLE_HOME/rdbms/admin/dbmslmd.sql.
这两个脚本必须均以DBA用户身份运行。其中第一个脚本用来建立DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来建立DBMS_LOGMNR_D包,该包用来建立数据字典文件。
建立完毕后将包括以下过程和视图:
类型 |
过程名 |
用途 |
过程 |
Dbms_logmnr_d.build |
建立一个数据字典文件 |
过程 |
Dbms_logmnr.add_logfile |
在类表中增长日志文件以供分析 |
过程 |
Dbms_logmnr.start_logmnr |
使用一个可选的字典文件和前面肯定要分析日志文件来启动LogMiner |
过程 |
Dbms_logmnr.end_logmnr |
中止LogMiner分析 |
视图 |
V$logmnr_dictionary |
显示用来决定对象ID名称的字典文件的信息 |
视图 |
V$logmnr_logs |
在LogMiner启动时显示分析的日志列表 |
视图 |
V$logmnr_contents |
LogMiner工具其实是由两个新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOGMNR启动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'));
建立数据字典的目的就是让LogMiner引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部的16进制。数据字典文件是一个文本文件,使用包DBMS_LOGMNR_D来建立。若是咱们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就须要从新建立该字典文件。另一种状况是在分析另一个数据库文件的重做日志时,也必需要从新生成一遍被分析数据库的数据字典文件。
建立数据字典文件以前须要配置LogMiner文件夹:
CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR';
alter system set utl_file_dir='D:\oracle\oradata\practice\LOGMNR' scope=spfile;
建立字典文件须要以DBA用户登陆,建立到上面配置好的LogMiner文件夹中:
CONN LOGMINER/ LOGMINER@PRACTICE AS SYSDBA
XECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');
Oracle的LogMiner能够分析在线(online)和归档(offline)两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.NEW参数,后面文件使用dbms_logmnr.ADDFILE参数。
一、建立列表
BEGIN dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW);
END; /
二、添加其余日志文件到列表
BEGIN dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE);
dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00003_0817639922.001',options=>dbms_logmnr.ADDFILE);
END;
/
Oracle的LogMiner分析时分为无限制条件和限制条件两种,无限制条件中分析全部加入到分析列表日志文件,限制条件根据限制条件分析指定范围日志文件。
一、无限制条件
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
二、有限制条件
经过对过程DBMS_ LOGMNR.START_LOGMNR中几个不一样参数的设置(参数含义见表1),能够缩小要分析日志文件的范围。经过设置起始时间和终止时间参数咱们能够限制只分析某一时间范围的日志。
参数 |
参数类型 |
默认值 |
含义 |
StartScn |
数字型 |
0 |
分析重做日志中SCN≥StartScn日志文件部分 |
EndScn |
数字型 |
0 |
分析重做日志中SCN≤EndScn日志文件部分 |
StartTime |
日期型 |
1998-01-01 |
分析重做日志中时间戳≥StartTime的日志文件部分 |
EndTime |
日期型 |
2988-01-01 |
分析重做日志中时间戳≤EndTime的日志文件部分 |
DictFileName |
字符型 |
|
字典文件该文件包含一个数据库目录的快照。 |
以下面的例子,咱们仅仅分析2013年6月8日的日志,:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName => dictfilename=>'D:\..\practice\LOGMNR\dictionary.ora',
StartTime =>to_date('2013-6-8 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime =>to_date(''2013-6-8 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也能够经过设置起始SCN和截至SCN来限制要分析日志的范围:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName =>'D:\..\practice\LOGMNR\dictionary.ora',
StartScn =>20,
EndScn =>50);
到如今为止,咱们已经分析获得了重做日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析获得的全部的信息。
SELECT sql_redo FROM v$logmnr_contents;
若是咱们仅仅想知道某个用户对于某张表的操做,能够经过下面的SQL查询获得,该查询能够获得用户LOGMINER对表EMP所做的一切工做。
SELECT sql_redo FROM v$logmnr_contents WHERE username='LOGMINER' AND tablename='EMP';
序号 |
名称 |
含义 |
1 |
SCN |
特定数据变化的系统更改号 |
2 |
TIMESTAM |
数据改变发生的时间 |
3 |
COMMIT_TIMESTAMP |
数据改变提交的时间 |
4 |
SEG_OWNER |
数据发生改变的段名称 |
5 |
SEG_NAME |
段的全部者名称 |
6 |
SEG_TYPE |
数据发生改变的段类型 |
7 |
SEG_TYPE_NAME |
数据发生改变的段类型名称 |
8 |
TABLE_SPACE |
变化段的表空间 |
9 |
ROW_ID |
特定数据变化行的ID |
10 |
SESSION_INFO |
数据发生变化时用户进程信息 |
11 |
OPERATION |
重作记录中记录的操做(如INSERT) |
12 |
SQL_REDO |
能够为重作记录重作指定行变化的SQL语句(正向操做) |
13 |
SQL_UNDO |
能够为重作记录回退或恢复指定行变化的SQL语句(反向操做) |
须要强调一点的是,视图v$logmnr_contents中的分析结果仅在咱们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是由于全部的LogMiner存储都在PGA内存中,全部其余的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之再也不存在。