详细版:
Logminer是每个Dba都应熟悉的工具,当一天由于用户的误操作你需要做不完全的恢复时,由于你无法确定这个操作是哪个时间做的,所以这对你的恢复就带来的很大的难度,丢失的数据也不能完全恢复回来。而LogMiner就可以帮你确定这个误操作的准确时间。
一、LogMiner的几点说明
1、LogMiner可以帮你确定在某段时间所发的各种DML,DDL操作的具体时间和
SCN号,它所依据的是归档日志文件及联机日志文件。
2、它只能在Oracle8i及以后的版本中使用,不过它可以分析Oracle8的日志。
3、Oracle8i只能用于分析DML操作,到Oracle9i则可以分析DDL操作了。
4、LogMiner不支持索引组织表、Long、LOB及集合类型。
5、MTS的环境也不能使用LogMiner.
二、操作步骤
创建相关dbms_logmnr包时,
以下操作都需要已SYS用户,以SYSDBA的身份进行操作;其他身份应该是不允许的,现在还没验证
1.登陆操作窗口
1.1进到sqlplus操作平台:
1.2进入方式:
1.2.1 cmd进入:(开始->运行cmd->sqlplus)
SQL>sys/password@实例 as sysdba
1.2.2 Oracle应用程序进入:开始->所有程序->Oracle-OraHome92->Application Development->SQL PLUS))
SQL>sys/password@实例 as sysdba
1.2.3第三方工具:例PL/SQL Developer中的command window
sys/password@实例 as sysdba(登陆窗口输入)
2.要安装LogMiner工具,必须首先要运行下面这样两个脚本
2.1 创建DBMS_LOGMNR包
SQL>@ORACLE_HOME/rdbms/admin/dbmslm.sql
SQL>@ORACLE_HOME/rdbms/admin/dbmslmd.sql
第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件
第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件
在1.2.1和1.2.2中用SQL>@ORACLE_HOME/rdbms/admin/dbmslm.sql
这部分操作的时候,往往会出错(ORACLE_HOME验证可以用绝对路径如:d:/oracle/ora92)
而在1.2.3中使用SQL>$ORACLE_HOME/rdbms/admin/dbmslm.sql,这里一定要区分@和$的区别
3. 创建相关数据字典
(创建数据字典文件
数据字典文件是一个文本文件,由dbms_logmnr_d来创建。
首先需要修改参数UTL_FILE_DIR,该参数值为服务器中放置数据字典文件的目录,10g中通过动态修改参数的方式来修改,然后重启数据库方生效。其中该目录必须预先建立好。
SQL> show parameter utl_file_dir;
NAME TYPE VALUE
------------------------------------ -----------
utl_file_dir string
如果value中的值是空的,说明没有指定对应的utl_file_dir的值即服务器中放置数据字典文件的目录
4.修改初始化参数UTL_FILE_DIR,指定分析数据的存放处
SQL>alter system set UTL_FILE_DIR='/oracle/logminer' scope=spfile;
操作完之后再查看一下show parameter utl_file_dir
SQL> show parameter utl_file_dir;
NAME TYPE VALUE
------------------------------------ -----------
utl_file_dir string /oracle/logminer
5.重启数据库
SQL>shutdown immediate
(如果重启不了,可以通过管理工具中的服务重启相关oracle实例)
本人测试在cmd中能重启,在PL/SQL developer中重启不了;
SQL>startup
6.创建数据字典文件
SQL>execute dbms_logmnr_d.build(dictionary_filename =>'sqltrace.ora',dictionary_location =>' /oracle/logminer/');
生成数据字典文件,是通过dbms_logmnr_d.build()来完成。
dictionary_location指的是Logminer数据字典文件存放的位置,它必须匹配utl_file_dir的设定。其中的dictionary_filename指的是放于存放位置的字典文件的名字,名字可以任意取。
7.建立日志分析表
SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename =>'/ oracle/ora92/rdbms/ARC00009.001');
a、建立日志分析表数据库必须在mount或nomount状态,启动数据库到mount状态。
b、建立日志分析表,使用dbms_logmnr.add_logfile()
c、其中的options有三种取值,dbms_logmnr.new用于建一个日志分析
表;dbms_logmnr.addfile用于加入用于分析的的日志文件;dbms_logmnr.removefile用于移出用于分析的日志文件。
8.添加用于分析的日志文件
SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename=>'/oracle/ora92/rdbms/ARC00010.001');
SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename =>'/ /oracle/ora92/rdbms/ARC00011.001');
删除
SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.removefile,logfilenam
e =>'/oracle/ora92/rdbms/ARC00011.001');
9.启动LogMiner进行分析
9.1无限制条件
SQL> execute dbms_logmnr.start_logmnr(
DictFileName=>'/oracle/logminer/ sqltrace.ora');
注意,这里的sqltrace.ora就是前面创建的字典文件名。
分析过程根据所选取文件的数据量,可能需要几个小时。有时候,DBA可能并不需要这些日志文件中所有的数据,那么能否只分析部分数据呢?
9.2有限制条件
SQL> execute dbms_logmnr.start_logmnr(dictfilename =>'/opt/oracle/logminer/log/sqltrace.ora',starttime =>to_date('20040625 09:00:00','yyyymmdd hh24:mi:ss'),endtime =>to_date('20040625 22:00:00','yyyymmdd hh24:mi:ss'));
即分析20040625 09:00:00至20040625 22:00:00这段时间,并把分析结果放
到数据字典中以用于查询。还有两个参数StartScn(起始scn号)及EndScn(终止Scn)号。
也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName => '/dataoracle/oracle/logminer/dictionary.ora ',
StartScn => 20,EndScn => 50);
分析结束后,所分析到的数据可以从一个名为 V$LOGMNR_CONTENTS的视图中查询到。我们就可以应用这个视图中的内容来达成目的。
表1 DBMS_LOGMNR.START_LOGMNR过程参数含义
参数 |
参数类型 |
默认值 |
含义 |
StartScn |
数字型(Number) |
0 |
分析重作日志中SCN≥StartScn日志文件部分 |
EndScn |
数字型(Number) |
0 |
分析重作日志中SCN≤EndScn日志文件部分 |
StartTime |
日期型(Date) |
1998-01-01 |
分析重作日志中时间戳≥StartTime的日志文件部分 |
EndTime |
日期型(Date) |
2988-01-01 |
分析重作日志中时间戳≤EndTime的日志文件部分 |
DictFileName |
字符型(VARCHAR2) |
|
字典文件,该文件包含一个数据库目录的快照。使用该文件可以使得到的分析结果是可以理解的文本形式,而非系统内部的16进制 |
Options |
BINARY_INTEGER |
0 |
系统调试参数,实际很少使用 |
10.参看分析结果
select operation,sql_redo,sql_undo from v$logmnr_contents;
注:其中operation指的是操作,sql_redo指的是实际的操作,sql_undo指的是用于取消的相反的操作。
SQL_REDO 列显示的是所做的操作(SQL 语句),SQL_UNDO 列显示的是要恢复该操作所需要的SQL语句,只要顺序执行SQL_UNDO的内容,就可以恢复到修改前的数据。
使用这个方法恢复数据,好处在于不会有数据损失。否则只能做 incomplete recovery。
由于所有应用中,其实都是利用v$logmnr_contents这个视图,因此在此介绍一下该视图中特别有用的几个字段:
Seg_name: 表名;
Scn: SCN 号码
Sql_redo: 所作的sql 语句
Sql_undo: 对应sql_redo, 恢复用的sql 语句
Timestamp: sql 发出的具体时间
Operation: sql 的类型,分为INSERT, UPDATE, START(set …), COMMIT(commit), INTERNAL等
Session#: 发出该操作的 session
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
11.结束分析
SQL> execute dbms_logmnr.end_logmnr; 【终止日志分析事务,释放内存】
一旦结束视图v$logmnr_contents中的分析结果也随之不再在。
三、与LogMiner相关的数据字典。
1、v$loglist 它用于显示历史日志文件的一些信息
2、v$logmnr_dictionary 因logmnr可以有多个字典文件,该视图用于显示这方
面信息。
3、v$logmnr_parameters 它用于显示logmnr的参数
4、v$logmnr_logs 它用于显示用于分析的日志列表信息。
四、相关参考文件
http://blog.163.com/angel_yxf/blog/static/115569192008644112615/
http://www.itpub.net/forum.php?mod=viewthread&tid=1051633&highlight
http://dbua.iteye.com/blog/452398
http://blog.csdn.net/wzy126126/article/details/7323810
http://blog.sina.com.cn/s/blog_5e0fba9d0100ua8n.html
http://wenku.baidu.com/view/142b6f20dd36a32d73758193.html
操作版:
实际操作代码oracle9i
!远程telnet TELNET 192.168.0.55 ROOT/密码
本地CMD
1、登陆cmd
开始->运行->cmd
2、转到对应应用程序
sqlplus /nolog
3、登陆数据库
SQL>sys/密码@数据库 as sysdba;
4、创建DBMS_LOGMNR包和DBMS_LOGMNR_D包
SQL>/@ e:/oracle/ora92/rdbms/dbmslm.sql;
SQL>/@ e:/oracle/ora92/rdbms/dbmslmd.sql;
5、修改初始化参数UTL_FILE_DIR,指定分析数据的存放处
SQL>alter system set UTL_FILE_DIR=' e:/ oracle/logminer' scope=spfile;
6、重启数据库
SQL>shutdown immediate
SQL>startup
7、创建数据字典文件
SQL>execute dbms_logmnr_d.build(dictionary_filename =>'sqltrace.ora',dictionary_location =>' e:/ oracle/logminer');
8、建立日志分析表
SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename =>' e:/ oracle/logminer/redo01.log ');
8.1添加用于分析的日志文件
SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename=>' e:/ oracle/logminer/redo02.log’);
SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename =>’ e:/ oracle/logminer/redo03.log ');
9、启动LogMiner进行分析
SQL>execute dbms_logmnr.start_logmnr(dictfilename =>' e:/ oracle/logminer/sqltrace.or
a',starttime =>to_date('20040625 09:00:00','yyyymmdd hh24:mi:ss'),endtime =>to_d
ate('20040625 22:00:00','yyyymmdd hh24:mi:ss'));
10、参看分析结果
SQL>select operation,sql_redo,sql_undo from v$logmnr_contents;
11、得到对应的DML操作语句
SQL>create table 表名 as select operation,sql_redo,sql_undo from v$logmnr_contents;
12、结束分析
SQL>execute dbms_logmnr.end_logmnr;
本地PL/SQL Developer之
Command Window
1、创建DBMS_LOGMNR包和DBMS_LOGMNR_D包
SQL>$ORACLE_HOME/rdbms/admin/dbmslm.sql;
SQL>$ORACLE_HOME/rdbms/admin/dbmslmd.sql;
2.修改初始化参数UTL_FILE_DIR,指定分析数据的存放处
SQL>alter system set UTL_FILE_DIR='/oracle/logminer' scope=spfile;
3.重启数据库
SQL>shutdown immediate;
SQL>startup
4.创建数据字典文件
SQL>execute dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora', dictionary_location =>'/oracle/logminer');
5.建立日志分析表
SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename =>'/oracle/oradata/zxtwskp/REDO01.LOG');
6.添加用于分析的日志文件
SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename=>'/oracle/oradata/zxtwskp/REDO02.LOG');
7.启动LogMiner进行分析
SQL>execute dbms_logmnr.start_logmnr(dictfilename =>'/oracle/logminer/dictionary.ora',starttime =>to_date('20120302 17:00:00','yyyymmdd hh24:mi:ss'),endtime =>to_date('20120302 17:10:00','yyyymmdd hh24:mi:ss'));
8.参看分析结果
SQL>select sql_undo from v$logmnr_contents where username='BJWSKP' AND SEG_NAME='JDC_DM_CLZL1' and sql_undo like 'insert into%';
9.创建sql_undo语句
SQL>create table JDC_FPMX as select sql_undo from v$logmnr_contents where username='BJWSKP' AND SEG_NAME='JDC_DM_CLZL1' and sql_undo like 'insert into%';
9.1.处理数据;
处理需要复原的脚本
9.2.命令执行需要复原的DML/DDL
10.结束分析
SQL>execute dbms_logmnr.end_logmnr;