UNDO 段是用于存储还原数据的特殊段,在发生实例故障的时候,UNDO 段用来对数 据进行恢复。本章内容包括介绍 UNDO 段的工做原理,并进行自动和手工的 UNDO 段的管理数据库
RDBMS(关系数据库管理系统)必需要提供一致性的数据,以确保不会丢失数据或致使数据混乱。例如,当用户去银行取款时,须要在用户储蓄帐户上减去取款额,而在银行支出帐户上增长取款额,以使得收支平衡。当使用关系数据库处理以上过程时,储蓄帐户、支出帐户分别对应于数据库表。当用户提款时,分别会在储户表、支出帐户表上使用 UPDATE 语句执行增减款操做,最终提交事务,以确保收支平衡。服务器
你们设想一下,假设当在储蓄帐户上减去取款额以后,由于机器断电致使数据库中止工做,怎么办?你可能会想这会致使收支不平衡,不会的,关系数据库经过事务(Transaction)实现了数据一致性。由于断电时事务还没有完成,因此未来在启动数据库时系统会自动回退未提交操做,并最终保证数据的一致性。从数据库的角度看,若是储蓄帐户执行了 UPDATE 操做后出现断电,那么当从新启动数据库时系统会自动执行还原操做,将修改的数据恢复成原有数据。此时你们可能会问,那么原有数据存放在哪儿呢?当执行 INSERT、UPDATAE、 DELETE 等 DML 操做时,服务器进程会将原有数据(称为 UNDO 数据)存放到 UNDO 段中,UNDO 段是专门用于存储还原数据的段。并发
UNDO 数据也被称为回滚(ROLLBACK)数据,它用于确保数据的一致性。当执行 DML 操做(INSERT、UPDATE、DELETE 等)时,操做前的数据被称为 UNDO 记录。例如,当执行“UPDATE emp SETsal=1000WHERE empno=7788”语句时,假定雇员 7788 原有工资为 800,原有数据 800 就是 UNDO 数据,而且该数据会被存放到还原段中,而新数据 1000 则会存放到 EMP 数据段中。还原段用于在进程更改数据库中的数据时保存数据的旧值(可能还原的数据)。它按数据被修改以前的原样存储数据的位置及数据自己(如图 9-1 所示)。许多并发事务处理能够写入一个 UNDO 段。oracle
UNDO 段有以下几个用途,如图 9-2 所示。app
1)事务处理回退
当某事务处理修改表中某行时,被修改的列的旧值(要还原的数据)将存储在 UNDO 段中,新数据被存入到数据段中。若是将该事务处理回退,即执行 ROLLBACK 命令,则 Oracle 服务器经过将还原段中的值写回到该行来恢复原始值。例如用户 A 在执行了语句“UPDATE emp SET sal=1000 WHERE empno=7733”后发现应该修改 7868 号雇员的工资而丌是 7733 号雇员的工资,那么经过执行“ROLLBACK”语句能够取消事务,此时系统将回滚段中的 UNDO 数据 800 从 UNDO 段中又写回数据段中。性能
2)事务处理恢复
事务恢复是由 ORACLE SERVER 自动完成的。若是实例在事务处理正在进行时失败(INSTANCEFAILURE) ,那么 Oracle 服务器须要在数据库再次打开时回退全部未提交的事务。这种回退操做是事务处理恢复的一部分。之因此有可能恢复事务处理,缘由在于对还原段所作的更改一样受重作日志文件的保护。spa
3)读一致性
当用户检索数据库数据时,Oracle 老是使提用户只能看到被提交过的数据(读取提交)或者特定时间点的数据(SELECT 语句时间点),这样能够确保数据的一致性。读一致性是由 ORALCE 提供的,而且该特征是经过 UNDO 记录来实现有。还原段中的旧值(要回退的数据)用于保证数据的读一致性。Oracle 服务器保证一条语句所看到的数据来自一致的时间,即便其它事务处理修改了该数据。例如,当 Oracle 服务器开始执行 SELECT 语句时,首先肯定当前系统更改号(SCN),并确保这个 SCN以前未提交的任何修改不会被这条语句处理。若是在此次查询开始时某行有未提交的数据更改,Oracle 服务器会从还原段检索这些更改的旧值,并显示该旧值,如:3d
图 9-3 所示:日志
在 Oracle9i 之前,管理 UNDO 数据须要 DBA 创建专门的还原段,但这种方法至关复杂;为了简化UNDO 数据的管理,从 Oracle9i 开始,管理 UNDO 数据有两种方法,一种是自动管理模式,经过 UNDO 表空间能够自动管理 UNDO 数据,另一种是手工管理方式,即便用 UNDO 段管理 UNDO 数据。顾名思义,UNDO 表空间是指之门存放 UNDO 数据的表空间,而且只能存放回滚段而不能存放其它的数据段。当使用UNDO 表空间时,Oracle 会自动在该表空间上创建还原段,以供事务操做使用。UNDO 表空间上的还原段,按照这样的方式命名:_SYSSMUn$,好比:_SYSSMU10$、_SYSSMU11$ 等。code
若是使用自动管理模式,则必需要将初始化参数 UNDO_MANAGEMENT 设置为 AUTO。这样,当启动Oracle 服务器以后,Oracle 会使用 UNDO 表空间自动管理 UNDO 数据,而且 Oracle 自动选择第一个可用 的 UNDO 表 空 间 存放 UNDO 数 据 。 在 有多 个 UNDO 表 空 间 时, 可 以 通 过 设 置 初 始 化 参数UNDO_TABLESPACE 选择使用的 UNDO 表空间。可是若是没有 UNDO 表空间可用,则 Oracle 会使用SYSTEM 还原段存放 UNDO 记录。
1.2.1 UNDO 空间管理参数
自动管理模式相关的初始化参数和意义以下。
1)UNDO_MANAGEMENT
该参数用于指定数据库 UNDO 数据的管理模式。该参数能够设置为 AUTO 和 MANUAL 这两个值中的任一个值,而且必须在初始化参数文件中设置。UNDO_MANAGEMENT 不能在数据库启动后进行动态更改。
- AUTO 模式能够将数据库设置为自动还原管理,并须要 UNDO 表空间。
- 在 MANUAL 模式(缺省值)下,能够根据须要在数据库中建立和管理还原段,这不之前的 Oracle 服务器版本中的操做相同。若是数据库中叧有一个 UNDO 表空间,而且将 UNDO_MANAGEMENT 设置为 AUTO,则 UNDO_TABLESPACE 参数是可选的;Oracle 服务器将自劢选择 UNDO 表空间的。
2)UNDO_TABLESPACE
该参数用于指定在自动管理模式下要使用的 UNDO 表空间。此参数能够在初始化文件中设置,或使用ALTER SYSTEM 命令来劢态改变。语句以下: ALTER SYSTEM SET UNDO_tablespace=UNDOTBS;
3)UNDO_SUPPRESS_ERRORS
使用 UNDO_SUPPRESS_ERRORS,用户能够避免在自动还原管理模式下执行手劢还原管理模式操做(例如,ALTERROLLBACK SEGMENTONLINE)时出现错误。经过设置这个参数,用户能够在将全部应用程序和脚本 转 换 成 自 动 还 原 管 理 模 式 前 使 用 还 原 表 空 间 功 能 。 例 如 , 如 果 有 一 个 使 用 SETTRANSACTION USEROLLBACK SEGMENT 语句 的 应用 程 序,则 可 以 向该 应用 程 序添 加 语 句 ALTER SESSION SET
UNDO_SUPPRESS_ERRORS=true 以免 ORA-30019 错误。ORA-30019:在自动还原模式下执行了非法的回退段。4)UNDO_RETENTION
该参数用于指定保留 UNDO 数据的时间,以便提供读一致性,默认值为 900s。若是执行查询的时间很长,尽 可 能 保 留 更 多 的 还 原 数 据 , 但 是 需 要 UNDO 表 空 间 的 数 据 文 件 也 越 大 。 以 秒 为 单 位 定 义 的UNDO_RETENTION 参数能够在初始化文件中设置,或使用 ALTER SYSTEM 命令来动态态修改。
本地撤消模式
本地撤消模式意味着每一个容器都有本身的撤销表空间。在此模式下,Oracle 数据库会自动为 CDB 中的每一个容器建立一个撤消表空间。对于 Oracle RAC CDB,在本地撤消模式下,每一个 PDB 的每一个实例都有一个活动的撤消表空间。
本地撤消模式为每一个容器提供了更高的隔离,并提升了某些操做的效率,例如拔出容器或在容器上执行时间点恢复。此外,须要支持某些操做的本地撤消模式,例如从新定位 PDB 或克隆处于开放读/写模式的 PDB。当 CDB 处于本地撤消模式时,如下状况适用:
- 对当前容器具备适当权限的任何用户均可觉得容器建立撤消表空间。有关所需权限的信息,请参见 Oracle 数据库 SQL 语言参考。
- 撤消表空间在静态数据字典视图和 CDB 中每一个容器中的动态性能(V $)视图中均可
共享撤消模式
共享撤消模式意味着单实例 CDB 有一个活动的撤消表空间。对于 Oracle RAC CDB,每一个实例都有一个活动的撤消表空间。
当 CDB 处于共享撤消模式时,如下状况适用:
- 只有具备相应权限且当前容器为 CDB 根的普通用户才能建立撤消表空间。
- 当前容器不是 CDB 根时,尝试建立撤消表空间失败并返回错误。
- 当前容器是 CDB 根时,撤消表空间在静态数据字典视图和动态性能(V $)视图中可见。当前容器是 PDB,应用程序根目录或应用程序 PDB 时,撤消表空间仅在动态性能视图中可见。
· SELECT PROPERTY_NAME, PROPERTY_VALUE · FROM DATABASE_PROPERTIES · WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';
1.2.2UNDO 空间管理
一、建立 undo 表空间:
CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/u01/app/oracle/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;二、alter undo tablespace
ALTER TABLESPACE undotbs_01 ADD DATAFILE '/u01/oracle/oracle/undo0201.dbf ' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;三、switch undo tablespace
四、drop undo tablespace
DROP TABLESPACE undotbs_01;
1.2.3 管理临时 undo
临时撤消记录存在数据库的临时表空间中,所以不会记录在重作日志中。启用临时撤消后,临时表空间使用的某些段会存储临时撤消,这些段称为临时撤消段。启用临时撤消后,可能须要增长临时表空间的大小以考虑撤消记录。
启用临时撤消可带来如下好处:
- 临时撤消能够减小撤消表空间中存储的撤消量。撤消表空间中的较少撤消可让撤消保留期的记录的到达更实际的要求。
- 临时撤消会减少重作日志的大小。性能获得改善,由于重作日志中写入的数据较少,而解析重作日志记录的组件(如 LogMiner)性能更好,由于要解析的重作数据较少。
- 临时撤消使用 Oracle Active Data Guard 选项对物理备用数据库中的临时表启用数据操做语言(DML) 操做。可是,必须在主数据库上发出建立临时表的数据定义语言(DDL)操做。
您能够为特定会话或整个系统启用临时撤消。使用 ALTER SESSION 语句为会话启用临时撤消时,会话会建立临时撤消,而不会影响其余会话。使用 ALTER SYSTEM 语句为系统启用临时撤消时,全部现有会话和新会话都会建立临时撤消。当会话第一次使用临时对象时,TEMP_UNDO_ENABLED 将为会话的其他部分设置初始化参数的当前值。所以,若是为会话启用了临时撤消,而且会话使用临时对象,则没法为会话禁用临时撤消。一样,若是为会话禁用临时撤消而且会话使用临时对象,则没法为会话启用临时撤销。
注意:仅当数据库的兼容级别为 12.0.0 或更高时,才能启用临时撤消。
- 要为会话启用临时撤消,请运行如下 SQL 语
- 要禁用会话的临时撤消,请运行如下 SQL 语句:
- 要为系统启用临时撤消,请运行如下 SQL 语句:
为系统启用临时撤消后,会话可使用该 ALTER SESSION 语句禁用临时撤
- 要禁用系统的临时撤消,请运行如下 SQL 语句:
1.2.4 相关视图:
==============================================================