1.什么是TEMP_UNDO_ENABLED ?
TEMP_UNDO_ENABLED确定特定session 中的transactions是否具有临时撤消日志。oracle事务的默认选择是每个事务有一个undo日志。在会话级别/系统级别范围中,
该参数允许事务将其撤消日志分解为临时撤消日志(用于对临时对象的更改)和永久撤消日志(用于对持久对象的更改)
注意:1.通过将事务的撤消流分割为两个streams(临时的和永久的),oracle可以为这些streams提供单独的存储和保留模型。这会导致数据库中撤销日志和重做日志
的大小总体减少
2.一般应用场景,比如oracle应用程序使用临时对象(使用全局临时表或临时表转换),建议将该参数的值设置为true
1.1TEMP_UNDO_ENABLED设置的兼容属性和注意事项:
1.1当TEMP_UNDO_ENABLED设置为true,兼容初始化参数设置为12.0.0时,才能启用此特性。临时撤销特性为设置它的会话启用。在系统中设置它将影响所有现有
会话和即将到来的新会话。如果在init.ora中设置了值。除非被显式的ALTER SESSION或ALTER SYSTEM语句覆盖,否则所有即将到来的新会话都将继承这个值。
所有针对临时对象的操作的撤销都被认为是临时的。
1.2如果不将TEMP_UNDO_ENABLED设置为true,那么使用临时对象的现有应用程序就会按照原样运行
1.3一旦设置了参数的值,就不能在会话的生命周期内更改它。如果会话具有使用临时撤消的临时对象,则不能为会话禁用该参数。类似地,如果会话已经
使用常规撤消拥有临时对象,那么设置此参数将没有任何效
1.4此参数仅适用于 primary database。对于standby database,此参数将被忽略,因为在备用数据库上默认启用临时撤销。
------------------------------------------
2.TEMP_UNDO_ENABLED属性简介:
--------------------------------------------

3.对于temp undo的管理:
默认情况下,临时表的撤销记录存储在undo表空间中,并记录在redo中,这与持久表的undo管理方法相同。但是,可以使用TEMP_UNDO_ENABLED初始化参数将
临时表的撤消与持久表的撤消分离。当该参数设置为TRUE时,临时表的撤消称为临时撤消
3.1对于临时撤销的管理:
临时撤销记录存储在oracle的临时表空间中,因此不会记录在重做日志中。当启用临时撤消时,临时表空间使用的一些段存储临时撤消,这些段称为临时撤消段。
3.2在启用临时撤消时,可能需要增加临时表空间的大小,以考虑撤消记录。
3.2.1临时撤销减少了undo表空间中存储的undo的数量。
3.2.2撤销表空间中的撤销越少,对撤销记录的撤销保留期要求就越现实。
3.2.3临时撤销减少了重做日志的大小
3.2.4至少从工作原理上讲性能是可以得到了改善的,因为写入重做日志的数据更少,解析重做日志记录的组件(如LogMiner)性能更好,因为要解析的重做数据更少
注意:在adg中临时撤销允许对physical standby中的临时表执行dml操作。但是,创建临时表的ddl操作,比如创建之类的必须在primary database.上发出。
3.3设定规则:
3.3.1我们可以为特定会话或整个系统启用临时撤消功能。当使用ALTER session语句为会话启用临时撤销时,会话会创建临时撤销,而不会影响其他会话。
当使用ALTER system语句为系统启用临时撤消时,所有现有会话和新会话都会创建临时撤消。
3.3.2当会话第一次使用临时对象时,将为会话的其余部分设置TEMP_UNDO_ENABLED初始化参数的当前值。因此,如果会话启用了临时撤消,而会话使用了临时对象,
那么会话就不能禁用临时撤消。类似地,如果会话禁用了临时撤销,而会话使用了临时对象,则无法为会话启用临时撤销
3.3.3默认情况下,对于具有adg选项的 physical standby database,临时撤销是启用的。由于默认设置,启用TEMP_UNDO_ENABLED初始化参数对带有
adg选项的physical standby没有影响
------------------------------------------------
4.启用和禁用临时撤消
我们可以为会话或系统启用或禁用临时撤消。为此,设置TEMP_UNDO_ENABLED初始化参数来完成此部分工作;
4.1启用会话的临时撤销
ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
4.2禁用会话的临时撤销
ALTER SESSION SET TEMP_UNDO_ENABLED = FALSE;
4.3为系统启用临时撤销
ALTER SYSTEM SET TEMP_UNDO_ENABLED = TRUE;
4.4要禁用系统的临时撤销
ALTER SYSTEM SET TEMP_UNDO_ENABLED = FALSE;
注意:还可以通过在服务器参数文件或文本初始化参数文件中将TEMP_UNDO_ENABLED设置为TRUE来为系统启用临时撤销。在这种情况下,所有新会话都创建临时撤消,
除非通过ALTER system语句禁用系统的临时撤消,或者通过ALTER session语句禁用会话
------------------------------------------
5.对于adg上的临时表进程dml操作:
5.1首先必须清楚,oracle不允许在 read-only database做redo allowed。当我们使用dml操作对全局临时表进行更改时,更改本身不会生成redo,因为它只是临时表。
但是,为更改生成的撤消会反过来生成重做。在Oracle数据库12c版本1(12.1)之前,这意味着全局临时表不能用于Oracle adg standbys,因为它是只读的
5.2但是,对于Oracle数据库12c版本1(12.1),临时撤销特性允许将对全局临时表的更改的撤销存储在临时表空间中,而不是撤销表空间中。存储在临时表空间中
的撤消不会生成重做,因此可以对全局临时表进行无重做更改。这允许DML操作adg stand上的全局临时表。这个特性对Oracle数据保护有以下好处:

