Logminer实战
相信许多DBA同学都曾遇到过这种情况,由于各种各样的原因,必须对数据库做不完全恢复;但又不确定应该恢复到哪个时间点或SCN才合适,因而反复的执行不完全恢复,悲剧掉了一地,中枪的有木有?温馨提示下,在生产环境中做不完全恢复前,可能的话,先对现场做一次备份,有备无患!前面的是第一个问题,当找对了不完全恢复的时间点并成功执行不完全恢复后,后面的更改如何重做?让客户重演一遍?想都别想?打个比方,当前时间为上午11:00,不完全恢复的时间为上午8:30,把数据库状态恢复到上午8:30后,8:30到11:00这3.5小时的数据库更改如何重演,这时间拖的越长就越悲剧!
Oracle从8i后提供了一个logminer免费的日志挖掘工具,可以解析归档,在线日志中的具体内容,针对前面提出的2个问题,可以很好的解决!下面使用oracle 10g平台来实战下…
一:对数据库执行备份,生产环境中,这种操作都是计划性的,过期的备份还应该定期归档
- [oracle@rhel6 ~]$ rman target /
- Recovery Manager: Release 10.2.0.1.0 - Production on Wed May 9 19:24:02 2012
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- connected to target database: ORCL (DBID=1289365799)
- RMAN> list backup of database;
- using target database control file instead of recovery catalog
- RMAN> backup database;
- RMAN> list backup of database summary;
- List of Backups
- ===============
- Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
- ------- -- -- - ----------- ------------------- ------- ------- ---------- ---
- 1 B F A DISK 2012-05-09:19:25:20 1 1 NO TAG20120509T192436
二:开启数据库的记录附加日志属性,详细作用参考:http://space.itpub.net/7607759/viewspace-462640
- [oracle@rhel6 ~]$ sqlplus /nolog
- SQL*Plus: Release 10.2.0.1.0 - Production on Wed May 9 19:26:14 2012
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- SQL> conn /as sysdba
- Connected.
- SQL> select supplemental_log_data_min from v$database;
- SUPPLEME
- --------
- NO
- SQL> alter database add supplemental log data;
- Database altered.
- SQL> select supplemental_log_data_min from v$database;
- SUPPLEME
- --------
- YES
三:创建测试数据
- SQL> conn hr/hr
- Connected.
- SQL> create table t1 as select * from employees;
- Table created.
- SQL> select count(*) from t1;
- COUNT(*)
- ----------
- 107
- 这里记录系统时间主要用于后面的对比,真实环境下是得不到这种信息的!
- SQL> select sysdate from dual;
- SYSDATE
- -------------------
- 2012-05-09:19:28:52
- SQL> truncate table t1;
- Table truncated.
- 在执行误操作后,用户继续其他的更新操作,同时数据库进行了日志切换
- SQL> create table t2 (id number);
- Table created.
- SQL> insert into t2 values (1);
- 1 row created.
- SQL> insert into t2 values (2);
- 1 row created.
- SQL> commit;
- Commit complete.
- SQL> conn /as sysdba
- Connected.
- SQL> archive log list;
- Database log mode Archive Mode
- Automatic archival Enabled
- Archive destination USE_DB_RECOVERY_FILE_DEST
- Oldest online log sequence 20
- Next log sequence to archive 22
- Current log sequence 22
- SQL> alter system switch logfile;
- System altered.
四:问题出现,现在需要将前面truncate的表找回,首先需要确定不完全恢复时间点的问题!下面开始介绍如何使用logminer
1:设置utl_file_dir初始化参数,重启数据库
- SQL> show parameter utl_file;
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- utl_file_dir string
- SQL> alter system set utl_file_dir='/home/oracle/utl_file_dir' scope=spfile;
- System altered.
- SQL> shutdown immediate
- Database closed.
- Database dismounted.
- ORACLE instance shut down.
- SQL> startup
- ORACLE instance started.
- Total System Global Area 213909504 bytes
- Fixed Size 2019640 bytes
- Variable Size 104861384 bytes
- Database Buffers 100663296 bytes
- Redo Buffers 6365184 bytes
- Database mounted.
- Database opened.
- SQL> show parameter utl_file;
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- utl_file_dir string /home/oracle/utl_file_dir
- SQL> !mkdir -p /home/oracle/utl_file_dir
2:使用sys用户执行下面的3个sql脚本
- SQL> show user;
- USER is "SYS"
- SQL> @?/rdbms/admin/dbmslms.sql;
- Package created.
- No errors.
- Grant succeeded.
- SQL> @?/rdbms/admin/dbmslm.sql;
- Package created.
- Grant succeeded.
- SQL> @?/rdbms/admin/dbmslmd.sql;
- Package created.
3:创建数据字典文件,该字典文件是可选的,但是如果没有它,LogMiner解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是16进制的形式,我们是无法直接理解的
- SQL> exec dbms_logmnr_d.build(dictionary_filename => 'V10201dict.ora',dictionary_location => '/home/oracle/utl_file_dir');
- PL/SQL procedure successfully completed.
- SQL> !file /home/oracle/utl_file_dir/V10201dict.ora
- /home/oracle/utl_file_dir/V10201dict.ora: ASCII English text, with very long lines
- SQL> !du -sh /home/oracle/utl_file_dir/V10201dict.ora
- 23M /home/oracle/utl_file_dir/V10201dict.ora
4:添加在线日志,进行日志挖掘;生产环境中,一般都会将源库的数据字典和日志文件拷贝到测试库上分析,源库不继续以read write方式打开
- SQL> select member from v$logfile where type='ONLINE';
- MEMBER
- ----------------------------------------
- /u01/app/oracle/oradata/orcl/redo03.log
- /u01/app/oracle/oradata/orcl/redo02.log
- /u01/app/oracle/oradata/orcl/redo01.log
- SQL> exec dbms_logmnr.add_logfile(logfilename => '/u01/app/oracle/oradata/orcl/redo01.log',options => dbms_logmnr.new);
- PL/SQL procedure successfully completed.
- SQL> exec dbms_logmnr.start_logmnr(dictfilename => '/home/oracle/utl_file_dir/V10201dict.ora',options => dbms_logmnr.ddl_dict_tracking);
- PL/SQL procedure successfully completed.
5:查看v$logmnr_contents视图是否有相关的信息
- SQL> select distinct username from v$logmnr_contents;
- USERNAME
- ------------------------------
- SYSMAN
- SYS
- SQL> select count(*) from v$logmnr_contents;
- COUNT(*)
- ----------
- 189963
6:在线日志挖掘完后,发现没有相关的信息,则开始挖掘归档日志文件
- 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);
- PL/SQL procedure successfully completed.
- SQL> exec dbms_logmnr.start_logmnr(dictfilename => '/home/oracle/utl_file_dir/V10201dict.ora',options => dbms_logmnr.ddl_dict_tracking);
- PL/SQL procedure successfully completed.
- SQL> select distinct username from v$logmnr_contents;
- USERNAME
- ------------------------------
- HR
- SYSMAN
- SYS
7:通过查看v$logmnr_contents可以清楚的确定truncate的具体时间和之后的操作
- SQL> col sql_redo format a60 trunc
- SQL> select sql_redo,timestamp from v$logmnr_contents where username='HR' and table_name='T1' and operation='DDL';
- SQL_REDO TIMESTAMP
- ------------------------------------------------------------ -------------------
- create table t1 as select * from employees; 2012-05-09:19:28:25
- truncate table t1; 2012-05-09:19:29:03
- SQL> select username,sql_redo,timestamp from v$logmnr_contents where timestamp > '2012-05-09:19:29:03' and username not in ('SYS','SYSMAN');
- USERNAME SQL_REDO TIMESTAMP
- ---------- ---------------------------------------- -------------------
- HR set transaction read write; 2012-05-09:19:29:27
- HR 2012-05-09:19:29:27
- HR insert into "SYS"."OBJ$"("OBJ#","DATAOBJ 2012-05-09:19:29:27
- HR set transaction read write; 2012-05-09:19:29:27
- HR 2012-05-09:19:29:27
- HR set transaction read write; 2012-05-09:19:29:27
- HR 2012-05-09:19:29:27
- HR commit; 2012-05-09:19:29:27
- HR insert into "SYS"."SEG$"("TS#","FILE#"," 2012-05-09:19:29:27
- HR update "SYS"."TSQ$" set "GRANTOR#" = '0' 2012-05-09:19:29:27
- HR commit; 2012-05-09:19:29:27
- USERNAME SQL_REDO TIMESTAMP
- ---------- ---------------------------------------- -------------------
- HR set transaction read write; 2012-05-09:19:29:27
- HR 2012-05-09:19:29:27
- HR commit; 2012-05-09:19:29:27
- HR insert into "SYS"."TAB$"("OBJ#","DATAOBJ 2012-05-09:19:29:27
- HR insert into "SYS"."COL$"("OBJ#","COL#"," 2012-05-09:19:29:27
- HR create table t2 (id number); 2012-05-09:19:29:27
- HR update "SYS"."SEG$" set "TYPE#" = '5', " 2012-05-09:19:29:27
- HR commit; 2012-05-09:19:29:27
- HR set transaction read write; 2012-05-09:19:29:39
- HR insert into "HR"."T2"("ID") values ('1') 2012-05-09:19:29:39
- HR insert into "HR"."T2"("ID") values ('2') 2012-05-09:19:29:43
- USERNAME SQL_REDO TIMESTAMP
- ---------- ---------------------------------------- -------------------
- HR commit; 2012-05-09:19:29:43
- 23 rows selected.
五:执行不完全恢复
- SQL> shutdown immediate
- Database closed.
- Database dismounted.
- ORACLE instance shut down.
- SQL> startup mount
- ORACLE instance started.
- Total System Global Area 213909504 bytes
- Fixed Size 2019640 bytes
- Variable Size 109055688 bytes
- Database Buffers 96468992 bytes
- Redo Buffers 6365184 bytes
- Database mounted.
- [oracle@rhel6 ~]$ rman target /
- Recovery Manager: Release 10.2.0.1.0 - Production on Wed May 9 20:21:30 2012
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- connected to target database: ORCL (DBID=1289365799, not open)
- RMAN> restore database;
- RMAN> run {
- 2> set until time "to_date('2012-05-09:19:29:00','YYYY-MM-DD:HH24:MI:SS')";
- 3> recover database;
- 4> }
- RMAN> alter database open resetlogs;
- database opened
- RMAN> list incarnation;
- List of Database Incarnations
- DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
- ------- ------- -------- ---------------- --- ---------- ----------
- 1 1 ORCL 1289365799 PARENT 1 2005-10-22:21:44:08
- 2 2 ORCL 1289365799 PARENT 525876 2011-09-11:15:24:27
- 3 3 ORCL 1289365799 CURRENT 831637 2012-05-09:20:26:35
六:剩下的就是根据v$logmnr_contents视图中的sql_redo补齐之后的数据
- [oracle@rhel6 ~]$ sqlplus /nolog
- SQL*Plus: Release 10.2.0.1.0 - Production on Wed May 9 20:27:34 2012
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- SQL> conn hr/hr
- Connected.
- SQL> select count(*) from t1;
- COUNT(*)
- ----------
- 107
- SQL> select count(*) from t2;
- select count(*) from t2
- *
- ERROR at line 1:
- 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实战的更多相关文章
- logminer实战之生产环境写入数据字典,dg环境查询拷贝日志,测试环境进行挖掘,输出结果
应客户需要,对某一天的日志进行挖掘,分析日均归档日志切换数量20增长至40的原因,是什么表的dml操作导致的日志量剧增,最终定位某个应用(需要客户自己进行甄别) 操作说明及介绍: 1.客户10.2.0 ...
- 想了解FlinkX-Oracle Logminer?那就不要错过这篇文章
FlinkX-Oracle Logminer模块是FlinkX基于Logminer对Oracle重做日志进行实时采集分析,可对Oracle进行实时同步也可以通过指定SCN或者时间戳从某个节点进行同步, ...
- LogMiner学习笔记
本文是个实战,没有讲太多理论的东西,如需详细理解Oracle LogMiner,请移步:LogMiner详细讲解 首先介绍一下我的oracle环境: 第一步: 确定LogMiner已经安装. 安装Lo ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- asp.net core 实战之 redis 负载均衡和"高可用"实现
1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
随机推荐
- 宝马-中国官方网站服务站点信息爬去记录(解析json中数据)
具体步骤: 1.进入宝马官网,查找经销商查询界面 http://www.bmw.com.cn/cn/zh/general/dealer_locator/content/dealer_locator.h ...
- UVA 524
Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers ...
- Oracle表连接
一个普通的语句select * from t1, t2 where t1.id = t2.id and t1.name = 'a'; 这个语句在什么情况下最高效? 表连接分类: 1. 嵌套循环连接(N ...
- git - 必备指令
1. 查看远程分支 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): $ git branch -a master remote tungway v1. * zron ...
- bnu 4352 XsugarX的疯狂按键识别(暴力模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4352 [题意]:给你个长串,输出该长串中能第一放出的技能,每个技能有对应的一个小子串,不能放出任何技 ...
- JAVA多线程synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...
- The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemG:Give Me the Number
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2971 题意:将输入的英文数字表达转化为阿拉伯数字. #include< ...
- IOS 录像软件
http://iphone.91.com/tutorial/cjjc/140430/21683219.html
- 1987-A. 集训队选拔
描述 南邮ACM暑期集训队一年一度的选拔如火如荼的开始了.按照以往的惯例,通过ACM校赛预赛和决赛的两轮选拔,成绩优异者将入选集训队,获得下半年在各大赛区现场赛上与各路神牛角逐奖牌的机会.但是,校赛的 ...
- c缺陷与陷阱笔记-第四章 连接
1.变量的声明. 在不同的源文件中,应该是1个定义+多个声明的形式存在的,并且声明的类型和定义的类型要一样,否则可能会报错. 声明 : extern 类型 变量名 声明并定义: extern 类型 变 ...