Undo段
1. Undo段的概念
Undo段是Oracle数据库中用于存储事务修改前数据的结构。它们的主要作用是支持事务的回滚、实现读一致性以及支持数据库恢复。
2. Undo段的类型
2.1 SYSTEM Undo Segment
- 定义:在数据库创建时自动生成,位于SYSTEM表空间中。
- 用途:用于管理对SYSTEM表空间中对象的更改。
- 特性:无论在手动模式还是自动模式下,SYSTEM Undo段的行为一致。
2.2 Non-SYSTEM Undo Segments
- 定义:用于管理非SYSTEM表空间中的事务。
- 模式:
- 自动模式(Auto mode):
- 需要至少一个UNDO表空间,Oracle会自动管理Undo段。
- 手动模式(Manual mode):
- 需要数据库管理员手动创建Undo段。
- 私有Undo段(Private):
- 由单个实例使用,通常在参数文件中指定。
- 可以通过
ALTER ROLLBACK SEGMENT
命令显式上线。
- 公共Undo段(Public):
- 形成一个Undo段池,供多个实例共享,通常用于Oracle RAC环境。
- 允许多个实例访问同一Undo段,提高了资源的利用率。
- 自动模式(Auto mode):
2.3 Deferred Undo Segments
- 定义:在表空间被下线时创建的Undo段。
- 用途:用于在表空间重新上线时回滚未提交的事务。
- 特性:当不再需要时,Oracle会自动删除这些Undo段。
3. Undo段的功能
3.1 事务回滚
- 当事务执行过程中发生错误或用户决定撤销更改时,Undo段中的旧数据会被用来恢复原始状态。
3.2 读一致性
- 在一个事务执行时,其他事务不能看到未提交的更改。Undo段提供了旧数据的视图,确保在查询时能够看到一致的数据状态。
3.3 数据库恢复
- 在实例故障或崩溃后,Oracle会使用Undo段中的信息来撤销未提交的事务,确保数据库在重新启动时处于一致状态。
4. Undo段的管理
- 自动管理:在自动模式下,Oracle会自动创建和管理Undo段,用户只需指定UNDO表空间。
- 手动管理:在手动模式下,数据库管理员需要创建和管理Undo段,确保它们的可用性和性能。
5. 性能考虑
- Undo表空间的大小:需要根据系统的事务量和并发性来合理配置Undo表空间的大小,以避免Undo段不足导致的性能问题。
- Undo段的使用:监控Undo段的使用情况,确保它们不会过度增长,影响数据库性能。
6. 相关视图
- DBA_ROLLBACK_SEGS:查看所有Rollback段的信息。
- V$UNDOSTAT:提供Undo段的使用统计信息。
- V$ROLLSTAT:显示Undo段的状态和性能指标。
通过理解这些细节,您可以更好地管理和优化Oracle数据库中的Undo段,以确保事务的完整性和数据库的性能。
### 自动Undo管理的概念
1. Undo表空间
- 定义:自动Undo管理使用一个专门的UNDO表空间来存储Undo数据。
- 配置:每个实例分配一个UNDO表空间,大小应根据实例的工作负载进行合理配置,以确保有足够的空间来存储Undo数据。
2. Undo数据的自动维护
- 自动管理:Oracle服务器会自动创建、维护和管理UNDO表空间中的Undo段,用户无需手动干预。
- 优点:这种自动管理减少了数据库管理员的工作负担,提高了系统的可靠性和性能。
3. Undo段的命名约定
- 命名规则:自动创建的Undo段遵循特定的命名约定,通常以“_SYSSMUn$”开头。
- 示例:
_SYSSMU1$
_SYSSMU2$
- 示例:
- 说明:这些命名规则帮助用户识别和管理自动生成的Undo段。
4. 自动Undo管理的工作流程
- 当事务对数据进行修改时,Oracle会在UNDO表空间中创建Undo段以保存修改前的数据。
- 当事务提交或回滚时,Oracle会自动更新Undo段,确保数据的一致性和完整性。
- 在实例崩溃或故障恢复时,Oracle会使用UNDO表空间中的数据来撤销未提交的事务,确保数据库恢复到一致状态。
5. 配置和监控
- 配置UNDO表空间:可以通过SQL命令创建和配置UNDO表空间,例如:
CREATE TABLESPACE undotbs1 DATAFILE 'undotbs01.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED; ALTER SYSTEM SET UNDO_TABLESPACE=undotbs1;
- 监控Undo使用情况:可以使用视图如
V$UNDOSTAT
和V$ROLLSTAT
来监控Undo段的使用情况和性能指标。
其他参数
1.1 UNDO_SUPPRESS_ERRORS参数
- 作用:UNDO_SUPPRESS_ERRORS参数设置为TRUE时,可以在自动Undo管理模式下执行手动操作时抑制错误。这对于在应用程序和脚本转换为自动Undo管理模式之前使用Undo表空间功能非常有用。
- 示例:通过设置
ALTER SESSION SET UNDO_SUPPRESS_ERRORS = true
,可以抑制ORA-30019错误,使得在自动Undo管理模式下执行手动操作时不会触发错误。
1.2 UNDO_RETENTION参数
- 作用:UNDO_RETENTION参数控制保留Undo数据的时间,以提供一致性读取。通过设置UNDO_RETENTION参数,可以确保数据库保留足够长的Undo数据,以支持长时间查询和一致性读取。
- 设置:UNDO_RETENTION参数以秒为单位定义,可以在初始化文件中设置或使用ALTER SYSTEM命令动态修改。例如,
ALTER SYSTEM SET UNDO_RETENTION=900;
表示保留Undo数据15分钟。
2. UNDO表空间大小调整
- 计算UNDO表空间大小:调整UNDO表空间大小需要考虑多个因素,包括UNDO_RETENTION参数设置、每秒生成的Undo数据块数量以及数据库块大小。
- 计算公式:通过查询V$UNDOSTAT视图获取每秒生成的Undo块数量,然后根据公式计算所需的字节数,并将其转换为MB。这有助于确定UNDO表空间的合适大小,以满足数据库的Undo数据存储需求。
3. Undo配额
- 功能:通过资源计划,可以对用户进行分组,并为每个组分配最大Undo空间限制。这有助于控制长事务和错误编写的事务消耗的资源。
- UNDO_POOL:UNDO_POOL是一个资源管理器指令,用于定义资源组允许的Undo空间量。当一个组超出其限制时,将无法执行新事务,直到当前事务完成或中止。
4. 获取Undo段信息
- 视图查询:通过查询DBA_ROLLBACK_SEGS、V$ROLLNAME、V$ROLLSTAT、V$UNDOSTAT、V$SESSION和V$TRANSACTION等视图,可以获取有关Undo段的详细信息,包括Undo段的状态、统计信息以及当前活动事务使用的Undo段情况。
- 用途:这些信息有助于监控Undo段的使用情况,优化Undo管理策略,并确保数据库的Undo数据得到有效管理和利用。
一些视图或表格
以下是关于DBA_ROLLBACK_SEGS
、V$ROLLNAME
、V$ROLLSTAT
、V$UNDOSTAT
、V$SESSION
和V$TRANSACTION
视图的详细字段说明:
1. DBA_ROLLBACK_SEGS
此视图提供有关所有回滚段的信息。
字段名 | 含义 |
---|---|
SEGMENT_NAME | 回滚段的名称 |
OWNER | 回滚段的所有者(通常是SYS或PUBLIC) |
TABLESPACE_NAME | 回滚段所在的表空间名称 |
STATUS | 回滚段的状态(ONLINE/OFFLINE) |
EXTENTS | 回滚段的区块数 |
INITIAL_EXTENT | 初始区块大小 |
NEXT_EXTENT | 下一个区块的大小 |
MIN_EXTENTS | 最小区块数 |
MAX_EXTENTS | 最大区块数 |
PCT_INCREASE | 区块增长百分比 |
2. V$ROLLNAME
此视图提供当前实例中所有回滚段的名称。
字段名 | 含义 |
---|---|
USN | 回滚段的唯一标识符 |
NAME | 回滚段的名称 |
STATUS | 回滚段的状态(ONLINE/OFFLINE) |
3. V$ROLLSTAT
此视图提供有关回滚段使用情况的统计信息。
字段名 | 含义 |
---|---|
USN | 回滚段的唯一标识符 |
EXTENTS | 回滚段的区块数 |
RSSIZE | 回滚段的大小(字节) |
HWMSIZE | 回滚段的高水位大小(字节) |
XACTS | 当前活动的事务数 |
STATUS | 回滚段的状态(ONLINE/OFFLINE) |
4. V$UNDOSTAT
此视图提供Undo段的统计信息,通常用于监控Undo使用情况。
字段名 | 含义 |
---|---|
BEGIN_TIME | 统计开始时间 |
END_TIME | 统计结束时间 |
UNDO_BLKS | 在该时间段内生成的Undo块数 |
TXN_COUNT | 在该时间段内的事务数 |
MAXQUERY | 在该时间段内的最大查询时间(秒) |
MAXRETENTION | 在该时间段内的最大保留时间(秒) |
5. V$SESSION
此视图提供有关当前会话的信息。
字段名 | 含义 |
---|---|
SID | 会话标识符 |
SERIAL# | 会话序列号 |
USERNAME | 当前会话的用户名 |
STATUS | 会话状态(ACTIVE/INACTIVE) |
OSUSER | 操作系统用户 |
MACHINE | 客户端机器名称 |
PROGRAM | 客户端程序名称 |
LOGON_TIME | 登录时间 |
6. V$TRANSACTION
此视图提供有关当前活动事务的信息。
字段名 | 含义 |
---|---|
XIDUSN | 事务的回滚段唯一标识符 |
UBAFIL | Undo块文件号 |
UBABLK | Undo块号 |
USED_UBLK | 已使用的Undo块数 |
STATUS | 事务状态(ACTIVE/COMMITTED/ROLLBACK) |