重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1544|回复: 0
打印 上一主题 下一主题

12c 新特性 -- 临时撤销段(TEMPORARY UNDO)

[复制链接]
跳转到指定楼层
楼主
发表于 2019-2-19 17:26:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 郑全 于 2019-2-19 17:37 编辑

默认,临时表的撤销信息都会存储在撤销表空间中,并且会将重做信息记录到重做日志。这个方式和普通的表的撤销信息是一样管理的。
然而,你可以使用TEMP_UNDO_ENABLED初始化参数来分离临时表的撤销信息和普通表的撤销信息。


当这个参数设置成TRUE,这是临时表的的撤销信息被称作TEMPORARY UNDO。这是12c才有的功能。


1. 关于管理临时撤销段

临时撤销记录都是存储在数据库的临时表空间中,并且因此不会记录日志到重做日志中。当临时撤销段启用了,临时表空间会有一些段空间用来存放临时撤销段。这些段空间被称为临时撤销段。
当临时撤销段启用了,数据库会增加临时表空间用来存放撤销记录的空间大小。
启动临时撤销段会有如下的好处:

  l    临时撤销信息会减少撤销表空间中撤销记录的数量
       撤销表空间中更少的撤销记录可以让更多必要的撤销信息存入撤销表空间。

  l    临时撤销信息可以减少重做记录。  
       启用了临时撤销段让更少的数据写入到重做日志中可以提升性能,并且那些分析重做日志的组件可以解析更少的重做数据。

  l    临时撤销端可以在ADG搭建DG环境中支持临时表中数据的DML操作。然而,DDL语句创建临时表必须是主库发出.

  可以分别给指定的会话或者给整个数据库系统启动撤销段。当你使用ALTER SESSION给指定的会话启用了临时撤销段,那么这个会话创建的临时撤销段不会影响其他的会话。当你使用ALTER SYSTEM给系统启用了临时撤销段,那么已经存在的和新的会话都会期启用临时撤销段。

  当一个会话第一次使用了临时对象,那么当前的TEMP_UNDO_ENABLE初始化参数值会对当前会话一直有效。因此,如果一个会话已经启动了临时撤销段并且会话也在使用临时对象,那么不能给该会话禁用临时撤销段。相同的,如果一个会话已经禁用了临时撤销段并且会话在使用临时对象,那么不能为该会话启用临时撤销段。

  ADG搭建DG的时候,临时撤销段是默认启用的选项。设置TEMP_UNDO_ENABLED初始化参数因为ADG默认配置的关系(默认开启),不会对ADG有任何影响。

2. 启用和禁用临时撤销段

  你可以在会话和系统级别启用和禁用临时撤销段。为了这么做,你需要配置TEMP_UNDO_ENABLED初始化参数。

  怎样启用或禁用临时撤销段:

  1.在SQLPLUS中,连接到数据库.
     如果在会话中启用和禁用临时撤销段,那么在SQLPLUS的会话中操作。
     如果在系统中启用和禁用临时撤销段,那么请使用管理员身份在SQLPLUS中使用ALTER SYSTEM系统权限操作。
   2.设置TEMP_UNDO_ENABLED初始化参数
     l    在会话级别启用临时撤销段,请执行以下语句:
          ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
     l    在会话级别禁用临时撤销段,请执行以下语句
          ALTER SESSION SET TEMP_UNDO_ENABLED = FALSE;
     | 在系统级别启用临时撤销段,请执行以下语句
          ALTER SYSTEM SET TEMP_UNDO_ENABLED = TRUE;
       在系统级别启用了临时撤掉段后,会话可以使用ALTER SESSION禁用临时撤销段。

     l  在系统级别禁用临时撤销段,请执行以下语句
       ALTER SYSTEM SET TEMP_UNDO_ENABLED = FALSE;
       在系统级别禁用了临时撤掉段后,会话可以使用ALTER SESSION启用临时撤销段。

      可以在初始化参数中设置TEMP_UNDO_ENABLED为TRUE将系统启用临时撤销段。
      这种情况下,所有的新会话都会创建临时撤销段,除非在系统级别使用ALTER SYSETEM语句,或者在会话级别使用ALTER SESSION禁用了临时撤销段。

3 . 查询临时undo信息


以下所列的字典视图是用来查看或查询临时undo数据相关统计信息的:


ü V$TEMPUNDOSTAT

ü DBA_HIST_UNDOSTAT

ü V$UNDOSTAT



SELECT to_char(BEGIN_TIME,'dd/mm/yy hh24:mi'),

TXNCOUNT,MAXCONCURRENCY,UNDOBLKCNT,USCOUNT,

NOSPACEERRCNT

FROM V$TEMPUNDOSTAT;


4.测试脚本

ALTER SYSTEM SET TEMP_UNDO_ENABLED=TRUE;

事务临时表:
CREATE GLOBAL TEMPORARY TABLE CGTT_DELETE_LHR AS SELECT * FROM SCOTT.EMP WHERE 1=2;
INSERT INTO CGTT_DELETE_LHR SELECT * FROM SCOTT.EMP WHERE ROWNUM<=5;

会话临时表:
CREATE GLOBAL TEMPORARY TABLE CGTT_PRESERVE_LHR ON COMMIT PRESERVE ROWS AS SELECT * FROM SCOTT.EMP WHERE 1=2;
INSERT INTO CGTT_PRESERVE_LHR SELECT * FROM SCOTT.EMP WHERE ROWNUM<=5;
SELECT * FROM CGTT_PRESERVE_LHR;

查看一张表是否临时表,可以从DBA_TABLES视图的DURATION列来查询:

SELECT UT.TABLE_NAME,
       UT.TABLESPACE_NAME,
       DECODE(UT.DURATION,'SYS$SESSION','会话级','SYS$TRANSACTION','事务级') T_TYPE
  FROM DBA_TABLES UT
WHERE UT.TEMPORARY = 'Y'
   AND UT.TABLE_NAME LIKE '%CGTT%';

SELECT to_char(BEGIN_TIME, 'yyyy-mm-dd hh24:mi') BEGIN_TIME,
       TXNCOUNT,
       MAXCONCURRENCY,
       UNDOBLKCNT,
       USCOUNT,
       NOSPACEERRCNT
  FROM V$TEMPUNDOSTAT;

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-5-2 08:20 , Processed in 0.083634 second(s), 19 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表