《Oracle高性能自动化运维》一一3.3 Redo产生场景

3.3 Redo产生场景
我们知道,Oracle Redo是以条目(Redo Entries/Records)的形式记录数据库的所有更改操作(OP)。更改操作主要包括:
数据库物理文件更改:主要指的是数据库物理文件的增减等操作;
数据库运行状态更改:数据库当前状态版本的更改(Current Status Version),例如数据库检查点(Checkpoint)等操作;
数据库后台进程写操作:数据库后台进程对数据库的操作,例如DBWR写磁盘、LGWR写日志等操作;
DML事务操作:DML事务对数据的更改操作;
数据字典DDL操作:DDL操作会更改数据字典,例如Drop、Truncate等DDL操作;
数据库内部递归调用:更改数据库内部字典表操作。
可以看到,数据库更改是Redo产生的根源,下面将对Redo产生的主要场景进行介绍。
3.3.1 Redo与DML事务
DML事务会产生Redo。DML事务(索引行)与Redo OP的关系如表3-4所示。

索引行DML事务是最典型的DML,因此以索引行DML事物为例进行介绍更具代表性。
以表3-4所示为基础,下面验证索引键(Index Key)DML更新与Redo(OP)的详细关系。
1)基础数据准备,如下所示:

2)以索引键数据更新为基准,经过多次测试得到索引键DML更新与Redo(OP)的详细关系,如表3-5所示。

通过表3-5可以看出:
Step1:将索引键(c1)的值从非Null更新到不同的非Null时,首先对索引键进行更新操作,接着对索引键进行删除、插入操作;
从某种意义来讲,Update操作可以看作Delete操作之后的Insert操作。
Step2:将索引键的值从非Null更新到相同的非Null时,只有索引键更新操作,不会产生回滚和重做信息;
Step3:将索引键的值从非Null更新到Null时,首先对索引键进行更新操作,然后对索引键进行删除操作,没有索引键的插入操作;
Step4:将索引键的值从Null更新到非Null时,首先索引键进行更新操作,接着跳过索引键删除操作直接进行索引键插入操作。
为了简化内容,上述步骤省略了事务开始(OP:5.2)和事务结束(OP:5.4)的描述。
不难看出:
DML中的Null不会影响索引操作;
更新索引键数据时,索引也会相应更新;
当索引创建较多时,索引行DML更新可能会影响到多个索引键的DML更新,这样会产生大量的Redo,从而影响数据库的整体性能。因此,在满足性能需求的情况下,应当尽可能少地创建索引。
3.3.2 Redo与Block Cleanout
在一般情况下,当事务提交后,事务影响的数据块的ITL标识会立即被清除。如果当事务提交后,事务数据块的ITL没有及时被清除(ITL仍处于打开状态),那么将会产生延迟块清除(Delayed Block Cleanout)。
Block Cleanout 会产生Redo,如下所示:

Block Cleanout可以由Select语句产生,这就意味着Select查询也可能产生Redo。Block Cleanout详细内容请参考4.2.3节。
Block Cleanout主要与事务“热块”紧密相关。因此,我们在进行数据库优化设计时,应当尽可能地将“热块”事务分散到不同的数据块中,这样就可以减少Block Cleanout产生的概率,从而减少Redo的产生。
3.3.3 Redo与Block Write
从Oracle 9开始,DBWR进程将Block Buffer写入磁盘操作(Block Write)会被记录到Redo中。与此同时,数据库恢复操作也会引发Block Write,如下所示:

可以看到,当数据库恢复引发Block Write时,系统将Block Write信息完整地记录在Redo中,体现了“Redo记录数据库所有更改”这一特点。
3.3.4 Redo与Hot Backup
当数据库进行热备(Hot Backup)操作时,热备信息会记录在Redo中,如下所示:

可以看到,当数据库进行热备时,系统将热备信息完整地记录在Redo中,确保热备数据的可恢复性。
3.3.5 Redo与Direct Load
当进行数据直接路径加载(Direct Load)时,也会将Direct Load信息记录在Redo中,如下所示:

可以看到,当进行数据直接路径加载时,系统仍然会将数据直接路径加载的信息记录到Redo中。相对于其他方式的数据加载方式,数据直接路径加载将会产生较少的Redo。
Direct Load操作会越过Buffer Cache直接将数据写入磁盘,从而产生较少的Redo。
3.3.6 Redo与Nologging
Nologging 日志记录模式可以减少Redo的产生,但是Nologging的使用需要特别留意,这是因为:
Nologging 方式创建的数据库对象将不可恢复;
一旦数据库对象被设置为Nologging模式后,必须立即进行数据库(对象)备份;
当使用Nologging完成特定操作后,强烈建议将数据库对象的日志记录模式恢复为Logging模式(默认模式)。可使用以下命令实现:
Alter [database] tablespace force logging;
Nologging模式下进行特定的数据库操作可以提升数据库性能,例如,在创建索引时就可以使用Nologging来加快索引创建的速度。
Nologging的使用级别:
对象级(Database/Tablespace/Table等)的使用,如下所示:
Create[Alter] table[index] table_name[index_name] parallel nologging;
SQL语句级的使用,如下所示:

Insert /+ nologging append/ into table_name select from xxx..;
Nologging可以减少Redo的产生,如下所示:

可以看出,采用Nologging模式后,Redo产生量大幅度降低。

