体系结构之日志挖掘
- 主要作用途:数据库恢复中有时会需要对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
- 开启补充日志
- 创建数据字典
- DBMS_LOGMNR_D.BUILD创建数据字典,三种创建方式
- dict_from_online_catalog在线字典
- store_in_flat_file平面文件字典
- store_in_redo_logs
- 如果使用在线字典方式,这个步骤可以省略
- 添加日志文件
- 添加第一个文件
2. 添加第二个及后续文件
SQL> execute dbms_logmnr.add_logfile(logfilename=>'日志',options=>dbms_logmnr.addfile);----- 后续添加的就不是 new了- 执行分析
- 查询分析结果
- 查询的分析结果是存放在动态试图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 第一步: 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';