体系结构之日志挖掘

  1. 主要作用途:数据库恢复中有时会需要对Redo log进行分析,使用log miner,以便确定要恢复的时间点或SCN,跟踪数据库的变化,回退数据库的变化等。
  2. 要求:
    1. 源数据库和分析数据库必须运行在相同硬件平台上;
    2. 分析数据库可以是独立数据库或源数据库;
    3. 分析数据库的版本不能低于源数据库的版本;
    4. 分析数据库与源数据库必须具有相同的字符集;
    5. 使用LogMiner进行分析必须在日志生成前开启Minimal Supplemental logging
  3. 四个基本对象
    1. The Source Database:源数据库,产生日志的数据库。
    2. The Mining Database:分析数据库,运行LogMiner的数据库,不仅可以分析本身的日志,也可以分析其它数据库文件。
    3. The LogMiner Dictionary:日志挖掘字典,没有字典,日志内容无法解析,默认是系统内部16进制内容。
    4. The Redo Log Files:重做日志文件,可以是在线的,也可以是归档的。
  4. 操作流程
    1. 安装LogMiner
      1. 首先安装两个安装包:DBMS_LOGMNR 和 DBMS_LOGMNR_D,脚本如下:
        1. $ORACLE_HOME/rdbms/admin/dbmslm.sql
        2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql
    2. 开启补充日志
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;----通过PL/SQL包的DML的日志挖掘,这步要先执行,在此之后的DML操作才能从日志里挖到。
 
    1. 创建数据字典
      1. DBMS_LOGMNR_D.BUILD创建数据字典,三种创建方式
        1. dict_from_online_catalog在线字典
        2. store_in_flat_file平面文件字典
        3. store_in_redo_logs
      2. 如果使用在线字典方式,这个步骤可以省略
    2. 添加日志文件
      1. 添加第一个文件
    SQL> execute dbms_logmnr.add_logfile(logfilename=>'日志',options=>dbms_logmnr.new);----第一个文件 后缀官方建议是 .new

             2. 添加第二个及后续文件

    SQL> execute dbms_logmnr.add_logfile(logfilename=>'日志',options=>dbms_logmnr.addfile);----- 后续添加的就不是 new了
      1. 执行分析
      SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
        1. 查询分析结果
          1. 查询的分析结果是存放在动态试图v$logmnr_contents 里的,建议不要直接查看,通过创建临时表的方式来查看
          2. 创建临时表
        SQL> create table tbs_test nologging as select * from v$logmnr_contents;

                   3. 查看临时表结果

        SQL> select username,scn, to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') timestamp, sql_redo, sql_undo from tbs_test where seg_name = 'TEST';
          1. 关闭日志分析
          SQL> execute dbms_logmnr.end_logmnr;
           
           
          实验:通过在线数据字典方式挖掘归档日志
          实验步骤:
            1. 开启数据库补充日志
            2. 创建一张表 TESTLOG(此实验使用CTAS创建)
            3. 对该表做相应的DML操作(update/delete)最后都提交
            4. 查看当前正在使用的日志组及日志序列号
            5. 将该日志组归档出去
            6. 添加日志文件
            7. 执行分析
            8. 使用CTAS创建另外一张表 LOG_TEST,将分析结果存入该表
            9. 关闭日志分析
            10. 查看分析结果(见截图)
          实验代码:
           1 第一步:
           2 SQL> alter database add supplemental log data;
           3 
           4 Database altered.
           5 
           6 SQL> select supplemental_log_data_min from v$database;
           7 
           8 SUPPLEMENTAL_LOG
           9 ----------------
          10 YES
          11 第二步:
          12 SQL> create table testlog as select * from scott.emp;
          13 
          14 Table created.
          15 第三步:
          16 SQL> update testlog set sal=10000 where ename='KING';
          17 
          18 1 row updated.
          19 
          20 SQL> commit;
          21 
          22 Commit complete.
          23 
          24 SQL> delete from testlog;
          25 
          26 14 rows deleted.
          27 
          28 SQL> commit;
          29 
          30 Commit complete.
          31 第四步:
          32 SQL> select a.group#,a.sequence#,a.status,b.member,a.archived from v$log a,v$logfile b where a.group#=b.group#;
          33 
          34     GROUP#  SEQUENCE# STATUS          MEMBER                         ARCHIV
          35 ---------- ---------- --------------- -------------------------------------------------- ------
          36      1       63 INACTIVE          /u01/app/oracle/oradata/OCP12C/redo01a.log     YES
          37      1       63 INACTIVE          /u01/app/oracle/oradata/OCP12C/redo01b.log     YES
          38      2       64 CURRENT          /u01/app/oracle/oradata/OCP12C/redo02a.log     NO
          39      2       64 CURRENT          /u01/app/oracle/oradata/OCP12C/redo02b.log     NO
          40      3       62 INACTIVE          /u01/app/oracle/oradata/OCP12C/redo03a.log     YES
          41      3       62 INACTIVE          /u01/app/oracle/oradata/OCP12C/redo03b.log     YES
          42 
          43 6 rows selected.
          44 第五步:
          45 SQL> alter system archive log current;
          46 
          47 System altered.
          48 SQL> select a.group#,a.sequence#,a.status,b.member,a.archived from v$log a,v$logfile b where a.group#=b.group#;
          49 
          50     GROUP#  SEQUENCE# STATUS          MEMBER                         ARCHIV
          51 ---------- ---------- --------------- -------------------------------------------------- ------
          52      1       63 INACTIVE          /u01/app/oracle/oradata/OCP12C/redo01a.log     YES
          53      1       63 INACTIVE          /u01/app/oracle/oradata/OCP12C/redo01b.log     YES
          54      2       64 ACTIVE          /u01/app/oracle/oradata/OCP12C/redo02a.log     YES
          55      2       64 ACTIVE          /u01/app/oracle/oradata/OCP12C/redo02b.log     YES
          56      3       65 CURRENT          /u01/app/oracle/oradata/OCP12C/redo03a.log     NO
          57      3       65 CURRENT          /u01/app/oracle/oradata/OCP12C/redo03b.log     NO
          58 
          59 6 rows selected.
          60 第六步:
          61 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/arch/1_64_1056413938.dbf',options=>dbms_logmnr.new);
          62 
          63 PL/SQL procedure successfully completed.
          64 第七步:
          65 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
          66 
          67 PL/SQL procedure successfully completed.
          68 第八步:
          69 SQL> create table log_test as select * from v$logmnr_contents;
          70 
          71 Table created.
          72 第九步:
          73 SQL> execute dbms_logmnr.end_logmnr;
          74 
          75 PL/SQL procedure successfully completed.
          76 第十步:
          77 SQL>select username,
          78        scn,
          79        to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') timestamp,
          80        sql_redo,
          81        sql_undo
          82   from log_test
          83  where seg_name = 'TESTLOG';
          View Code

           体系结构之日志挖掘