在Oracle数据库中,UNDO是用于回滚操作的关键机制,它记录了事务在提交前的所有变更。以下是关于UNDO_ON_COMMIT、UNDO_TABLESPACE和UNDO_MANAGEMENT以及UNDO_RETENTION的相关概念和作用的解释:
UNDO_ON_COMMIT: 这个术语通常不单独使用,而是与事务的提交(COMMIT)相关。当一个事务提交后,相关的UNDO数据仍然可能被保留,这取决于UNDO_RETENTION参数的设置。UNDO数据对于提供事务的一致性读、数据库恢复以及Oracle Flashback特性是必要的。
UNDO_TABLESPACE: 这是一个初始化参数,用于指定Oracle实例使用的undo表空间。在自动UNDO管理模式下,数据库会管理undo表空间中的undo段和空间。如果没有指定UNDO_TABLESPACE,数据库将使用默认的undo表空间。
UNDO_MANAGEMENT: 这个初始化参数决定了数据库使用自动还是手动模式来管理undo空间。当设置为AUTO时,数据库自动管理undo空间,这是Oracle9i及以后版本的推荐做法。如果设置为MANUAL,则使用rollback segments来存储undo信息。
UNDO_RETENTION: 这个参数用于设置undo数据在被覆盖前应保留的最短时间(秒)。从Oracle 19c开始,系统会至少保留undo数据这么长时间,并自动调整undo保留期以满足查询的undo需求。如果undo表空间空间不足,系统可能会开始重用未过期的undo空间,这可能导致某些查询因“snapshot too old”而失败。
在管理UNDO时,数据库管理员可能需要考虑使用Oracle Flashback特性,例如Oracle Flashback Query,这可能需要比系统中最长运行的查询更长的undo保留时间。此外,在Oracle Active Data Guard环境中,可能需要在主实例上增加UNDO_RETENTION的值,以适应备用实例上的undo保留需求。
在自动UNDO管理模式下,数据库可以自动调整undo保留期,以适应系统活动和UNDO表空间的大小。如果UNDO表空间配置为自动扩展,数据库会动态调整undo保留期,使其比系统中最长的活动查询稍长。如果表空间是固定大小的,数据库会根据表空间大小和当前系统负载动态调整最佳可能的保留期。
如果需要手动创建或修改undo表空间,可以使用CREATE UNDO TABLESPACE或ALTER TABLESPACE语句。还可以使用DROP TABLESPACE语句删除undo表空间,并通过ALTER SYSTEM SET语句切换undo表空间。