注意:1.要在primary database上启用临时撤销,使用TEMP_UNDO_ENABLED初始化参数即可。在adg的standby上,默认情况下总是启用临时撤销,所以TEMP_UNDO_ENABLED参数没有影响
2.对于全局临时表(例如,创建和删除)的ddl操作仍然必须从主数据库发出。
3.Oracle adg实例上的临时撤销特性不支持临时blob或临时clob
4.如果Oracle adg实例上的分布式事务涉及到对本地对象的更改,则不允许使用它们。例如,我们不能提交一个事务,该事务修改adg实例上的全局临时表,
并使用dblink更新另一个数据库上的remote table。在发出远程DML操作之前,必须将任何未完成的DML操作提交或回滚到活动数据保护实例上的全局临时表,
反之亦然。这还包括对解释PLA之类的操作生成的全局临时表的隐式写操作
-----------------------------------------------
6.相关报错及其bug说明:
6.1ORA-600 [kturrur_0] can occur on a Primary DB with temp_undo_enabled = TRUE
如果使用temp_undo_enabled = FALSE运行,则可以避免此问题。temp_undo_enabled是一个12c特性。设置true可以减少重做,这样的设置可能会影响系统的性能-
多少取决于很多因素。

注意:6.2.和6.3说的是一个事,对于分布式事务(以及dblink上的remote transaction),不支持临时表。虽然在过去没有给出这个错误,但它仍然存在。会话
持续时间临时表在使用常规撤消时似乎可以工作,但是临时撤消在事务中引入了一个额外字段,该字段引用会话状态,因此不能在分布式事务中可靠地使用。
临时撤销是12c中的一个新特性,必须显式地请求它。
-------------------------------------------
7.最后我们思考一个问题,如何确定特定会话中的事务是否可以在12C中具有临时撤消日志?
注意:如果以上都理解了,那么答案已经有的。
7.1我们在第一个章节了解到,TEMP_UNDO_ENABLED确定特定会话中的事务是否具有临时撤消日志。数据库事务的默认选择是每个事务有一个undo日志。
在会话级别/系统级别范围中,该参数允许事务将其撤消日志分解为临时撤消日志(用于对临时对象的更改)和永久撤消日志(用于对持久对象的更改)。
7.2然后通过将事务的撤消流分割为两个strams对吧(临时的和永久的),oracle可以为这些streams提供单独的存储和保留模型。这会导致数据库中撤销日志
和重做日志的大小总体减少
7.3如果Oracle的应用程序使用临时对象(使用全局临时表或临时表转换),官方强烈建议将该参数的值设置为true。
7.4当TEMP_UNDO_ENABLED设置为true,兼容初始化参数设置为12.0.0时,启用此特性。临时撤销特性为设置它的会话启用。在系统中设置它将影响所有现有
会话和即将到来的,我们叫新的会话。如果在init.ora中设置了值。除非被显式的ALTER SESSION或ALTER SYSTEM语句覆盖,否则所有即将到来的会话都
将继承这个值。所有针对临时对象的操作的撤销都被认为是临时的
7.5不带DEFERRED关键字的ALTER SYSTEM语句会修改实例中所有会话的参数的全局值,直到实例结束(说白了就是直到数据库关闭)。比如:
ALTER SESSION SET parameter_name = value
带着问题思考和理解,带着怀疑一切的态度去学习oracle,尽可能去充分理解工作原理基础上学习技术。这是600团队一直秉承的观念和学习思路
------------------------------------------
《点亮梦想.拒绝平庸》
600团队QQ群:851604218




