Oracle 管理Undo 还原数据

数据操纵

• 数据操纵语言 (DML) 包括以下 SQL 语句:
– INSERT
– UPDATE
– DELETE
– MERGE
• DML 始终作为事务处理的一部分执行,可以对其执行
以下操作:
– 回退(使用 ROLLBACK 命令)
– 提交(使用 COMMIT 命令)

 

处理或修改数据时需使用 DML 类的 SQL 语句:INSERT、UPDATE、DELETE 和 MERGE。 这些语句作为事务处理的一部分执行,事务处理以第一个成功的 DML 语句为开始,以 COMMIT 或 ROLLBACK 命令为结束。事务处理不是完全提交,就是完全回退。 如果进程或系统失败,也可能发生回退(askmac.cn)。

 

Undo还原数据

还原数据是:
• 原始的、修改之前的数据副本
• 针对更改数据的每个事务处理捕获的数据
• 至少保留到事务处理结束
• 用于支持:
– 回退操作
– 读取一致性和闪回查询
– 从失败的事务处理中恢复

当某个进程更改了数据库中的数据时,Oracle 数据库会保存旧值(还原数据)。按数据修 改前的原样存储数据。如果捕获了还原数据,则可以回退未提交的数据。还原数据还用于 支持读取一致性和闪回查询(askmac.cn)。

在读取一致性查询中,提供与查询开始时的数据一致的结果。如果要成功完成读取一致性 查询,原始信息必须仍作为还原信息存在。只要保留了还原信息,Oracle 数据库就能通过 重建数据来满足读取一致性查询的要求。

闪回查询是有目的地查询,可用来查找过去某个时间存在的某个版本的数据。只要过去那 个时间的还原信息仍存在,闪回查询就能成功完成。

还原数据也可用于从失败的事务处理中进行恢复。如果在用户决定提交或回退事务处理之 前用户会话异常结束(可能因为网络错误或客户机故障),就会导致事务处理失败。实例 崩溃也可能导致事务处理失败。

 

如果事务处理失败,最安全的行为是选择让 Oracle 数据库撤销用户做出的所有更改,
从而恢复原始数据。
所有事务处理的还原信息都至少保留到事务处理结束,事务处理可通过以下方式结束:
• 用户还原事务处理(回退)
• 用户结束事务处理(提交)
• 用户会话异常终止(回退)
• 用户会话异常终止然后退出(提交)
保留的还原数据量及其保留时间取决于数据库活动量以及数据库配置(askmac.cn)。

 

事务处理和还原数据

undo1

事务处理开始时,就会将其分配到一个还原段。在事务处理的整个过程中,更改数据时,原始(更改之前)值会被复制到此还原段。通过查看 v$transaction 动态性能视图,可以查看哪些事务处理被分配到哪些还原段。
还原段是为了支持事务处理,根据需要由实例自动创建的专用段。像所有段一样,还原段由区组成,区又由数据块组成。还原段可根据需要自动增长和收缩,对于所分配的事务处理它充当一个循环存储缓冲区。

事务处理会填充其还原段中的区,直至事务处理完成或占用了所有空间为止。如果填充完区之后还需要更多的空间,事务处理则获取段中下一个区的空间。占用了所有区之后,事务处理会自动转回到第一个区或请求系统为还原段分配新区。

 

存储还原信息

 

还原信息存储在还原段中,还原段又存储在还原表空间中。
还原表空间:
• 仅用于还原段
• 包含特殊的恢复注意事项
• 只能与单个实例相关联
• 要求在任意指定时间,对于一个给定实例只能有一个
还原表空间是当前可写还原表空间

 

还原段只存在于特定形式的、称为还原表空间的表空间中。尽管数据库可能有许多还原表空间,但一次只能有一个被指定为可写入还原数据的当前还原表空间。

