相信许多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. oracle的日志分析工具,oracle日志分析工具LogMiner使用(实战)

    要安装LogMiner工具,必须首先要运行下面这样两个脚本,这两个脚本必须均以SYS用户身份运行.其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件.第二个脚本用来创建DBMS_LO ...

  2. IDEA的Docker插件实战(Dockerfile篇)

    IDEA的Docker插件实战(Dockerfile篇) IntelliJ IDEA的Docker插件能帮助我们将当前工程制作成Docker镜像.运行在指定的远程机器上,是学习和开发阶段的好帮手,本文 ...

  3. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

  4. 【置顶】利用 NLP 技术做简单数据可视化分析教程(实战)

    置顶 本人决定将过去一段时间在公司以及日常生活中关于自然语言处理的相关技术积累,将在gitbook做一个简单分享,内容应该会很丰富,希望对你有所帮助,欢迎大家支持. 内容介绍如下 你是否曾经在租房时因 ...

  5. 2 用python进行OpenCV实战之图像基本知识

    前言 在这一节,我们将学习图像的基本构成单元--像素,我们将详细的探讨什么是像素?像素是如何使用来构成图像的?然后学习如何通过OpenCV来获取和操纵像素. 1 什么是像素 所有的图像都包含一组像素, ...

  6. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    20210607 https://blog.csdn.net/u011828281/article/details/81171066 前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词 ...

  7. 实战清除电脑上恶意弹出广告窗口

    实战清除电脑上恶意弹出广告窗口 当你碰到电脑桌面右下角时不时弹出广告,如游戏推广.商品广告等,怎么删也删不掉,这是因为用户不小心安装有捆绑广告推广的软件,系统被静默安装了恶意木马广告,这不仅仅是影响用 ...

  8. deeplearning模型量化实战

    deeplearning模型量化实战 MegEngine 提供从训练到部署完整的量化支持,包括量化感知训练以及训练后量化,凭借"训练推理一体"的特性,MegEngine更能保证量化 ...

  9. DeepLabV3+语义分割实战

    DeepLabV3+语义分割实战 语义分割是计算机视觉的一项重要任务,本文使用Jittor框架实现了DeepLabV3+语义分割模型. DeepLabV3+论文:https://arxiv.org/p ...

最新文章

  1. 美团外卖美食知识图谱的迭代及应用
  2. HashMap数据类型使用注意-不能使用基本数据类型
  3. Fast RCNN 训练自己数据集 (1编译配置)
  4. JMeter 分布式性能测试
  5. 常用的PHP正则表达式汇总
  6. python中单下划线_foo与双下划线_Python中单下划线和双下划线
  7. decode 大于比较 小于_6 燃气输配系统6.3 压力不大于1.6Mpa的室外燃气管道城镇燃气设计规范 GB500282006(2020修订版)...
  8. Dubbo普普通通9问
  9. 【转】jsp+servlet和SSM分别是如何实现文件上传(示例)
  10. vc6.0 debug 比 release 快??_快速入门快应用——quickapp构建与发布
  11. PASCAL VOC2012 增强数据集
  12. 市场调研报告-全球与中国商业虚拟化平台市场现状及未来发展趋势
  13. HAL库控制PS2手柄
  14. 连接共享打印机时提示无法访问计算机,win10共享打印机提示无法访问.你可能没有权限使用网络资源怎么解决...
  15. BUGKU------秋名山老司机
  16. Windows10局域网找不到共享电脑
  17. NPM Error: Cannot find module ‘caniuse-lite/data/features/css-unicode-bidi.js‘
  18. 实施化工厂人员定位的原因详解--新导智能
  19. 推荐两个免费的论文查重网站(24小时一次)
  20. 为什么要关心分布式事务

热门文章

  1. python cx_oracle_Python3安装cx_Oracle连接oracle数据库实操总结
  2. Win64 驱动内核编程-13.回调监控模块加载
  3. C语言经典例22-乒乓球比赛名单问题
  4. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
  5. 【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
  6. 【计算机网络】网络层 : IP 组播 ( IP 数据报传输方式 | 组播 IP 地址 | 组播 MAC 地址 | IGMP 协议 | 组播路由选择协议 )
  7. 【Android 应用开发】LruCache 简介
  8. 【自定义注解使用】增加service层方法访问日志
  9. ngrep 比 tcpdump 更方便查看的抓包显示工具
  10. lava.lang.String数据转换为java.sql.Date