代码改变世界

体系结构之日志挖掘

2020-12-13 12:12  EniNiemand  阅读(87)  评论(0编辑  收藏  举报
  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