还原段始终由 SYS 拥有。由于还原段充当循环缓冲区,因此每个段最少包含两个区。默认的最大区数取决于数据库块大小,但是此值非常大(块大小为 8 KB 时区数为 32,765)。还原表空间是永久的、本地管理的表空间,可以自动分配区。可以像管理其它执行异常恢复的表空间一样,管理这些还原表空间。由于需要有还原数据才能从失败的事务处理(如实例崩溃时可能会导致事务处理失败)中进行恢复,所以还原表空间只在实例处于 MOUNT状态时可恢复。还原表空间的恢复注意事项在“执行数据库恢复”一课中有所介绍(askmac.cn)。

 

还原数据与重做数据


undo2

 

 

还原数据和重做数据初看很相似,但是二者的作用却截然不同。在需要还原更改的情况下需要用到还原数据,以便保持读取一致性和执行回退。因某种原因而丢失了更改时,如果需要再次执行更改,就需要用到重做数据。
提交过程需要验证事务处理中所做的更改是否已写入重做日志文件。这个重做日志文件会永久保存在磁盘上,而不保存在内存中。此外,一般情况下会多路复用它。因此,磁盘上有重做数据的多个副本。即使更改尚未写入实际存储表块的数据文件,只要确保更改已写入重做日志文件就够了。
如果在已提交的更改反映到数据文件中之前恰好发生了停电故障,则不会导致出现问题,因为事务处理已提交。因此,当系统再次启动时,能够前滚到断电时尚未反映到数据文件的任何重做记录。

 

监视Undo还原

还原通常不需要进行管理。要监视的区域包括:
• 还原表空间中的空闲空间
• “快照太旧”错误

 

大多数时间,还原由实例自动进行管理,很少需要数据库管理员 (DBA) 进行干预。可能需要管理员介入的一些情况包括:

  • UNDO还原空间不足
  • 用户收到 ORA-01555 snapshot too old 错误消息

Undo还原信息始终保留,直至事务处理结束。这意味着如果删除或更新了大量的数据(插入操
作只占用极少的还原空间,因为插入数据的原始图像是空值)而没有提交,那么还原表空
间必须同样大以包含原始数据。假定使用以下命令删除了 50 GB 的表中的所有行:
SQL> DELETE FROM reallybigtable;
还原表空间需要留出 50 GB 的空间存储原始信息,以备发出此语句的用户改变主意而要回退更改。当还原表空间用完了用于存储还原数据的空间时,用户会收到如下错误消息:
ORA-01650: unable to extend rollback segment

通过预防性监视,可在问题影响到用户之前就检测到还原表空间中的空间问题。

管理员在还原信息时还可能遇到另一个问题,就是当查询需要访问还原信息时还原信息已被覆盖。这可能发生在长时间运行的查询或闪回查询中。当查询需要过去某一时间的数据“快照”,而重建快照需要的还原数据已不再存在时,查询会返回以下错误:
ORA-01555: snapshot too old

之所以会发生这种情况,是因为 Oracle 数据库向用户展示的数据视图与查询开始运行时的数据视图是一致的。如果查询的表有未提交的更改,Oracle 数据库会通过读取还原数据来获取数据的已提交版本。这就是读取一致性。如果查询运行时间太长,其间修改已被提交,随后其还原数据已释放且被覆盖,那么查询运行很长时间后看见的数据视图不再与查询刚开始运行时看见的数据视图一致。因此,应根据运行时间最长的查询配置还原保留期。

 

管理Undo还原

应对还原表空间进行管理,以防止:
• 还原表空间中出现空间错误:
– 正确调整还原表空间的大小。
– 确保定期提交大型事务处理。
• “快照太旧”错误:
– 配置适当的还原保留期间隔。
– 正确调整还原表空间的大小。
– 考虑确保还原保留期。

使用自动还原管理:
UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE=UNDOTBS1

