相信许多DBA同学都曾遇到过这种情况,由于各种各样的原因,必须对数据库做不完全恢复;但又不确定应该恢复到哪个时间点或SCN才合适,因而反复的执行不完全恢复,悲剧掉了一地,中枪的有木有?温馨提示下,在生产环境中做不完全恢复前,可能的话,先对现场做一次备份,有备无患!前面的是第一个问题,当找对了不完全恢复的时间点并成功执行不完全恢复后,后面的更改如何重做?让客户重演一遍?想都别想?打个比方,当前时间为上午11:00,不完全恢复的时间为上午8:30,把数据库状态恢复到上午8:30后,8:30到11:00这3.5小时的数据库更改如何重演,这时间拖的越长就越悲剧!

Oracle从8i后提供了一个logminer免费的日志挖掘工具,可以解析归档,在线日志中的具体内容,针对前面提出的2个问题,可以很好的解决!下面使用oracle 10g平台来实战下…

一:对数据库执行备份,生产环境中,这种操作都是计划性的,过期的备份还应该定期归档

  1. [oracle@rhel6 ~]$ rman target /
  2. Recovery Manager: Release 10.2.0.1.0 - Production on Wed May 9 19:24:02 2012
  3. Copyright (c) 1982, 2005, Oracle.  All rights reserved.
  4. connected to target database: ORCL (DBID=1289365799)
  5. RMAN> list backup of database;
  6. using target database control file instead of recovery catalog
  7. RMAN> backup database;
  8. RMAN> list backup of database summary;
  9. List of Backups
  10. ===============
  11. Key     TY LV S Device Type Completion Time     #Pieces #Copies Compressed Tag
  12. ------- -- -- - ----------- ------------------- ------- ------- ---------- ---
  13. 1       B  F  A DISK        2012-05-09:19:25:20 1       1       NO         TAG20120509T192436

二:开启数据库的记录附加日志属性,详细作用参考:http://space.itpub.net/7607759/viewspace-462640

  1. [oracle@rhel6 ~]$ sqlplus /nolog
  2. SQL*Plus: Release 10.2.0.1.0 - Production on Wed May 9 19:26:14 2012
  3. Copyright (c) 1982, 2005, Oracle.  All rights reserved.
  4. SQL> conn /as sysdba
  5. Connected.
  6. SQL> select supplemental_log_data_min from v$database;
  7. SUPPLEME
  8. --------
  9. NO
  10. SQL> alter database add supplemental log data;
  11. Database altered.
  12. SQL> select supplemental_log_data_min from v$database;
  13. SUPPLEME
  14. --------
  15. YES

三:创建测试数据

  1. SQL> conn hr/hr
  2. Connected.
  3. SQL> create table t1 as select * from employees;
  4. Table created.
  5. SQL> select count(*) from t1;
  6. COUNT(*)
  7. ----------
  8. 107
  9. 这里记录系统时间主要用于后面的对比,真实环境下是得不到这种信息的!
  10. SQL> select sysdate from dual;
  11. SYSDATE
  12. -------------------
  13. 2012-05-09:19:28:52
  14. SQL> truncate table t1;
  15. Table truncated.
  16. 在执行误操作后,用户继续其他的更新操作,同时数据库进行了日志切换
  17. SQL> create table t2 (id number);
  18. Table created.
  19. SQL> insert into t2 values (1);
  20. 1 row created.
  21. SQL> insert into t2 values (2);
  22. 1 row created.
  23. SQL> commit;
  24. Commit complete.
  25. SQL> conn /as sysdba
  26. Connected.
  27. SQL> archive log list;
  28. Database log mode          Archive Mode
  29. Automatic archival         Enabled
  30. Archive destination        USE_DB_RECOVERY_FILE_DEST
  31. Oldest online log sequence     20
  32. Next log sequence to archive   22
  33. Current log sequence           22
  34. SQL> alter system switch logfile;
  35. System altered.

