体系结构之日志挖掘
2020-12-13 12:12 EniNiemand 阅读(87) 评论(0) 编辑 收藏 举报- 主要作用途:数据库恢复中有时会需要对Redo log进行分析,使用log miner,以便确定要恢复的时间点或SCN,跟踪数据库的变化,回退数据库的变化等。
- 要求:
- 源数据库和分析数据库必须运行在相同硬件平台上;
- 分析数据库可以是独立数据库或源数据库;
- 分析数据库的版本不能低于源数据库的版本;
- 分析数据库与源数据库必须具有相同的字符集;
- 使用LogMiner进行分析必须在日志生成前开启Minimal Supplemental logging
- 四个基本对象
- The Source Database:源数据库,产生日志的数据库。
- The Mining Database:分析数据库,运行LogMiner的数据库,不仅可以分析本身的日志,也可以分析其它数据库文件。
- The LogMiner Dictionary:日志挖掘字典,没有字典,日志内容无法解析,默认是系统内部16进制内容。
- The Redo Log Files:重做日志文件,可以是在线的,也可以是归档的。
- 操作流程
- 安装LogMiner
- 首先安装两个安装包:DBMS_LOGMNR 和 DBMS_LOGMNR_D,脚本如下:
- $ORACLE_HOME/rdbms/admin/dbmslm.sql
- $ORACLE_HOME/rdbms/admin/dbmslmd.sql
- 开启补充日志
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;----通过PL/SQL包的DML的日志挖掘,这步要先执行,在此之后的DML操作才能从日志里挖到。
- 创建数据字典
- DBMS_LOGMNR_D.BUILD创建数据字典,三种创建方式
- dict_from_online_catalog在线字典
- store_in_flat_file平面文件字典
- store_in_redo_logs
- 如果使用在线字典方式,这个步骤可以省略
- 添加日志文件
- 添加第一个文件
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了
- 执行分析
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
- 查询分析结果
- 查询的分析结果是存放在动态试图v$logmnr_contents 里的,建议不要直接查看,通过创建临时表的方式来查看
- 创建临时表
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';
- 关闭日志分析
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';