建议使用自动还原管理,将 UNDO_MANAGEMENT 初始化参数设置为 AUTO 即可完成配置。为了向后兼容 Oracle8i 及较早版本,支持手动还原管理,但需要 DBA 进行更多干预。
使用自动还原管理时,通过使用 UNDO_TABLESPACE 初始化参数控制实例使用哪个还原表空间,DBA 可在表空间级管理还原。选择还原表空间之后,管理员只需要考虑提供足够的空间并配置还原保留期间隔。
使用手动管理,DBA 还必须考虑:
• 调整段大小(包括最大区)和调整区大小
• 找出并清除阻塞事务处理
• 创建足够的回退段以处理事务处理(手动模式下,还原段也称为回退段)
• 选择表空间以包含回退段(还原表空间仅用于自动还原管理)

 

配置还原保留期

UNDO_RETENTION 指定要将已提交的还原信息保留多长
时间(秒数)。在以下情况下必须设置这个参数:
• 还原表空间启用了 AUTOEXTEND 选项
• 要设置 LOB 的还原保留期
• 要确保保留期

 

UNDO_RETENTION 指定了还原保留期的低阈值(秒数)。若是 AUTOEXTEND 还原表空间,系统至少将还原数据保留到这个参数指定的时间,并自动调整还原保留期以满足查询的还原要求。若是固定大小的还原表空间,系统根据还原表空间大小和使用历史记录,自动调整可能的最大还原保留期;系统会忽略 UNDO_RETENTION,除非启用了保留期确保(retention guarantee)。因此,对于自动的还原管理时,列出的三种情况都使用了UNDO_RETENTION 设置。除这三种情况以外,均忽略此参数。
Undo还原信息分为三类:
• 未提交的还原信息:支持当前运行的事务处理,如果用户要回退事务处理或事务处理失败时,需要用到这类信息。绝不会覆盖未提交的还原信息。
• 提交的还原信息:不再需要用来支持运行的事务处理,但是为了符合还原保留期间隔,仍要用到这类信息。这也称为“未过期”还原信息。如果活动事务处理不是因为缺少空间而失败,就会保留已提交的还原信息。
• 过期的还原信息:不再需要用来支持运行的事务处理。活动事务处理需要空间时会覆盖过期的还原信息。

 

确保还原保留期

undo3

 

默认还原行为是覆盖已提交的但尚未过期的事务处理,以防止活动事务处理因缺少还原空间而失败。

可以通过确保保留期来更改此行为。确保了保留期后,即使会导致事务处理失败,仍会强制实施还原保留期设置。
RETENTION GUARANTEE 是表空间属性而不是初始化参数。只能使用 SQL 命令行语句来更改此属性。通过更改还原表空间来确保保留期的语法是:

SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

要将有确保保留期的还原表空间返回到其常规设置,请使用以下命令:

SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;

保留期确保仅适用于还原表空间。尝试对非还原表空间设置保留期会产生以下错误:
SQL> ALTER TABLESPACE example RETENTION GUARANTEE;
ERROR at line 1:
ORA-30044: ‘Retention’ can only specified for undo tablespace

 

调整Undo还原表空间的大小

undo4

必须调整还原表空间的大小,以便还原表空间包含所有事务处理的原始信息。单击Enterprise Manager 的“Administration(管理)”页上的“Undo Management(还原管理)”链接,显示系统还原概览,包括当前设置、每分钟还原占用率及指定时期内运行时间最长的查询的时间长度。

属于还原表空间的数据文件在用完空闲空间时可自动扩展。Oracle 公司建议,不要对与还原表空间相关联的数据文件启用自动扩展,这与对其它表空间的建议不同。第一次确定还原空间要求时,可能要对数据文件启用自动扩展,但在正确调整表空间的大小之后,必须禁用自动扩展。通过对还原表空间数据文件禁用自动扩展,可避免单个用户因忽略提交事务处理而无意中占用大量的磁盘空间。

 

 

 

使用还原指导

undo5

可通过“Undo Management(还原管理)”属性页访问还原指导。还原指导可估计满足指定的还原保留期所需要的还原表空间大小。
输入期望的保留期,还原指导分析区域会显示支持保留期所需要的表空间大小。还可以通过单击图上的一点来查看支持选定期间所需要的表空间大小。

选择了还原保留期之后,单击“OK(确定)”可实施新保留期。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *