您的位置:首页 > 其它

分析ROLLBACK是否产生日志信息

2012-10-25 11:59 405 查看
首先介绍分析日志的方法,采用LOGMNR

流程如下:

SQL> @F:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\dbmslm.sql

程序包已创建。

授权成功。

同义词已创建。

SQL> @F:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\dbmslmd.sql

程序包已创建。

同义词已创建。

SQL> select log_mode from v$database;

LOG_MODE                                                                        
------------                                                                    
NOARCHIVELOG                                                                    

SQL> @F:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\dbmslms.sql

程序包已创建。

没有错误。

授权成功。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  778387456 bytes                                       
Fixed Size                  1374808 bytes                                       
Variable Size             301991336 bytes                                       
Database Buffers          469762048 bytes                                       
Redo Buffers                5259264 bytes                                       
数据库装载完毕。
--开启归档
SQL> alter database archivelog;

数据库已更改。

SQL> alter database open;

数据库已更改。
--创建日志字典路径
SQL> alter system set utl_file_dir='d:\logmin' scope=spfile;

系统已更改。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  778387456 bytes                                       
Fixed Size                  1374808 bytes                                       
Variable Size             301991336 bytes                                       
Database Buffers          469762048 bytes                                       
Redo Buffers                5259264 bytes                                       
数据库装载完毕。
数据库已经打开。
SQL> begin
  2  dbms_logmnr_d.build(
  3  dictionary_filename=>'logmin_dict.dat',
  4  dictionary_location=>'d:\logmin');
  5  end;
  6  /

PL/SQL 过程已成功完成。

SQL> execute dbms_logmnr.add_logfile(options=>dbms_logmnr.new,logfilename=>'F:\app\Administrator\oradata\orcl\REDO01.LOG');

PL/SQL 过程已成功完成。
                                                             

SQL> begin
  2  dbms_logmnr.start_logmnr(
  3   dictfilename=>'d:\logmin\logmin_dict.dat'
  4  );
  5  end;
  6  /

PL/SQL 过程已成功完成。

SQL> select count(*) from v$logmnr_contents;

  COUNT(*)                                                                      
----------                                                                      
     50496                                                                      

SQL> create table log_back as select * from v$logmnr_contents;

表已创建。

SQL>execute dbms_logmnr.end_logmnr();
PL/SQL 过程已成功完成。

SQL> spool off


直接使用包来分析日志(11g r2的版本)

--使用包分析日志的方法
exec dbms_logmnr.add_logfile('/data/archive/redo001.log',dbms_logmnr.new);
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
--查询日志信息
select timestamp,scn,sql_redo
from v$logmnr_contents
where lower(sql_redo) like '%insert%'
and seg_name='TEST'
and seg_owner='TEST';

dbms_logmnr.end_logmnr(); --停止日志分析



注意:

如果所有操作只回滚不提交的话,最后生成的归档日志是不会有任何人工操作数据的(可能会有一些系统操作的数据信息).

SQL> select group#,archived,status,first_time from v$log;

GROUP# ARC STATUS FIRST_TIME

---------- --- ---------------- -------------------

1 YES INACTIVE 2012-10-25 11:17:50

2 NO CURRENT 2012-10-25 11:17:57

3 YES INACTIVE 2012-10-25 11:17:39

也就是现在分析1和3,v$logmnr_contents表里没有任何信息(之前我只有做rollback,未做任何commit事务).只有分析2、CURRENT状态的才有数据.

还要注意的是如果分析活动的日志(如现在分析GROUP 2),有时候不能使用INSERT INTO TT select * from v$logmnr_contents,来保存日志数据,它会提示如下错误:

第 1 行出现错误:

ORA-00310: 归档日志包含序列 290; 要求序列 287

ORA-00334: 归档日志: 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'

这个不是很清楚原因,个人猜想可能是ARC进程正在归档造成的,此时查询V$LOG发现如下:

SQL> select group#,archived,status,first_time from v$log

GROUP# ARC STATUS FIRST_TIME

---------- --- ---------------- -------------------

1 YES ACTIVE 2012-10-25 12:08:45

2 YES ACTIVE 2012-10-25 12:09:41

3 NO CURRENT 2012-10-25 12:09:45



在分析日志组2(状态为:CURRENT)的数据时发现,如果insert操作后(

语句为:

begin

for i in 1..1000 loop

INSERT into tt002 values(i,'aa');

end loop;

end;)

不rollback,也不commit.分析后的日志信息如下:

TIMESTAMP SCN

------------------- ----------

SQL_REDO

--------------------------------------------------------------------------------

2012-10-25 11:34:38 3813555

insert into "TEST"."TT002"("I","J") values ('1','aa');



2012-10-25 11:34:38 3813555

insert into "TEST"."TT002"("I","J") values ('2','aa');



2012-10-25 11:34:38 3813555

insert into "TEST"."TT002"("I","J") values ('3','aa');

......

如果ROLLBACK之后,产生的日志信息如下:

SQL> select timestamp,scn,sql_redo

2 from v$logmnr_contents

3 where lower(sql_redo) like '%tt002%' and lower(sql_redo) like '%delete%';

TIMESTAMP SCN

------------------- ----------

SQL_REDO

--------------------------------------------------------------------------------

2012-10-25 11:36:26 3813606

delete from "TEST"."TT002" where ROWID = 'AAAS0lAAEAAAAFbAGB';



2012-10-25 11:36:26 3813606

delete from "TEST"."TT002" where ROWID = 'AAAS0lAAEAAAAFbAGA';



2012-10-25 11:36:26 3813606

delete from "TEST"."TT002" where ROWID = 'AAAS0lAAEAAAAFbAF/';

.....

也就是说回滚INSERT对应产生了DELETE的日志信息.

-----------------------------------------------------------------

如此文有错误,欢迎指正,顺便告诫自己一定要多动手,实践才能出真理,切勿想当然.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