管理临时undo段
默认情况下,临时表的undo记录存储在undo表空间中,并在重做中记录,这与管理持久表的undo方式相同。但是,可以使用TEMP_UNDO_ENABLED 初始化参数来区分临时表的undo和持久表的undo。当此参数设置为TRUE时,对临时表的undo称为临时undo。
关于管理临时undo的概述
临时undo记录存储在数据库的临时表空间中,因此不会被记录在重做日志中。当启用临时undo时,临时表空间使用的一些段存储临时undo,这些 段称为临时undo段。
当启用临时undo时,可能需要增加临时表空间的大小来处理undo记录。
启用临时undo有以下好处:
.临时undo减少了存储在undo表空间中的undo量。undo表空间中较少的undo可以使undo记录的undo保留期需求更符合实际。
.临时undo减少了重做日志的大小。性能得到了提高,因为写入重做日志的数据更少,解析重做日志记录的组件(如LogMiner)性能更好,因为 需要解析的重做数据更少。
.临时undo使用Oracle Active data Guard选项对物理备用数据库中的临时表启用数据操作语言(DML)操作。但是,必须在主数据库上发出创建 临时表的数据定义语言(data definition language, DDL)操作。
可以为特定会话或整个系统启用临时undo。当使用ALTER session语句为会话启用临时undo时,会话将创建临时undo,而不会影响其他会话。当 您使用ALTER system语句为系统启用临时undo时,所有现有会话和新会话都会创建临时undo。
当会话第一次使用临时对象时,初始化参数TEMP_UNDO_ENABLED的当前值将用于会话的其余部分。因此,如果对会话启用了临时undo功能,并且 会话使用了临时对象,则不能对该会话禁用临时undo功能。类似地,如果对某个会话禁用了临时undo,而会话使用了临时对象,则不能对该会话 启用临时undo。
默认情况下,使用Oracle Active Data Guard选项为物理备用数据库启用临时undo。由于默认设置,TEMP_UNDO_ENABLED初始化参数对具有 Active Data Guard选项的物理备用数据库没有影响。
只有当数据库的兼容性级别为12.0.0或更高时,才能启用临时undo。
启用和禁用临时undo
可以为会话或系统启用或禁用临时undo。为此,需要设置初始化参数TEMP_UNDO_ENABLED。
启用或禁用临时undo:
1.在SQL*Plus中,连接到数据库。如果您正在启用或禁用会话的临时撤销,则在SQL*Plus中启动会话。
如果您正在启用或禁用系统的临时undo,那么在SQL*Plus中以具有ALTER system系统特权的管理用户身份进行连接。
[oracle@18c1 ~]$ sqlplus / as sysdba SQL*Plus: Release 18.0.0.0.0 - Production on Fri Jun 5 17:25:10 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0
2.设置TEMP_UNDO_ENABLED初始化参数:
.要启用会话的临时undo,运行以下SQL语句:
SQL> ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE; Session altered.
.要禁用会话的临时undo,请运行以下SQL语句:
SQL> ALTER SESSION SET TEMP_UNDO_ENABLED = FALSE; Session altered.
.要为系统启用临时undo,请运行以下SQL语句:
SQL> ALTER SYSTEM SET TEMP_UNDO_ENABLED = TRUE; System altered.
在为系统启用临时undo后,会话可以使用ALTER session语句禁用临时undo。
.要禁用系统的临时undo,请运行以下SQL语句:
SQL> ALTER SYSTEM SET TEMP_UNDO_ENABLED = FALSE; System altered.
在为系统禁用临时undo后,会话可以使用ALTER session语句启用临时undo。
还可以通过在服务器参数文件或文本初始化参数文件中将TEMP_UNDO_ENABLED设置为TRUE来启用系统的临时undo。在这种情况下,所有的新会话 都会创建临时undo,除非通过ALTER system语句对系统禁用了临时undo,或者通过ALTER session语句对会话禁用了临时undo。