12c New Feature:Temporary Undo

背景:

本文是学习12c新特性的笔记,主要来源于官方文档和OU教材汇总而成。

什么是临时undo?

Temporary Undo是12c的新特性,如下图所示:

Temporary Undo verview

临时表广泛的被用作于为暂存中间结果分配区域,这是因为改变哪些表是比用非临时表快很多的。性能提升主要是因为实际上修改临时表没有redo条目直接产生。然而,在临时表(和索引)上操作的undo任然记录到redo log。临时表的undo,在该临时对象的其生命期的一致性读和事务回滚是有用的。超出此范围的undo是多余的。因此它在redo流中不需要持续。举例来说,事务恢复只是丢弃临时对象的undo。

从12c开始,可以通过把临时表的事务产生的undo,直接在临时表空间中存储独立undo流,来避免在redo流中记录undo。

注意:临时undo segment是会话私有的。它存储属于相应会话的临时表改变的undo

默认情况下,undo记录临时表是存储在undo表空间中,且记录到redo中,这是与undo管理永久表相同的方式。然而,你可以使用TEMP_UNDO_ENABLED初始化参数来从永久表的undo分离临时表的undo。当此参数设置为TRUE,临时表的undo调用temporary undo。

关于临时undo(Temporary Undo)管理

临时undo记录是存储在数据库临时表空间中,且因此不记录在redo log中。当临时undo是启用时,一些segment使用临时表空间存储临时undo,这些segment称之为temporary undo segments。当临时undo是启用时,它可能需要增加临时表空间的大小为undo记录。

启用临时undo提供以下优点:

  • 临时undo减少存储在undo表空间的undo数量。

在undo表空间中减少undo,可以 更好实现undo记录的undo保留期。

  • 临时undo减少redo log的大小

性能提升,是由于减少数据写入到redo log,和组件解析redo log记录。例如LogMiner,执行效率更高,是因为更少的redo数据需解析。

  • 在Oracle Active Data Guard选件中的物理备库中,临时undo能使数据操作语言(DML)在临时表上操作。然而,数据定义语言(DDL)操作创建临时表必须是在主数据库上发起的。

你可以使临时undo指定于会话层或整个系统,当你使用ALTER SESSION语句启用会话的临时undo,此会话创建临时undo不会影响其他会话。当你使用ALTER SYSTEM语句启用系统的临时undo,所有存在的会话和新会话会创建临时undo。

当会话首次使用临时对象,TEMP_UNDO_ENABLED初始化参数的当前值设置其会话。因此,如果临时undo是启用于会话和会话使用临时对象,那么临时undo不能禁用于此会话。同样的,临时undo是对会话禁用的和会话使用临时对象,那么临时undo不能启用于此会话。

对于Oracle Active Data Guard选件的物理备库,临时undo是默认启用的。在Oracle Active Data Guard选件的物理备库上,TEMP_UNDO_ENABLED初始化参数已经没有任何作用,因为这是默认设置的。

备注:
临时undo的特性,仅适用于数据库的COMPATIBLE初始化参数设置是12.1.0.0或更高。

启用和禁用临时undo

你可以对于session或system层面启用或禁用临时undo,通过设置TEMP_UNDO_ENABLED初始化参数来实现。
启用或禁用临时undo:

1、在SQL*Plus连接数据库

如果你启用或禁用session的临时undo,然后只需在session的SQL*Plus中执行。
如果你启用或禁用system的临时undo,然后使用有ALTER SYSTEM系统权限的管理员用户连接,在SQL*Plus中执行。

2、设置TEMP_UNDO_ENABLED初始化参数

在session层启用临时undo,运行以下SQL语句:

ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;

在session层禁用临时undo,运行以下SQL语句:

ALTER SESSION SET TEMP_UNDO_ENABLED = FALSE;

在系统层启用临时undo,运行以下SQL语句:

ALTER SYSTEM SET TEMP_UNDO_ENABLED = TRUE;

在系统层启用临时undo之后,session可以使用ALTER SESSION语句禁用临时undo。

在系统层禁用临时undo,运行以下SQL语句:

ALTER SYSTEM SET TEMP_UNDO_ENABLED = FALSE;

在系统层禁用临时undo之后,session可以使用ALTER SESSION语句启用临时undo。

你也可以通过在SPFILE文件中或pfile文件中设置TEMP_UNDO_ENABLED为TRUE来启用临时undo。在这种情况下,所有新session创建临时undo,除非临时undo通过ALTER SYSTEM语句在系统层禁用,或通过ALTER SESSION语句在会话层禁用。

另见:

监控临时undo

select to_char(begin_time,'dd/mm/yy hh24:mi:ss'),txncount,maxconcurrency,undoblkcnt,uscount,nospaceerrcnt from v$tempundostat;

V$TEMPUNDOSTAT显示关于此数据库实例临时undo日志的各种统计数据。

它显示统计数据直方图,展现系统是如何工作的。在视图中存放的每行统计数据采集至实例每十分钟的间隔。以BEGIN_TIME字段值降序排列行。此视图总共包含576行,以4天威周期。此视图类似于V$UNDOSTAT视图。
V$TEMPUNDOSTAT视图的重要列:

BEGIN_TIME: Identifies the beginning of the time interval.

TXNCOUNT: Total Number of transactions that have bound to temp undo segment within the corresponding time interval.

MAXCONCURRENCY: Highest number of transactions executed concurrently which modified temporary objects within the corresponding time interval.

UNDOBLKCNT: Total number of temporary undo blocks consumed during the corresponding time interval.

USCOUNT: Temp undo segments created during the corresponding time interval.

NOSPACEERRCNT: Total number of times the error no space left for temporary undo was raised during the corresponding time interval.

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据