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的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
随机推荐
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- Ext Grid 加载超时设置timeout: 180000
var insideGridStore = Ext.create('Ext.data.Store', { model: 'CarComponents',//这个地方CarComponents不是一个对 ...
- Entity Framework 学习笔记(一)安装
1.通过 VS2013 下载,这个没有限制,因为我用的vs是2013 Entity Framework包
- SC命令详解
我们知道在MStools SDK,也就是在Resource Kit有一个很少有人知道的命令行软件,SC.exe,这个软件向所有的Windows NT和Windows 2000要求控制他们的API函数. ...
- 给QT不规则窗口添加阴影
在家休息,试着用QT去模仿各类管家软件的界面,做到自绘阴影的时候,蛋疼了. 网上搜到的基本都是一篇文章转来转去,一开始也被思路限制了. 尝试重载paintEvent,然后自己绘制矩形阴影,但是绘制的算 ...
- mybatis foreach标签
一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrde ...
- [转载]C#导入XLS数据到数据库
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...
- 在smarty模板中嵌入php代码
我个人并不太喜欢smarty的语法,写起来比较啰嗦易出现匹配出错,但是旧项目中有许多工程都是采用它作模板.最近需要在此上稍微加一些PHP的内容,但我不想在模板控制层去一个一个assign,而想在模板文 ...
- POJ3273Monthly Expense(二分)
http://poj.org/problem?id=3273 题意: 农夫约翰给出了n天的每天花费 ,让你将这n天分成m组,每组中存在的天数必须是连续的,然后让每组里花费的总和尽量的小,最后将花费最大 ...
- ASP.NET 全局变量和页面间传值方法
http://www.cnblogs.com/dgjack/archive/2011/05/28/2060913.html 1. 使用QueryString变量 QueryString是一种非常简单的 ...