分析ROLLBACK是否产生日志信息
2012-10-25 11:59
405 查看
首先介绍分析日志的方法,采用LOGMNR
流程如下:
直接使用包来分析日志(11g r2的版本)
注意:
如果所有操作只回滚不提交的话,最后生成的归档日志是不会有任何人工操作数据的(可能会有一些系统操作的数据信息).
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的日志信息.
-----------------------------------------------------------------
如此文有错误,欢迎指正,顺便告诫自己一定要多动手,实践才能出真理,切勿想当然.
流程如下:
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的日志信息.
-----------------------------------------------------------------
如此文有错误,欢迎指正,顺便告诫自己一定要多动手,实践才能出真理,切勿想当然.
相关文章推荐
- 「信息安全产品」综合日志分析系统
- hadoop日志分析系统二 第一部分 利用任务调度系统定期的把web系统所产生的日志文件导入到hdfs中
- rollback产生redo及logmnr查看日志内容
- 在linux中使用shell来分析统计日志中的信息
- 如果一个触发器中只有一条Null语句,是否会产生日志?为什么?
- 从用户email信息分析是否为qq邮箱并截取qq号的sql语句
- 网卡信息和简单日志分析
- 在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用时间查看器查看事件日志
- How To:分析ORACLE监听日志中的IP信息
- WCF 寄宿于Windows服务 ,可能会报的错:在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用事件查看器查看事件日志。
- C# 通过分析netstat -an所得信息 查看本机所监听的端口 及判断某端口是否可用
- [20140403]查询是否产生日志
- 单据传输问题的2个日志信息分析
- 在linux中使用shell来分析统计日志中的信息
- 苹果机之看系统日志 | 分析信息第一步
- 医学图像分析领域的会议与期刊信息 - clypzb的日志 - 网易博客
- dmesg :分析核心产生的信息
- 分析日志抓取信息
- 弹出应用程序: 服务控制管理器 : 在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用事件查看器查看事件日志
- hadoop日志分析系统二 第一部分 利用任务调度系统定期的把web系统所产生的日志文件导入到hdfs中