zoukankan      html  css  js  c++  java
  • 21.1 LogMiner

    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

  • 相关阅读:
    Java内存模型深度解析:final
    Java内存模型深度解析:总结
    打印流
    Properties
    进制间的转换
    JAVA IO
    001课-java_web开发入门
    openssl生成https证书 (转)
    PostgreSQL中COUNT的各条件下(1亿条数据)例子
    6个原因说服你选择PostgreSQL9.6
  • 原文地址:https://www.cnblogs.com/yiwuya/p/1395019.html
Copyright © 2011-2022 走看看