相信许多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. 宝马-中国官方网站服务站点信息爬去记录(解析json中数据)

    具体步骤: 1.进入宝马官网,查找经销商查询界面 http://www.bmw.com.cn/cn/zh/general/dealer_locator/content/dealer_locator.h ...

  2. SelectedValue,SelectedValuePath,SelectedValueBinding,DisplayMemberPath讲解

    无论在Winform.WPF.ASP.NET中,数据绑定是我们经常使用的一个重要技术,我们经常会把相关类动态显示绑定到UI界面中,其中有几个比较重要的属性需要大家灵活运用. 那Combox来说明有两个 ...

  3. 1046 Shortest Distance (20)

    #include<stdio.h> int main() { int n,m,a,b,tem,pre,p; int i,j; ]; while(scanf("%d",& ...

  4. Ducci Sequence

    Description   A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers ( ...

  5. 动态LINQ构建(实现等于不等于大于小于,like以及IN)

    首先感谢园子里的“红烧狮子头”,他的工作是本文的基础,引文如下http://www.cnblogs.com/daviddai/archive/2013/03/09/2952087.html,本版本实现 ...

  6. IOS设备滑动事件

    只要手指触摸屏幕,滑动,从屏幕离开,系统都会产生UIEvent对象类型的事件---当然包括UITouch事件 – touchesBegan:withEvent:   当用户触摸到屏幕时调用方法 – t ...

  7. Ubuntu Linux启用root用户登录

    Ubuntu Linux有一个与众不同的特点,那就是初次使用时,你无法作为root来登录系统,为什么会这样?这就要从系统的安装说起.对于其他Linux系统来 说,一般在安装过程就设定root密码,这样 ...

  8. Hadoop-2.2.0 + Hbase-0.96.2 + Hive-0.13.1(转)

    From:http://www.itnose.net/detail/6065872.html # 需要软件 Hadoop-2.2.0(目前Apache官网最新的Stable版本) Hbase-0.96 ...

  9. API HOOK

    API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...

  10. oracle-number(5,2)

    insert into emp values(70000.123); 只能存储 整数的前3位, 小数点后面的2位