四:问题出现,现在需要将前面truncate的表找回,首先需要确定不完全恢复时间点的问题!下面开始介绍如何使用logminer
1:设置utl_file_dir初始化参数,重启数据库

  1. SQL> show parameter utl_file;
  2. NAME                     TYPE    VALUE
  3. ------------------------------------ ----------- ------------------------------
  4. utl_file_dir                 string
  5. SQL> alter system set utl_file_dir='/home/oracle/utl_file_dir' scope=spfile;
  6. System altered.
  7. SQL> shutdown immediate
  8. Database closed.
  9. Database dismounted.
  10. ORACLE instance shut down.
  11. SQL> startup
  12. ORACLE instance started.
  13. Total System Global Area  213909504 bytes
  14. Fixed Size          2019640 bytes
  15. Variable Size         104861384 bytes
  16. Database Buffers      100663296 bytes
  17. Redo Buffers            6365184 bytes
  18. Database mounted.
  19. Database opened.
  20. SQL> show parameter utl_file;
  21. NAME                     TYPE    VALUE
  22. ------------------------------------ ----------- ------------------------------
  23. utl_file_dir                 string  /home/oracle/utl_file_dir
  24. SQL> !mkdir -p /home/oracle/utl_file_dir

2:使用sys用户执行下面的3个sql脚本

  1. SQL> show user;
  2. USER is "SYS"
  3. SQL> @?/rdbms/admin/dbmslms.sql;
  4. Package created.
  5. No errors.
  6. Grant succeeded.
  7. SQL> @?/rdbms/admin/dbmslm.sql;
  8. Package created.
  9. Grant succeeded.
  10. SQL> @?/rdbms/admin/dbmslmd.sql;
  11. Package created.

3:创建数据字典文件,该字典文件是可选的,但是如果没有它,LogMiner解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是16进制的形式,我们是无法直接理解的

  1. SQL> exec dbms_logmnr_d.build(dictionary_filename => 'V10201dict.ora',dictionary_location => '/home/oracle/utl_file_dir');
  2. PL/SQL procedure successfully completed.
  3. SQL> !file /home/oracle/utl_file_dir/V10201dict.ora
  4. /home/oracle/utl_file_dir/V10201dict.ora: ASCII English text, with very long lines
  5. SQL> !du -sh /home/oracle/utl_file_dir/V10201dict.ora
  6. 23M /home/oracle/utl_file_dir/V10201dict.ora

4:添加在线日志,进行日志挖掘;生产环境中,一般都会将源库的数据字典和日志文件拷贝到测试库上分析,源库不继续以read write方式打开

  1. SQL> select member from v$logfile where type='ONLINE';
  2. MEMBER
  3. ----------------------------------------
  4. /u01/app/oracle/oradata/orcl/redo03.log
  5. /u01/app/oracle/oradata/orcl/redo02.log
  6. /u01/app/oracle/oradata/orcl/redo01.log
  7. SQL> exec dbms_logmnr.add_logfile(logfilename => '/u01/app/oracle/oradata/orcl/redo01.log',options => dbms_logmnr.new);
  8. PL/SQL procedure successfully completed.
  9. SQL> exec dbms_logmnr.start_logmnr(dictfilename => '/home/oracle/utl_file_dir/V10201dict.ora',options => dbms_logmnr.ddl_dict_tracking);
  10. PL/SQL procedure successfully completed.

5:查看v$logmnr_contents视图是否有相关的信息

  1. SQL> select distinct username from v$logmnr_contents;
  2. USERNAME
  3. ------------------------------
  4. SYSMAN
  5. SYS
  6. SQL> select count(*) from v$logmnr_contents;
  7. COUNT(*)
  8. ----------
  9. 189963

6:在线日志挖掘完后,发现没有相关的信息,则开始挖掘归档日志文件

  1. SQL> exec dbms_logmnr.add_logfile(logfilename => '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_05_09/o1_mf_1_22_7tnochcr_.arc',options => dbms_logmnr.new);
  2. PL/SQL procedure successfully completed.
  3. SQL> exec dbms_logmnr.start_logmnr(dictfilename => '/home/oracle/utl_file_dir/V10201dict.ora',options => dbms_logmnr.ddl_dict_tracking);
  4. PL/SQL procedure successfully completed.
  5. SQL> select distinct username from v$logmnr_contents;
  6. USERNAME
  7. ------------------------------
  8. HR
  9. SYSMAN
  10. SYS