时间: 2024-08-03 12:08:55

《Oracle高性能自动化运维》一一3.3 Redo产生场景的相关文章

《Oracle高性能自动化运维》一一导读

Preface 前 言 为什么要写这本书 2008年的某一天,我怀着激动的心情参加了支付宝公司的面试,这次面试让我对国内最前沿的数据库自动化运维技术有了初步的认识,对我的职业生涯影响非常大,时刻激励着我以后不管遇到什么困难或者诱惑,Oracle始终都是我追逐的爱好和目标. 在接下来几年的工作中,我较为深入地研究了C语言数据结构.Linux操作系统原理以及Shell(PHP/Java)编程等知识,这些技术能够很好地支撑Oracle运维管理.同时,多年的经验告诉我,对集运维与开发于一体的Oracle

《Oracle高性能自动化运维》一一第1章 Linux下的Oracle 1.0

**第1章Linux下的Oracle 1.0**众所周知,Oracle数据库与Linux操作系统是行业内使用最为广泛.功能最为强大的数据库/操作系统之一.随着企业业务的不断发展,越来越多的Oracle数据库被部署在Linux环境中,以提供核心业务数据的支撑.与此同时,随着人们对Oracle运维管理经验的不断积累,大部分数据库管理员对Linux环境下的Oracle认识也越来越深刻,然而也有部分数据运维人员对于Linux环境下的Oracle内存分配存在疑惑.本章就Oracle与Linux内存关系进行

《Oracle高性能自动化运维》一一第1章 Linux下的Oracle

第1章 Linux下的Oracle 众所周知,Oracle数据库与Linux操作系统是行业内使用最为广泛.功能最为强大的数据库/操作系统之一.随着企业业务的不断发展,越来越多的Oracle数据库被部署在Linux环境中,以提供核心业务数据的支撑.与此同时,随着人们对Oracle运维管理经验的不断积累,大部分数据库管理员对Linux环境下的Oracle认识也越来越深刻,然而也有部分数据运维人员对于Linux环境下的Oracle内存分配存在疑惑.本章就Oracle与Linux内存关系进行讲解,帮助读

《Oracle高性能自动化运维》一一2.4 Buffer Cache

2.4 Buffer Cache 2.4.1 Buffer(Cache)Pool 1. Buffer(Cache)Pool组成结构 Oracle Buffer Cache由3个Buffer Pool组成,如图2-9所示. 其中: Default Pool:默认池,用于缓存常规数据: Keep Pool:保留池,主要用于缓存频繁更新的小表: Recycle Pool:回收池,用于缓存随机使用的大表. 2. Buffer Pool与Working Set Buffer Pool与Working Se

《Oracle高性能自动化运维》一一1.4 Linux内存体系与Oracle内存空间

1.4 Linux内存体系与Oracle内存空间1.4.1 Linux用户空间与内核空间 一般来说,Linux操作系统把虚拟地址空间划分为用户空间和内核空间.例如x86架构下的32位Linux虚拟地址空间是4GB(0x0000 0000-0xffff ffff),其中大致将前3GB(0x0000 0000-0xbfff ffff)划分为用户空间,后1GB(0xc000 0000-0xffff ffff)划分为内核空间. 用户程序只能在用户模式(用户空间)下执行,而不能访问特权模式(内核空间)的数

《Oracle高性能自动化运维》一一1.5 小结

1.5 小结 本章主要介绍了Linux环境下Oracle用户空间与系统空间的关系,结合Oracle SGA与PGA分配规则,着重对Linux内核参数kernel.shmall和kernel.shmmax进行介绍,帮助读者规划Linux环境下Oracle内存分配的同时,还提供了Oracle内存优化的一个重要途径. 参考文档 [1] Database Installation Guide for Linux(Oracle Corporation)

《Oracle高性能自动化运维》一一2.3 Library Cache

2.3 Library Cache2.3.1 Library Cache与SQL游标 Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1. SQL语句与父游标及子游标 在PL/SQL中,游标(Cursor)是数据集遍历的内存集合.而从广义上讲,游标是SQL语句在Library Cache中的内存载体.SQL语句与游标关系如下: 1)一条SQL语句包含一个父游标(Parent Cursor)和

《Oracle高性能自动化运维》一一

1.3 Linux内存体系的优势 许多接触过Oracle的朋友可能会有一些感慨,在Windows操作系统和Linux操作系统下管理Oracle是完全不一样的.其实不尽然,Windows下的Oracle在服务中只能看见一个类似ORCL的服务,同时在Windows任务管理器中也只能看见一个Oracle进程,而数据库后台进程则不可见. Windows下的Oracle服务,如图1-1所示. 图1-1 Windows下的Oracle服务 Windows任务管理器中的Oracle进程,如图1-2所示. 图1

《Oracle高性能自动化运维》一一2.2 队列锁(Enqueue Lock)

2.2 队列锁(Enqueue Lock)2.2.1 Lock与Latch的区别 Oracle锁(Lock)也被称为队列锁(Enqueue Lock),而Latch则被称作为"细粒度"的锁.Lock与Latch的区别如表2-1所示. 不难看出: Oracle使用Latch保护内存数据被间歇地.短持续地访问: Latch不适合保护持续时间相对较长的资源(Resource),在这种情况下,就需要使用Lock持续锁定: Lock允许并发等待:当前不可获取的Resource会被放入请求队列中进