`
sunxboy
  • 浏览: 2869883 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

全方位介绍Oracle数据库中的回滚段

阅读更多

本文分为以下几个部分:

* 回滚段的作用

* 回滚段的类型

* 回滚段的数量、大小及存储参数

* 回滚段的维护及查询

* 有关回滚段的常见错误及解决方法

1. 回滚段的作用

回滚段用于对数据库修改时, 保存原有的数据, 以便稍后可以通过使用ROLLBACK来恢复到修改前的数据; 另外, 回滚段可以为数据库中的所有进程提供读一致性. 因此, 回滚段设置的合理与否, 直接影响到数据库的性能, 在更新密集的OLTP应用中,更是如此.

2. 回滚段的类型

回滚段可分为系统回滚段和非系统回滚段, 其中非系统回滚段又分为PUBLIC回滚段和PRIVATE回滚段.

系统回滚段用于处理涉及系统的CATALOG的事物(比如大多数的DDL), 它位于SYSTEM表空间, 由于只有SYSTEM表空间可以随时保持可用, 因此, 不要把SYSTEM回滚段放在其他的表空间中.

*** 原则1: 系统回滚段应放在SYSTEM表空间中, 并且应该永远保持ONLINE状态.

PUBLIC回滚段对于数据库的所有实例(INSTANCE)都是可用的, 除非将其显式设置为OFFLINE.

PRIVATE回滚段是指对于数据库的某个实例是私有的, 为了使用PRIVATE回滚段, 某个实例应当在其INITsid.ORA的ROLLBACK_SEGMENTS中标明所有要使用的PRIVATE回滚段, 或通过使用ALTER ROLLBACK SEGMENT XXX ONLINE来使用某一个回滚段.

*** 建议1: 在单实例系统中,建议将所有回滚段设为PUBLIC.

*** 建议2: 在多实例系统中(如OPS), 建议将每个实例的PRIVATE回滚段放置到访问比较快的本地设备上.

3. 回滚段的数量、大小及存储参数

精确的回滚段的数量及大小的计算涉及很多方面: 应用的类型(OLTP/OLAP/BATCH), 同时进行的事物的数量, DML语句的类型, 每个事物处理的数据量等等. 精确的计算, 限于篇幅, 不在此提及, 朋友们可参考相关文档(参考文献4), 在此, 只提供几个原则及建议.

*** 原则2: OLTP系统应使用小但较多的回滚段, OLAP系统/批处理系统应使用少量的大回滚段

*** 建议3: OLTP/OLAP混合型系统中, 应专门设置一个或几个大的回滚段, 平时设置为OFFLINE, 使用时通过使用SET TRANSACTION USE ROLLBACK SEGMENT XXX来使用它. 这些回滚段应使用OPTIMAL参数,以便在不使用时,可以SHRINK到一个较小的尺寸。

*** 建议4: 在很难计算准确的数量、大小时,可用"偏大不偏小"的原则。

*** 原则3: 所有的回滚段的INITIAL/NEXT参数应设为相同, 只有建议3中提到的大回滚段例外.

*** 原则4: 不要将回滚段的MAXEXTENTS设为UNLIMITED, 回滚段所在表空间也不要设为AUTOEXTEND方式, 否则将会使得由于某个不正常的事务导致整个数据库处于失控状态.

4. 回滚段的维护及查询

(1) 创建回滚段

__CREATE ROLLBACK SEGMENT RB01 
__TABLESPACE RBS1 
__STORAGE ( 
____INITIAL 100K 
____NEXT 100K 
____MINEXTENTS 20 
____MAXEXTENTS 100 
____OPTIMAL 2000K );

2) 更改ONLINE/OFFLINE状态

__ALTER ROLLBACK SEGMENT RB01 ONLINE; 
__ALTER ROLLBACK SEGMENT RB01 OFFLINE;

(3) 更改OPTIMAL参数

__ALTER ROLLBACK SEGMENT RB01 
__STORAGE ( MAXEXTENTS 200 
____OPTIMAL 2048K );

(4) 缩小回滚段

__ALTER ROLLBACK SEGMENT RB01 SHRINK; 
(有OPTIMAL参数时, 缩小到OPTIMAL值; 没有OPTIMAL参数时, 缩小到MINEXTENTS所对应的尺寸) 
__ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;

(5) 修改INITIAL/NEXT参数

*** 建议5: 根据原则3, 修改NEXT时, 总应该同时修改INITIAL.

INITIAL参数无法直接修改, 只能先DROP, 然后再CREATE.

__DROP ROLLBACK SEGMENT RB01; 
__CREATE ROLLBACK SEGMENT RB01 
__TABLESPACE RBS1 
__STORAGE ( INITIAL 100K 
____NEXT 100K 
____MINEXTENTS 20 
____MAXEXTENTS 121 
____OPTIMAL 2000K )

(6) 在事务中使用特定的回滚段

__SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;

(7) 常用的有关回滚段的系统数据字典

DBA_ROLLBACK_SEGS (相关表:DBA_SEGMENTS) 
V$ROLLNAME 
V$ROLLSTAT 
V$TRANSACTION (相关表: V$SESSION)

5. 有关回滚段的常见错误及解决方法

(1) 回滚段空间不够

ORA-01562 - failed to extend rollback segment number string

回滚段空间不够的原因一般有以下几种情况:

A. 回滚段所在表空间剩余的空闲空间太小, 无法分配下一个EXTENT.

B. 回滚段扩展次数已经达到MAXEXTENTS限制

解决方法:

A. 扩大回滚段所在表空间

B. 设置较大的MAXEXTENTS参数

C. 为回滚段设置OPTIMAL参数

D. 用较大的EXTENT参数重新创建回滚段

C. 将导致ORA-1562错误的DML语句改为分段执行:

例如: 原来的语句为

____DELETE FROM HUGETABLE WHERE condition;

可用如下语句代替:

____BEGIN 
________LOOP 
____________DELETE FROM HUGETABLE 
____________WHERE condition 
____________AND ROWNUM<10000; 
____________EXIT WHEN SQL%NOTFOUND; 
____________COMMIT; 
________END LOOP; 
____END;

(2)

ORA-01552 cannot use system rollback segment for non-system tablespace

'string'

原因: 没有可用的非系统回滚段. 分为以下情形:

A. 除了系统回滚段, 未创建其它回滚段

B. 只创建了PRIVATE回滚段, 但INITsid.ORA的ROLLBACK_SEGMENTS中未列出这些回滚段

C. 创建了PUBLIC回滚段, 但这些回滚段都处于OFFLINE状态

解决方法: 根据以上原因相应解决即可

 

(3)

ORA_01555 snapshot too old: rollback segment number string with name "string" too small

原因可分为以下情形:

A. 回滚段太少/太小

数据库中有太多的事务修改数据并提交, 就会发生已提交事务曾使用的空间被重用, 从而造成一个延

续时间长的查询所请求的数据已经不在回滚段中.

解决方法: 创建更多的回滚段, 为回滚段设置较大的EXTENT以及较大的MINEXTENTS

B. 回滚段被破坏

由于回滚段被破坏, 造成事务无法将修改前的内容(read-consistent snapshot) 放入回滚段, 也会产生ORA-01555错误.

解决方法: 将被破坏的回滚段OFFLINE, 删除重建.

C. FETCH ACROSS COMMIT

当一个进程打开一个CURSOR, 然后循环执行FETCH, UPDATE, COMMIT, 如果更新的表与FETCH的是同一个表, 就很可能发生ORA-01555错误.

解决方法:

a. 使用大的回滚段

b. 减少提交频率(可参见本论坛"怎么样避免一个PROCEDURE被重复调用"一贴中, 无名朋友的回帖)

以上两种方法只能减少该错误发生的可能, 不能完全避免. 如果要完全避免, 须从执行方法着手, 可以用以下两种方法:

c. 建立一个临时表, 存放要更新的表的查询列(如主键及相关的条件列), 从临时表FETCH, 更新原来的表.

d. 捕获ORA-01555错误, 关闭并重新打开CURSOR, 继续执行循环:

示例(示例程序的思路来源自ORACLE的UTLIP.SQL, 有兴趣的朋友可直接阅读该程序, 位置在RDBMSADMIN下, 程序很短, 容易读):

____DECLARE 
____LAST_PK NUMBER := 0; 
____V_THEROWID ROWID; 
____CURSOR C1 IS 
________SELECT ROWID, PK, … 
________FROM SMPLE 
________WHERE PK > LAST_PK 
________AND othercondition 
________ORDER BY PK; 
____BEGIN 
________OPEN c_SOURCE; 
________LOOP 
____________BEGIN 
________________FETCH C1 INTO v_THEROWID, v_PK; 
________________EXIT WHEN C1%NOTFOUND; 
____________EXCEPTION WHEN OTHERS THEN 
________________IF SQLCODE = -1555 THEN -- snapshot too old, re-execute fetch query 
____________________CLOSE C1; 
____________________OPEN c_SOURCE; 
____________________GOTO NEXTLOOP01555; 
________________ELSE 
____________________RAISE; 
________________END IF; 
____________END; 
____________LAST_PK := PK; 
……… … PROCESS, UPDATE AND COMMIT 
____________<> 
____________NULL; 
________END LOOP; 
________CLOSE C1; 
____END;

D. 其它原因:

* Delayed logging block cleanout是ORACLE用来提高写性能的一种机制: 当修改操作(INSERT/UPDATE/DELETE)发生时, ORACLE将原有的内容写入回滚段, 更新每个数据块的头部使其指向相应的回滚段, 当该操作被COMMIT时, ORACLE并不再重新访问一遍所有的数据块来确认所有的修改, 而只是更新位于回滚段头部的事务槽来指明该事务已被COMMIT, 这使得写操作可以很快结束从而提高了性能接下来的任何访问该操作所修改的数据的操作会使先前的写操作真正生效, 从而访问到新的值. Delayed logging block cleanout 虽然提高了性能, 但却可能导致ORA-01555. 这种情况下, 在OPEN/FETCH前对该表做全表扫描(保证所有的修改被确认)会有所帮助.

* 不适当的OPTIMAL参数: 太小的OPTIMAL参数会使回滚段很快被SHRINK, 造成后续读取操作访问时, 先前的内容已丢失. 仔细设计OPTIMAL参数, 不要让回滚段过于频繁的EXTEND/SHRINK有助于问题的解决.

* DB BLOCK BUFFER太小: 如果读一致性所请求的块的先前内容在缓冲区中, 那么就不用去访问回滚段. 而如果缓冲区太小, 使得先前版本的内容在CACHE中的可能性变小, 从而必须频繁的访问回滚段来获取先前的内容, 这将大大增大ORA-01555发生的可能.

 

分享到:
评论

相关推荐

    oracle数据库整体优化方案全

    本文将详细介绍一种全面的Oracle数据库优化方案,涵盖监控、磁盘I/O优化、回滚段优化、Redo日志优化、系统全局区(SGA)优化等多个方面。 #### 二、监控数据库性能 监控是优化的基础。为了准确了解Oracle数据库的...

    Oracle数据库日常维护方案书

    - 售后服务:提供全方位的售后支持,确保客户满意度。 - 电话支持:提供24小时的电话咨询服务。 - 现场服务:针对复杂问题,派遣技术人员上门服务。 - 电子邮件支持:通过电子邮件解答客户的疑问。 - 紧急故障...

    Oracle 数据库笔记.rar

    总结来说,“Oracle数据库笔记”可能涵盖了从基本的SQL语法到高级特性的全方位讲解,包括数据库实例、存储结构、SQL查询、事务管理、视图和存储过程、索引、安全性、备份恢复以及高可用性。无论你是初学者还是经验...

    ORACLE数据库教程下载

    总结,Oracle数据库教程涵盖了从基础到高级的全方位内容,无论你是初次接触还是寻求提升,都能在本教程中找到所需的知识点。通过学习,你将具备设计、创建、管理Oracle数据库的能力,并能解决日常遇到的问题,进一步...

    oracle数据库管理与维护技术手册 下

    Oracle数据库管理与维护技术手册是DBA(数据库管理员)及IT专业人员的重要参考资料,它涵盖了Oracle数据库系统的全方位管理和维护知识。下面将详细阐述这个领域的核心概念、操作和最佳实践。 一、Oracle数据库基础 ...

    Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构(第2版)

    总之,《Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构(第2版)》是一本全方位的Oracle技术参考书,无论你是新手还是经验丰富的DBA,都能从中获益匪浅,提升自己的Oracle数据库技能。通过阅读和实践书中...

    漫谈ORACLE数据库优化设计方案.pdf

    Oracle数据库优化设计方案是一个复杂而全面的...综上所述,Oracle数据库的优化是一个涉及多个层面的综合性工程,需要DBA根据实际情况,从硬件、软件配置,到数据库设计和SQL优化,全方位考虑,以达到最佳的性能表现。

    客户选择EMC备份Oracle数据库的6大理由

    凭借数千次备份评估的成功案例,EMC已成为众多企业转型过程中的可靠顾问,提供了涵盖评估、规划、实施和培训等全方位的专业服务。其卓越的技术实力和市场地位,使其在Oracle备份解决方案领域无可匹敌。 综上所述,...

    本人自己整理的oracle资料打包

    综合以上内容,这个压缩包提供了Oracle数据库从基础知识到高级特性的全方位学习资源,无论是初学者还是资深DBA,都能从中受益。通过深入学习和实践,可以提升对Oracle数据库的理解和操作能力,更好地应对实际工作中...

    Oracle DBA

    Oracle DBA,即Oracle数据库管理员,是专门负责管理和优化Oracle数据库系统的专家...综上所述,Oracle DBA的工作涵盖了数据库的全方位管理,要求具备深厚的理论知识和实践经验,能够确保Oracle数据库的高效、稳定运行。

    Oracle 9i数据库管理员指南.rar

    总之,Oracle 9i数据库管理员指南涵盖了从基础操作到高级特性的全方位知识,对于任何希望在Oracle数据库管理领域深造的人来说,都是不可或缺的学习资料。通过深入学习和实践,管理员可以熟练掌握9i数据库的管理和...

    《oracle大全》

    《Oracle大全》是一本全面深入探讨Oracle数据库系统的专业书籍,旨在为读者提供Oracle数据库的全方位知识。Oracle数据库作为全球广泛使用的大型关系型数据库管理系统,其复杂性和深度使得深入理解并熟练掌握它成为IT...

    Oracle9i数据库性能调整方法之研究.pdf

    通过以上这些方法,可以对Oracle9i数据库进行全方位的性能调整,确保系统在高负载下仍然能稳定、高效地运行,满足用户的需求。同时,性能调整是一个持续的过程,需要根据系统的变化和应用的需求不断进行监控、分析和...

    Oracle数据库的安全策略

    综上所述,Oracle数据库的安全策略通过备份恢复机制、日志管理以及用户角色管理等手段,构建了一个多层次、全方位的数据保护体系,确保了数据的安全性和系统的稳定性。在实际应用中,根据业务需求和风险评估,合理...

    Oracle DBA手册

    回滚段管理是确保事务一致性的关键,它们记录了事务中的所有更改,以便在回滚操作时恢复到先前的状态。用户管理则涉及创建、删除用户,分配权限和角色,以确保数据安全和访问控制。 数据库的备份与恢复是DBA的另一...

    Oracle性能优化技术内幕

    在Oracle数据库管理中,性能优化是一项至关重要的任务,它关乎系统的响应速度、资源利用率以及整体业务效率。本书全面解析了Oracle性能优化的各种工具和技术,旨在帮助读者提升对Oracle数据库内部机制的了解,从而更...

    Oracle 课堂笔记

    总之,“Oracle 课堂笔记”将带你深入探索Oracle数据库的世界,涵盖从基础概念到高级特性的全方位知识,帮助你成为一名熟练的Oracle数据库管理员或开发者。无论是对数据库架构的理解,还是在实际操作中的应用,都能...

    oracle系统表详解(中文).docx

    这些系统表提供了关于数据库对象、用户、权限、空间使用以及性能等全方位的信息。以下是对这些表的详细解释: 1. **dba_users**: 这个表包含了数据库中所有用户的详细信息,如用户名(USERNAME)、用户ID(USER_ID...

    Oracle课程设计图书管理系统.docx

    - **内容**:以图书管理系统为例,从需求分析到系统设计,再到编码实现及测试部署,全方位地锻炼学生的综合能力。 以上内容仅为Oracle课程设计图书管理系统的一部分知识点总结,希望能够帮助学生更加深入地理解和...

Global site tag (gtag.js) - Google Analytics