重庆思庄Oracle、Redhat认证学习论坛
标题: 12c 新特性 -- 临时撤销段(TEMPORARY UNDO) [打印本页]
作者: 郑全 时间: 2019-2-19 17:26
标题: 12c 新特性 -- 临时撤销段(TEMPORARY UNDO)
本帖最后由 郑全 于 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;
欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) |
Powered by Discuz! X3.2 |