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的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
随机推荐
- 3DSoftRenderer
研究了好几天基本的图形学,对于光栅化的大致过程有点了解了,很感谢网上的很多大牛的无私奉献,我就写一下这几天的总结,希望也能对网络上的知识做出一点点点的贡献. 屏幕有什么特点,无非是一排排的像素点,每个 ...
- C#学习笔记---基础入门(三)
泛型<T> 使用泛型能够最大限度的重用代码/保护类型安全,提高性能 泛型成员因为类型的不确定性,不能使用算术运算符/比较运算符 类型参数可以有多个,可以是编译器能够识别的任何类型 类型参数 ...
- Gnome 插件介绍
插件:Applications Menuhttps://extensions.gnome.org/extension/6/applications-menu/ TopIconshttps://exte ...
- 2337:[HNOI2011]XOR和路径 - BZOJ
昨天才做了一道高斯消元,一下要精度判断,一下又不要精度判断 主要是思路很重要 很容易想到每一个二进制位算一个概率,然后求和,设f[i]为走到从i走到n这一个二进制位为1的概率 f[i]:=∑{f[j] ...
- [转载]VS2012创建MVC3项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”。
如果在没有安装vs2012 update3升级包的情况下,创建MVC3项目会出现下面的错误信息. 因为VS2012已经全面切换到使用NuGet这个第三方开源工具来管理项目包和引用模块了,使用VS201 ...
- win8 优化笔记
win8可以关掉的服务: 以下是小编搜集的可以安全更改为手动启动的服务(按名称排序): Application Experience(启动时为程序处理应用程序兼容性缓存请求) ·Computer Br ...
- uva 10034
计算所有点之间的权值 然后就是最小生成树 #include<cstring> #include<string> #include<cstdio> #includ ...
- Android支付接入(四):联通VAC计费
原地址:http://blog.csdn.net/simdanfeg/article/details/9012031 注意事项: 1.联通支付是不需要自己标识软硬计费点的,当平台申请计费点的时候会提交 ...
- 1027-Quicksum
描述 A checksum is an algorithm that scans a packet of data and returns a single number. The idea is t ...
- oracle 增加字段
之前很多表增加很多相同的字段,一个一个添加太慢烦了,于是用了以下的方法alter table t_xmlc_batch_out_head_bak add ( SENDRECEIVEFLAG ) , S ...