7:通过查看v$logmnr_contents可以清楚的确定truncate的具体时间和之后的操作

  1. SQL> col sql_redo format a60 trunc
  2. SQL> select sql_redo,timestamp from v$logmnr_contents where username='HR' and table_name='T1' and operation='DDL';
  3. SQL_REDO                             TIMESTAMP
  4. ------------------------------------------------------------ -------------------
  5. create table t1 as select * from employees;          2012-05-09:19:28:25
  6. truncate table t1;                                   2012-05-09:19:29:03
  7. SQL> select username,sql_redo,timestamp from v$logmnr_contents where timestamp > '2012-05-09:19:29:03' and username not in ('SYS','SYSMAN');
  8. USERNAME   SQL_REDO                 TIMESTAMP
  9. ---------- ---------------------------------------- -------------------
  10. HR     set transaction read write;          2012-05-09:19:29:27
  11. HR                          2012-05-09:19:29:27
  12. HR     insert into "SYS"."OBJ$"("OBJ#","DATAOBJ 2012-05-09:19:29:27
  13. HR     set transaction read write;          2012-05-09:19:29:27
  14. HR                          2012-05-09:19:29:27
  15. HR     set transaction read write;          2012-05-09:19:29:27
  16. HR                          2012-05-09:19:29:27
  17. HR     commit;                  2012-05-09:19:29:27
  18. HR     insert into "SYS"."SEG$"("TS#","FILE#"," 2012-05-09:19:29:27
  19. HR     update "SYS"."TSQ$" set "GRANTOR#" = '0' 2012-05-09:19:29:27
  20. HR     commit;                  2012-05-09:19:29:27
  21. USERNAME   SQL_REDO                 TIMESTAMP
  22. ---------- ---------------------------------------- -------------------
  23. HR     set transaction read write;          2012-05-09:19:29:27
  24. HR                          2012-05-09:19:29:27
  25. HR     commit;                  2012-05-09:19:29:27
  26. HR     insert into "SYS"."TAB$"("OBJ#","DATAOBJ 2012-05-09:19:29:27
  27. HR     insert into "SYS"."COL$"("OBJ#","COL#"," 2012-05-09:19:29:27
  28. HR     create table t2 (id number);         2012-05-09:19:29:27
  29. HR     update "SYS"."SEG$" set "TYPE#" = '5', " 2012-05-09:19:29:27
  30. HR     commit;                  2012-05-09:19:29:27
  31. HR     set transaction read write;          2012-05-09:19:29:39
  32. HR     insert into "HR"."T2"("ID") values ('1') 2012-05-09:19:29:39
  33. HR     insert into "HR"."T2"("ID") values ('2') 2012-05-09:19:29:43
  34. USERNAME   SQL_REDO                 TIMESTAMP
  35. ---------- ---------------------------------------- -------------------
  36. HR     commit;                  2012-05-09:19:29:43
  37. 23 rows selected.

五:执行不完全恢复

  1. SQL> shutdown immediate
  2. Database closed.
  3. Database dismounted.
  4. ORACLE instance shut down.
  5. SQL> startup mount
  6. ORACLE instance started.
  7. Total System Global Area  213909504 bytes
  8. Fixed Size          2019640 bytes
  9. Variable Size         109055688 bytes
  10. Database Buffers       96468992 bytes
  11. Redo Buffers            6365184 bytes
  12. Database mounted.
  13. [oracle@rhel6 ~]$ rman target /
  14. Recovery Manager: Release 10.2.0.1.0 - Production on Wed May 9 20:21:30 2012
  15. Copyright (c) 1982, 2005, Oracle.  All rights reserved.
  16. connected to target database: ORCL (DBID=1289365799, not open)
  17. RMAN> restore database;
  18. RMAN> run {
  19. 2> set until time "to_date('2012-05-09:19:29:00','YYYY-MM-DD:HH24:MI:SS')";
  20. 3> recover database;
  21. 4> }
  22. RMAN> alter database open resetlogs;
  23. database opened
  24. RMAN> list incarnation;
  25. List of Database Incarnations
  26. DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
  27. ------- ------- -------- ---------------- --- ---------- ----------
  28. 1       1       ORCL     1289365799       PARENT  1          2005-10-22:21:44:08
  29. 2       2       ORCL     1289365799       PARENT  525876     2011-09-11:15:24:27
  30. 3       3       ORCL     1289365799       CURRENT 831637     2012-05-09:20:26:35

六:剩下的就是根据v$logmnr_contents视图中的sql_redo补齐之后的数据

  1. [oracle@rhel6 ~]$ sqlplus /nolog
  2. SQL*Plus: Release 10.2.0.1.0 - Production on Wed May 9 20:27:34 2012
  3. Copyright (c) 1982, 2005, Oracle.  All rights reserved.
  4. SQL> conn hr/hr
  5. Connected.
  6. SQL> select count(*) from t1;
  7. COUNT(*)
  8. ----------
  9. 107
  10. SQL> select count(*) from t2;
  11. select count(*) from t2
  12. *
  13. ERROR at line 1:
  14. ORA-00942: table or view does not exist

七、使用测试库挖掘生产库日志的注意事项 
1. LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同;
2. 被分析数据库平台必须和当前LogMiner所在数据库平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle 8i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行LogMiner,而不能在其他如Microsoft NT上运行LogMiner。当然两者的硬件条件不一定要求完全一样;
3. LogMiner日志分析工具仅能够分析Oracle 8以后的产品,对于8以前的产品,该工具也无能为力;

补充:
使用下面的语句LogMiner使用logmnrts$表空间来存放所有的LogMiner表。LogMiner默认存放表在System表空间
the following statement will re-create all LogMiner tables to use the logmnrts$ tablespace:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');

参考如下文章,感谢作者分享!
http://space.itpub.net/22111412/viewspace-612686
http://hi.baidu.com/lichangzai/blog/item/7a096bd5ae1724cc50da4b1b.html

Logminer实战的更多相关文章

  1. logminer实战之生产环境写入数据字典,dg环境查询拷贝日志,测试环境进行挖掘,输出结果

    应客户需要,对某一天的日志进行挖掘,分析日均归档日志切换数量20增长至40的原因,是什么表的dml操作导致的日志量剧增,最终定位某个应用(需要客户自己进行甄别) 操作说明及介绍: 1.客户10.2.0 ...

  2. 想了解FlinkX-Oracle Logminer?那就不要错过这篇文章

    FlinkX-Oracle Logminer模块是FlinkX基于Logminer对Oracle重做日志进行实时采集分析,可对Oracle进行实时同步也可以通过指定SCN或者时间戳从某个节点进行同步, ...

  3. LogMiner学习笔记

    本文是个实战,没有讲太多理论的东西,如需详细理解Oracle LogMiner,请移步:LogMiner详细讲解 首先介绍一下我的oracle环境: 第一步: 确定LogMiner已经安装. 安装Lo ...

  4. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  5. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  6. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  7. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  9. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

随机推荐

  1. 3DSoftRenderer

    研究了好几天基本的图形学,对于光栅化的大致过程有点了解了,很感谢网上的很多大牛的无私奉献,我就写一下这几天的总结,希望也能对网络上的知识做出一点点点的贡献. 屏幕有什么特点,无非是一排排的像素点,每个 ...

  2. C#学习笔记---基础入门(三)

    泛型<T> 使用泛型能够最大限度的重用代码/保护类型安全,提高性能 泛型成员因为类型的不确定性,不能使用算术运算符/比较运算符 类型参数可以有多个,可以是编译器能够识别的任何类型 类型参数 ...

  3. Gnome 插件介绍

    插件:Applications Menuhttps://extensions.gnome.org/extension/6/applications-menu/ TopIconshttps://exte ...

  4. 2337:[HNOI2011]XOR和路径 - BZOJ

    昨天才做了一道高斯消元,一下要精度判断,一下又不要精度判断 主要是思路很重要 很容易想到每一个二进制位算一个概率,然后求和,设f[i]为走到从i走到n这一个二进制位为1的概率 f[i]:=∑{f[j] ...

  5. [转载]VS2012创建MVC3项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”。

    如果在没有安装vs2012 update3升级包的情况下,创建MVC3项目会出现下面的错误信息. 因为VS2012已经全面切换到使用NuGet这个第三方开源工具来管理项目包和引用模块了,使用VS201 ...

  6. win8 优化笔记

    win8可以关掉的服务: 以下是小编搜集的可以安全更改为手动启动的服务(按名称排序): Application Experience(启动时为程序处理应用程序兼容性缓存请求) ·Computer Br ...

  7. uva 10034

    计算所有点之间的权值   然后就是最小生成树 #include<cstring> #include<string> #include<cstdio> #includ ...

  8. Android支付接入(四):联通VAC计费

    原地址:http://blog.csdn.net/simdanfeg/article/details/9012031 注意事项: 1.联通支付是不需要自己标识软硬计费点的,当平台申请计费点的时候会提交 ...

  9. 1027-Quicksum

    描述 A checksum is an algorithm that scans a packet of data and returns a single number. The idea is t ...

  10. oracle 增加字段

    之前很多表增加很多相同的字段,一个一个添加太慢烦了,于是用了以下的方法alter table t_xmlc_batch_out_head_bak add ( SENDRECEIVEFLAG ) , S ...