- 浏览: 460614 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (538)
- C/C++ Primer (69)
- Objective-C Primer (102)
- Python Primer (19)
- JavaScript Primer (1)
- Java Primer (37)
- PHP Primer (17)
- 泛 Linux (37)
- Shell Script (21)
- APUE (21)
- UNP__1&2 (19)
- NetWork (7)
- Oracle周边 (38)
- Mysql里边 (6)
- Windows技 (9)
- 简单算法 & 数据结构 (14)
- 设计模式 (6)
- GTK历程 (12)
- 工具使用 (25)
- 杂事 (23)
- 一些概念 (17)
- Web方面 (10)
- myCodeTools (9)
- ^未 竟$ (13)
- 硬件通信 (2)
- Games (1)
最新评论
http://space.itpub.net/8750110/viewspace-167593
什么是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 /*+ APPEND */ 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 /*+ APPEND */ 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。(要考虑全面哟)
什么是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 /*+ APPEND */ 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 /*+ APPEND */ 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。(要考虑全面哟)
发表评论
-
数据库的一些概念
2012-10-30 13:12 680Web里面,数据库占了半壁江山, 本着PC有价数据无价,DBA ... -
SQLite
2011-11-17 16:52 675官方主页:http://www.sqlit ... -
一些表的概念
2011-09-13 09:59 466平行表 预处理表 流水表 记账表 -
Oracle__View
2011-08-11 10:03 549http://database.51cto.com/art/2 ... -
Oracle__跨库映射
2011-02-23 11:42 531http://blog.csdn.net/huzhenwei/ ... -
Oracle__运行中的SQL
2011-02-16 17:05 578运行中的SQL Select a.program,b.sp ... -
Oracle__数据字典__表结构
2011-02-11 10:02 983SQL> desc all_tab_columns ... -
Oracle__约束
2011-01-17 13:13 503约束查询: Select constraint_name ... -
Oracle__大表__索引__查询
2011-01-14 09:37 626http://hi.baidu.com/ak456/blog/ ... -
Oracle__序列Sequence
2011-01-11 16:50 680http://database.51cto.com/art/2 ... -
Oracle__系统信息
2011-01-04 11:53 527版本 Select * From v$Version; S ... -
Oracle__进程
2011-01-04 10:33 427Select a.username, a.machine, ... -
Oracle__日志
2010-09-02 17:19 752Oracle日志基本信息 http://zhidao.baid ... -
spool
2010-08-06 12:03 745set linesize 1000; set pag ... -
Oracle逻辑结构相关数据字典
2010-08-05 14:48 772http://space.itpub.net/1440192 ... -
Nvl( ) 函数
2010-08-05 11:05 663http://blog.chinaunix.net/u/2 ... -
InstantClient安装使用
2010-08-02 10:54 3227http://wudx.iteye.com/blog/4225 ... -
Oracle那些函数
2010-07-29 11:36 565mod左%右,求余abs绝对值upper转换为大字nvl替 ... -
dbms_random
2010-07-29 10:11 1635http://www.blogjava.net/wxqxs/a ... -
Oracle Trunc Round
2010-06-22 11:54 926原文地址: http://hepu.ite ...
相关推荐
Oracle Redo 和 Undo Mechanism Oracle 中的 redo 和 undo 机制是数据库的核心组件,它们一起协作以确保数据库的事务一致性和可靠性。在本文中,我们将深入探讨 redo 和 undo 机制的工作原理和协作机制。 Undo ...
Oracle_Undo与Redo的通俗 Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction...
Oracle redo undo 机制详解 Oracle redo undo 是 Oracle 数据库中的一种机制,用于确保事务的可恢复性和撤销性。下面是对 redo undo 机制的详细解释。 redo 机制 redo 机制是 Oracle 数据库中的一种机制,用于...
在Oracle中,日志文件发挥着关键作用,其中Undo日志和Redo日志是最核心的两种日志类型。 Undo日志,也称为撤销日志,主要用于事务处理中。它的主要作用是记录事务执行之前的数据库状态,即数据块在被修改之前的所有...
### Oracle的Temp表空间与UNDO表空间处理详解 #### 一、Temp表空间处理 在Oracle数据库中,Temp表空间主要用于存储临时对象,如排序、分组等操作产生的临时数据。这些操作可能会导致Temp表空间迅速增大。然而,...
- **UNDO表空间**: 管理UNDO表空间,确保有足够的UNDO空间以支持事务处理。 - **TEMP表空间**: 配置临时表空间,确保它们能够在高并发操作时高效地分配临时段。 **3. 重做日志文件管理** - **增加REDO日志组**: ...
Undo信息与重做日志(Redo Log)有所不同,Redo Log记录了如何重新生成更改,用于数据库的向前滚动恢复,而Undo则记录如何还原更改,用于回退和读取一致性。 管理Undo数据主要包括监控Undo表空间的空闲空间,防止...
### 最简单的Oracle 10g手工建库步骤详解 #### 平台信息 - **操作系统**: Linux AS release 4 - **Oracle版本**: Oracle 10.2.0.4 - **数据库名称**: ypythb #### 步骤一:设置环境变量 在开始创建数据库之前,...
- **THREAD**: 指定当前实例的REDOLOG线程号。 - **UNDO_TABLESPACE**: 如果使用自动回滚管理(AUM),则需要为每个实例指定不同的UNDO表空间。 这些参数确保了每个实例能够独立运行,同时又能在集群层面协同工作。 ...
3. 每个实例有自己的redo logs和undo表空间。 4. 数据文件和控制文件由所有节点共享。 5. 缓存融合技术(Cache Fusion)确保数据一致性,减少对共享存储的IO操作。 三、缓存融合工作原理 当一个节点从数据文件中...
Oracle的redo log和undo log就是为实现这一特性而设计的。Redo log记录了事务所做的所有改变,而undo log则用于回滚未提交的事务或在系统崩溃后恢复数据。 通过视频和文本文件,你可以深入理解这四大特性,并通过...
"redo与undo_a.pdf"很可能是关于这个主题的一个详细教程或研究报告,可能涵盖了如何配置和管理redo日志文件,如何使用undo来支持事务的ACID属性(原子性、一致性、隔离性和持久性),以及如何在Oracle数据库中实现...
- **UNDO表空间**存储撤销信息。 - **USERS表空间**推荐给普通用户使用。 - **TEMPORARY表空间**用于临时数据。 用户可以创建自定义表空间以适应不同规模的应用和数据分类。 **表(TABLE)**是数据库中存储用户...
- `logfile GROUP1('/oracle/oradata/mydb/redo1.dbf') size 10m, GROUP2('/oracle/oradata/mydb/redo2.dbf') size 10m, GROUP3('/oracle/oradata/mydb/redo3.dbf') size 10m` **总结**: 手动创建Oracle数据库...
此外,每个实例都有自己的System Global Area(SGA)、后台进程、redo logs和undo表空间。 **特点与技术** 1. **缓存一致性**:Oracle提出的Cache Fusion技术确保了缓存的一致性,当一个节点的缓存块被修改时,该...
Undo表空间是用来存储事务撤销操作时所需信息的地方,这些信息被称为重做日志(Redo Log)。当一个事务对数据进行修改时,Oracle会记录下这些修改前的状态,以便在事务回滚或系统崩溃时恢复数据。下面将详细讲解undo...
UNDO_TABLESPACE=UNDOTBS1 TEMP_TABLESPACE=TEMP ``` - **netca.rsp**:网络配置响应文件,用于设置监听器和网络服务名。 - 示例内容: ``` [oracle@localhost ~]$ cat netca.rsp ACTION=CREATE RESPONSE_...
在Oracle数据库的Real Application Clusters (RAC)环境中,REDO和UNDO管理扮演着至关重要的角色,确保数据的安全性、事务处理以及数据恢复。在RAC架构中,多个实例共享同一物理数据库,这就需要对REDO和UNDO管理进行...