现在的位置: 首页 > 综合 > 正文

对ORACLE 已提交的事务进行回滚之详细版和操作版

2013年12月10日 ⁄ 综合 ⁄ 共 7719字 ⁄ 字号 评论关闭

 

详细版:

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;

 

抱歉!评论已关闭.