导航

21.1 LogMiner

Posted on 2009-02-20 17:13  毅无涯  阅读(221)  评论(1编辑  收藏  举报

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