LogMiner 是ORACLE 数据库所提供的一个工具,它用于分析重做日志和归档日志所记载的事务操作。LogMiner 提供了以下一些关键特征:
确定数据库的逻辑损坏时间。
确定事务级要执行的精细逻辑恢复操作。
执行后续审计
21.1.1 LogMiner 简介
1. LogMiner 基本对象
- 源数据库(source database):该数据库是指包含了要分析的重做日志和归档日志的产品数据库。
- 分析数据库(mining database):该数据库是指执行 LogMiner 操作所要使用的数据库。
- LogMiner 字典:LogMiner 字典用于将内部对象ID 号和数据类型转换为对象名和外部数据格式。
2. LogMiner 配置需求
(1) 源数据库和分析数据库。
- 源数据库和分析数据库必须运行在相同的硬件平台上。
- 分析数据库可以是独立数据库,或者与源数据库在同一个数据库中。
- 分析数据库的版本不能低于源数据库的版本。
- 分析数据库与源数据库必须具有相同的字符集。
(2) LogMiner 字典:LogMiner 字典必须在源数据库中生成。
(3) 重做日志文件。
- 当分析多个重做日志或归档日志时,它们必须是同一个源数据库的重做日志或归档日志。
- 当分析多个重做日志或归档日志时,它们必须具有相同的 RESETLOGS SCN。
- 被分析的重做日志和归档日志必须在 ORACLE 8.0 版本以上。
3. 补充日志(supplemental logging)
重做日志用于实现例程恢复和介质恢复,这些操作所需要的数据被自动记录在重做日志中。但是,重做应用可能还需要记载其他列信息到重做日志中,记录其他列的日志过程被称为补充日志。默认情况下,ORACLE 数据库没有提供任何补充日志,从而导致默认情况下 LogMiner 无法支持以下特征:
- 索引簇、链行和迁移行。
- 直接路径插入。
- 摘取 LogMiner 字典到重做日志。
- 跟踪DDL。
- 生成键列的 SQL_REDO 和SQL_UNDO 信息。
- LONG 和LOB 数据类型。
在数据库级激活补充日志:
SQL> alter database add supplemental log data;
数据库已更改。
4. LogMiner 支持的数据类型和表存储属性
- CHAR、NCHAR、VARCHAR2、VARCHAR、NVARCHAR2
- NUMBER
- DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE
- INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND
- RAW
- CLOB、NCLOB、BLOB
- LONG、LONG RAW
- BINARY_FLOAT、BINARY_DOUBLE
- 函数索引
- 没有LOB 列的索引组织表(IOT)
5. LogMiner 不支持的数据类型和表存储属性
- BFILE
- 抽象数据类型
- 集合类型(嵌套表和 VARRAY)
- 参照对象
- XMLTYPE
- 具有LOB 列的索引组织表
- 使用 COMPRESS 特征的表
21.1.2 LogMiner 字典
LogMiner 字典用于将对象 ID号和数据类型转变为对象名和外部数据格式。
使用 LogMiner 字典有三种选项:
(1) 使用源数据库数据字典
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
注意,DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG 要求数据库必须处于OPEN 状态,并且该选项只能用于跟踪DML 操作,而不能跟踪DDL 操作。
(2) 摘取 LogMiner 字典到重做日志。
当使用分析数据库分析重做日志或归档日志时,或被分析表的结构发生改变时,ORACLE 建议你使用该选项分析重做日志和归档日志。为了摘取 LogMiner 字典到重做日志,要求源数据库必须处于 ARCHIVELOG 模式,并且该数据库必须处于 OPEN 状态。
SQL> execute dbms_logmnr_d.build(option=>dbms_logmnr_d.store_in_redo_logs);
(3) 摘取 LogMiner 字典到字典文件。
字典文件用于存放对象ID 号和对象名信息,该选项是为了与早期版本兼容而保留的。注意,当使用字典文件分析重做日志时,如果要分析新建立的对象,则必须重新建立字典文件。建立字典文件的具体步骤如下:
1. 配置字典文件所在的目录。
2. 建立字典文件。
SQL> conn sys/orcl@demo as sysdba
已连接。
SQL> alter system set utl_file_dir='d:\demo' scope=spfile;
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 603979776 bytes
Fixed Size 1250380 bytes
Variable Size 289409972 bytes
Database Buffers 306184192 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL> execute dbms_logmnr_d.build('dict.ora', -
> 'd:\demo',dbms_logmnr_d.store_in_flat_file)
PL/SQL 过程已成功完成。
21.1.3 使用 LogMiner 分析 DML 操作
(1) 建立日志分析列表。
(2) 启动 LogMiner。
(3) 查看日志分析结果。
(4) 结束 LogMiner。
SQL> conn scott/tiger@demo
已连接。
SQL> desc dept;
名称 是否为空? 类型
----------------------------------------- -------- --------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> insert into dept values(66,'admin',default);
已创建 1 行。
SQL> update dept set loc='test' where deptno=66;
已更新 1 行。
SQL> commit;
提交完成。
SQL> conn sys/orcl@demo as sysdba
已连接。
SQL> execute dbms_logmnr.add_logfile( -
> logfilename => 'd:\demo\redo02.log',options => dbms_logmnr.new)
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile( -
> logfilename => 'd:\demo\redo01.log', -
> options => dbms_logmnr.addfile)
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.start_logmnr( -
> options => dbms_logmnr.dict_from_online_catalog)
PL/SQL 过程已成功完成。
SQL> col username format a8
SQL> col sql_redo format a60
SQL> select username,timestamp,sql_redo from v$logmnr_contents where seg_name='DEPT';
USERNAME TIMESTAMP SQL_REDO
-------- -------------- ------------------------------------------------------------
SCOTT 20-2月 –09 insert into "SCOTT"."DEPT"("DEPTNO","DNAME","LOC") values ('66','admin',NULL);
SCOTT 20-2月 –09 update "SCOTT"."DEPT" set "LOC" = 'test' where "DEPTNO" = '66' and "LOC" IS NULL and ROWID = 'AAAMfNAAEAAAAAMAAA';
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL 过程已成功完成。
21.1.4 使用 LogMiner 分析DDL 操作
(1) 建立日志分析列表。
(2) 启动 LogMiner。
(3) 查看日志分析结果。
(4) 结束 LogMiner。
SQL> conn scott/tiger@demo
已连接。
SQL> drop table emp;
表已删除。
SQL> drop table dept;
表已删除。
SQL> conn sys/orcl@demo as sysdba
已连接。
SQL> execute dbms_logmnr.add_logfile( -
> logfilename => 'd:\demo\redo03.log',-
> options => dbms_logmnr.new)
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile( -
> logfilename => 'd:\demo\redo02.log', -
> options => dbms_logmnr.addfile)
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.start_logmnr( -
> dictfilename => 'd:\demo\dict.ora', -
> options => dbms_logmnr.ddl_dict_tracking)
BEGIN dbms_logmnr.start_logmnr( dictfilename => 'd:\demo\dict.ora', options =>
dbms_logmnr.ddl_dict_tracking); END;
*
第 1 行出现错误:
ORA-01284: 文件 d:\demo\dict.ora 无法打开
ORA-06512: 在 "SYS.DBMS_LOGMNR", line 58
ORA-06512: 在 line 1
SQL> execute dbms_logmnr_d.build('dict.ora','d:\demo',dbms_logmnr_d.store_in_flat_file)
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.start_logmnr( -
> dictfilename => 'd:\demo\dict.ora', -
> options => dbms_logmnr.ddl_dict_tracking)
PL/SQL 过程已成功完成。
SQL> select timestamp,sql_redo from v$logmnr_contents
2 where lower(sql_redo) like '%drop table%';
TIMESTAMP SQL_REDO
-------------- ------------------------------------------------------------
20-2月 -09 drop table emp AS "BIN$A7+4bNq4TRKuUuEhd84rWQ==$0" ;
20-2月 -09 drop table dept AS "BIN$wczV41qFSuCXOpyJtx91bQ==$0" ;
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL 过程已成功完成。
21.1.5 显示 LogMiner 信息
1. 显示 LogMiner 分析结果
SQL> select timestamp,sql_redo from v$logmnr_contents
2 where lower(sql_redo) like '%drop table%';
TIMESTAMP SQL_REDO
-------------- ------------------------------------------------------------
20-2月 -09 drop table emp AS "BIN$A7+4bNq4TRKuUuEhd84rWQ==$0" ;
20-2月 -09 drop table dept AS "BIN$wczV41qFSuCXOpyJtx91bQ==$0" ;
2. 显示正在使用的字典文件
SQL> select db_name,filename from v$logmnr_dictionary;
DB_NAME FILENAME
--------- ------------------------------
DEMO d:\demo\dict.ora
3. 显示日志列表
SQL> select filename,low_scn,next_scn from v$logmnr_logs;
FILENAME LOW_SCN NEXT_SCN
------------------------------ ---------- ----------
d:\demo\redo03.log 2050599 2.8147E+14
d:\demo\redo01.log 2044949 2044952
d:\demo\redo02.log 2044952 2.8147E+14
4. 显示 LogMiner 参数设置
SQL> select start_date,end_date,start_scn,end_scn from v$logmnr_parameters;
START_DATE END_DATE START_SCN END_SCN
-------------- -------------- ---------- ----------
01-1月 -11 2044947 0