`

Oracle: REDO&UNDO

阅读更多

 在这里会介绍UNDO,REDO是如何产生的,对TRANSACTIONS的影响,以及他们之间如何协同工作的。
什么是REDO
       REDO记录transaction logs,分为online和archived。以恢复为目的。
       比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点。
       比如,磁盘坏了,需要用archived redo logs和online redo logs区恢复数据。
       比如,truncate一个表或其他的操作,想恢复到之前的状态,同样也需要。
什么是UNDO
       REDO是为了重新实现你的操作,而UNDO相反,是为了撤销你做的操作,比如你得一个TRANSACTION执行失败了或你自己后悔了,则需要用ROLLBACK命令回退到操作之前。回滚是在逻辑层面实现而不是物理层面,因为在一个多用户系统中,数据结构,blocks等都在时时变化,比如我们INSERT一个数据,表的空间不够,扩展了一个新的EXTENT,我们的数据保存在这新的EXTENT里,其它用户随后也在这EXTENT里插入了数据,而此时我想ROLLBACK,那么显然物理上讲这EXTENT撤销是不可能的,因为这么做会影响其他用户的操作。所以,ROLLBACK是逻辑上回滚,比如对INSERT来说,那么ROLLBACK就是DELETE了。
COMMIT
       以前,常想当然地认为,一个大的TRANSACTION(比如大批量地INSERT数据)的COMMIT会花费时间比短的TRANSACTION长。而事实上是没有什么区别的,因为ORACLE在COMMIT之前已经把该写的东西写到DISK中了,我们COMMIT只是
1,产生一个SCN给我们TRANSACTION,SCN简单理解就是给TRANSACTION排队,以便恢复和保持一致性。
2,REDO写REDO到DISK中(LGWR,这就是log file sync),记录SCN在ONLINE REDO LOG,当这一步发生时,我们可以说事实上已经提交了,这个TRANSACTION已经结束(在V$TRANSACTION里消失了)
3,SESSION所拥有的LOCK(V$LOCK)被释放。
4,Block Cleanout(这个问题是产生ORA-01555: snapshot too old的根本原因)
ROLLBACK
       ROLLBACK和COMMIT正好相反,ROLLBACK的时间和TRANSACTION的大小有直接关系。因为ROLLBACK必须物理上恢复数据。COMMIT之所以快,是因为ORACLE在COMMIT之前已经作了很多工作(产生UNDO,修改BLOCK,REDO,LATCH分配),ROLLBACK慢也是基于相同的原因。
       ROLLBACK会
       1,恢复数据,DELETE的就重新INSERT,INSERT的就重新DELETE,UPDATE的就再UPDATE。
       2,RELEASE LOCK
 
       ROLLBACK要比COMMIT消耗更多资源,因为ORACLE认为你一旦做数据更新,那么就意味着你要COMMIT(其他数据库不全是这种设计理念,比如DB2),所以在你更新数据的时候就做了大量的工作,这也可以理解为什么不建议用TABLE来做TEMPORARY TABLE。(TEMP TABLE消耗的REDO比固定表在INSERT时要少很多      ,UPDATE时差不多是1/2,但是DELETE却相差无几)
REDO
       产生REDO 越多,你的系统越慢,不但影响你自己的SESSION,还影响其他SESSION,LGWR管理REDO,并且是TRANSACTION的结束标志。
       首先要知道怎么监控REDO,当然,SET AUTOTRACE ON可以,不过只能监控DML语句,而像PROCEDURE则无法监视。那么我们就需要观察字典了,V$MYSTAT, V$STATNAME,前面有两个脚本,mystat,mystat2
SQL> @mystat "redo size"
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo size                                                           1016784
SQL> insert into t select * from big_table;
已创建46990行。
SQL> @mystat2
NAME                                                                      V
---------------------------------------------------------------- ----------
DIFF
----------------
redo size                                                           6604308
       5,587,524
       看到产生了5,587,524的REDO,再对比下用NOLOG插入
SQL> @mystat "redo size"
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo size                                                           6604308
SQL> insert into t select * from big_table;
已创建46990行。
SQL> @mystat2
NAME                                                                      V
---------------------------------------------------------------- ----------
DIFF
----------------
redo size                                                           6616220
          11,912
       看到APPEND插入用了11,912字节的REDO,比一般性插入要少很多。
       或者用这个PROCEDURE也可以观察SQL消耗的REDO
create or replace procedure do_sql( p_sql in varchar2 )
2 as
3 l_start_redo number;
4 l_redo number;
5 begin
6 select v$mystat.value
7 into l_start_redo
8 from v$mystat, v$statname
9 where v$mystat.statistic# = v$statname.statistic#
10 and v$statname.name = 'redo size';
11
12 execute immediate p_sql;
13 commit;
14
15 select v$mystat.value-l_start_redo
16 into l_redo
17 from v$mystat, v$statname
18 where v$mystat.statistic# = v$statname.statistic#
19 and v$statname.name = 'redo size';
20
21 dbms_output.put_line
22 ( to_char(l_redo,'9,999,999') ||' bytes of redo generated for "' ||
23 substr( replace( p_sql, chr(10), ' '), 1, 25 ) || '"...' );
24 end;
25 /      
      用法就不多说了。
减少REDO
       既然REDO这么消耗资源,那我们能屏蔽REDO吗?显然不能,那我们能减少REDO吗?这是可以的(注意,9.2以后,可以用FORCE  LOGGING开关来控制是否强制REDO,如果YES,则不管NOLOGGING还是APPEND都是不起任何作用的,可以SELECT FORCE_LOGGING FROM V$DATABASE查看是否FORCE。另外需要明白,没有一个办法能彻底不记录REDO,只能是减少REDO。因为不管如何,数据字典总是要产生一些REDO的。
create table nologging as select xxx新建的表没有原来表的索引和默认值,只有非空(not null)的约束素条件可以继承过来.
INSERT INTO target_tablename SELECT 如果运行此命令时还有对target_tablename的DML操作会排队在它后面,对OLTP系统在用的表操作是不合适的。快速插入数据可以指定append提示,但是需要注意 noarchivelog模式下,默认用了append就是nologging模式的。  在archivelog下,需要把表设置程Nologging模式。可以通过如下语句设置为NO FORCE LOGGING。                  Alter database no force logging;
这两种方法转移数据时没有用SGA里数据缓冲区和事物处理的回滚段, 也不写联机事物日志,就象数据库装载工具SQLLOAD一样直接把数据写到物理文件。
REDO的问题
    有时,会在ALERT中发现
Thread 1 cannot allocate new log, sequence 1466
Checkpoint not complete
Current log# 3 seq# 1465 mem# 0: /home/ora10g/oradata/ora10g/redo03.log
       这问题出现在系统尝试reuse online redo log file但是却没有可用的。可能是由于DBWR没有完成(Checkpoint not complete)或ARCH没有完成。
       1,DBWR,用多DBWR  process,合理分布数据,
       2,增加REDO LOG FILE
       3,扩大REDO的大小
       4,让CHECKPOINT发生更频繁,可以减少block buffer cache,FAST_START_MTTR_TARGET, LOG_CHECKPOINT_INTERVAL,LOG_CHECKPOINT_TIMEOUT。(要考虑全面哟)

分享到:
评论

相关推荐

    oracle_redo_undo

    Oracle Redo 和 Undo Mechanism Oracle 中的 redo 和 undo 机制是数据库的核心组件,它们一起协作以确保数据库的事务一致性和可靠性。在本文中,我们将深入探讨 redo 和 undo 机制的工作原理和协作机制。 Undo ...

    ORACLE redo undo.docx

    Oracle redo undo 机制详解 Oracle redo undo 是 Oracle 数据库中的一种机制,用于确保事务的可恢复性和撤销性。下面是对 redo undo 机制的详细解释。 redo 机制 redo 机制是 Oracle 数据库中的一种机制,用于...

    Oracle_Undo与Redo的通俗

    Oracle_Undo与Redo的通俗 Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction...

    oracle的undo与redo

    在Oracle中,日志文件发挥着关键作用,其中Undo日志和Redo日志是最核心的两种日志类型。 Undo日志,也称为撤销日志,主要用于事务处理中。它的主要作用是记录事务执行之前的数据库状态,即数据块在被修改之前的所有...

    Oracle的Temp表空间和UNDO表空间的处理

    ### Oracle的Temp表空间与UNDO表空间处理详解 #### 一、Temp表空间处理 在Oracle数据库中,Temp表空间主要用于存储临时对象,如排序、分组等操作产生的临时数据。这些操作可能会导致Temp表空间迅速增大。然而,...

    redo与undo_a.pdf11

    "redo与undo_a.pdf"很可能是关于这个主题的一个详细教程或研究报告,可能涵盖了如何配置和管理redo日志文件,如何使用undo来支持事务的ACID属性(原子性、一致性、隔离性和持久性),以及如何在Oracle数据库中实现...

    RAC下的REDO和UNDO管理

    在Oracle数据库的Real Application Clusters (RAC)环境中,REDO和UNDO管理扮演着至关重要的角色,确保数据的安全性、事务处理以及数据恢复。在RAC架构中,多个实例共享同一物理数据库,这就需要对REDO和UNDO管理进行...

    Oracle中重做undo表空间

    Undo表空间是用来存储事务撤销操作时所需信息的地方,这些信息被称为重做日志(Redo Log)。当一个事务对数据进行修改时,Oracle会记录下这些修改前的状态,以便在事务回滚或系统崩溃时恢复数据。下面将详细讲解undo...

    Oracle 面试宝典-undo.docx

    2. 实例恢复:在实例故障后,Oracle数据库通过redo日志来恢复未持久化的数据。对于未提交的事务,Oracle会根据Undo的记录进行逻辑回滚,将脏块恢复到未修改状态。 3. 提供一致性读:在并发环境中,查询可能遇到其他...

    12c 新特性-Temporary Undo

    在Oracle 12c版本中引入了一项重要的新特性——Temporary Undo,这项技术旨在优化临时表的操作性能,并减少对Redo日志的空间占用。传统的临时表在进行更新操作时,虽然不会产生Redo条目,但相关的Undo信息仍然会被...

    oracle undo详解

    Undo信息与重做日志(Redo Log)有所不同,Redo Log记录了如何重新生成更改,用于数据库的向前滚动恢复,而Undo则记录如何还原更改,用于回退和读取一致性。 管理Undo数据主要包括监控Undo表空间的空闲空间,防止...

    ORACLE的UNDO表空间

    在 Oracle 中,Undo 和 Redo 是两个不同的概念。Undo 代表撤销操作,而 Redo 代表重做操作。它们都是 Oracle 数据库中用于维护数据一致性的机制。 1.1. Undo 与 Redo 的区别 Undo 和 Redo 的主要区别在于它们的...

    ORACLE数据库体系架构视频教程详细完整版

    第四章:redo日志 1 第五章:归档日志 archivelog 第六章:日志挖掘 logminer 第七章:管理undo 第八章: 检查点 checkpoint 第九章:实例恢复机制 第二部分:Oracle存储架构 第十章: 数据字典和动态视图 第十一章...

    undo&redo;.docx

    在Oracle数据库系统中,撤销(Undo)和重做(Redo)是两个至关重要的概念,它们主要用于事务管理和数据恢复。撤销操作允许用户撤销对数据库的最近更改,而重做操作则用于在系统崩溃或错误发生时恢复数据。 撤销日志...

    Oracle中如何对超大规模数据(如超过2亿条)直接用SQL语句入库?

    在实际生产环境下,有时需将超大... from tab的Oracle SQL方式直接执行将导致redo、undo日志暴增,使数据库容易假死。针对此问题,采用文中方法可完美解决,且对系统性能几乎无影响(不管是分区表还是普通堆表均可)。

    oracle undo

    ### Oracle Undo 概述 在Oracle数据库中,`Undo`起着至关重要的作用,它确保了事务能够被正确地回退或撤销。本文将详细探讨`Undo`的概念、其工作原理以及如何影响Oracle数据库的性能。 ### Undo 的作用 #### 保证...

    Oracle 12c完整后台进程&内存结构图 DBA必备

    4. Undo Group:负责存储数据库的回滚信息。 5. Flash Cache:负责存储数据库的 Flashback 数据。 6. Flash Cache Data & Temp Files:负责存储 Flash Cache 的数据和临时文件。 7. Database Area:负责管理数据库的...

    Oracle.Core:Essential.Internals.for.DBAs.and.Developers

    这一章节详细解释了Oracle数据库中的重做日志(Redo Log)和撤销段(Undo Segment)的工作原理。重做日志记录了所有数据修改的详细信息,以便在系统故障后进行恢复;而撤销段则用于存储被修改前的数据副本,以支持...

Global site tag (gtag.js) - Google Analytics