在12C版本,为了减少UNDO表空间的使用率及减少REDO和归档日志的产生量,ORACLE推出了临时UNDO段(Temporary Undo Segments)新特性。这个新特性把临时表产生的UNDO信息从UNDO表空间挪到了临时表空间,这样就减少了UNDO表空间的使用。临时表的DML操作不会产生REDO日志,但是UNDO表空间的数据会写入REDO日志中,这样将临时表产生的UNDO数据从UNDO表空间挪到临时表空间,就不会把临时表产生的UNDO信息写入REDO日志中,这样就减少了REDO日志的产生量,也就减少了归档日志的生成量。

ORACLE通过temp_undo_enabled参数来控制临时UNDO段新特性的启用,默认是FALSE关闭状态。

SQL> show parameter undo

NAME TYPE VALUE

------------------------------------ ----------- ----------

temp_undo_enabled boolean FALSE

undo_management string AUTO

undo_retention integer 900

undo_tablespace string UNDOTBS1

下面测试一下在启用和禁用临时UNDO段特性时,产生的REDO信息对比,先创建测试表。

SQL> create global temporary table t_test_temp as select * from T_TEST where 1=2;

Table created.

重新打开一个会话,查询当前产生的REDO信息。

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 4

redo size 1324

在默认情况下也就是禁用临时UNDO段特性的情况下,向一张临时表插入数据。

SQL> insert into t_test_temp select * from t_test;

6136934 rows created.

再次查看这个会话的REDO产生量。

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 60964

redo size 21357176

可见,在禁用临时UNDO段特性的情况下,向临时表中插入数据会产生很多的REDO数据,这是因为临时表产生的UNDO数据当前保存在UNDO表空间中,而UNDO表空间的数据也会写入到REDO日志。

下面在开一个新会话,并且启用临时UNDO段特性。

SQL> alter session set temp_undo_enabled=true;

Session altered.

查看这个会话的当前REDO产生量。

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 2

redo size 744

然后向临时表中插入同样的数据。

SQL> insert into t_test_temp select * from t_test;

6136934 rows created.

再次查看这个会话的REDO产生量。

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 3

redo size 1024

可见,在启用临时UNDO段的情况下,对临时表进行插入操作,REDO的产生非常少,这些应该都是数据字典变更产生的REDO。

大家应该知道,COMMIT和ROLLBACK操作是一个事务的终止,COMMIT操作只是打个标记,并不会修改数据,而ROLLBACK操作,是要根据UNDO数据去还原数据的,也就是ROLLBACK操作会修改数据,那么就意味着ROLLBACK操作是会产生REDO和UNDO的,如果是临时表的ROLLBACK操作,因为临时表本身不产生REDO,但是会产生UNDO。

下面分别对上面测试的两个会话进行ROLLBACK操作,再看一下REDO的产生量。

禁用临时UNDO段的情况下回滚后REDO产生量:

SQL> rollback;

Rollback complete.

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 121794

redo size 27432588

回滚禁用临时UNDO段的情况下的INSERT操作产生的REDO,基本上等于插入时的REDO产生量。

在看一下启用临时UNDO段的情况下回滚后REDO产生量:

SQL> rollback;

Rollback complete.

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 4

redo size 1156

回滚启用临时UNDO段的情况下的INSERT操作产生的REDO,基本上不产生REDO。这是因为临时表的DML操作本身就不生成REDO,而临时表的UNDO数据被保存到的临时表空间,临时表空间的数据也不会写入REDO文件。

本实验只是模拟了INSERT操作,有较真的朋友可以测试下DELETE和UPDATE操作。

最后再吐一下槽,貌似这个功能启用之后,在这个会话中并不能关闭,我的测试数据库版本是12.2.0.1.0版本,下面是测试过程。

[oracle@hm-oradb-01 ~]$ sqlplus dbdream/dbdream@localhost/pdb1

SQL*Plus: Release 12.2.0.1.0 Production on Thu Aug 30 12:27:34 2018

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Last Successful login time: Thu Aug 30 2018 10:46:41 +08:00

Connected to:

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> alter session set temp_undo_enabled=true;

Session altered.

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 2

redo size 744

SQL> insert into t_test_temp select * from t_test;

6136934 rows created.

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 3

redo size 1024

SQL> insert into t_test_temp select * from t_test;

6136934 rows created.

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 5

redo size 1436

在启用临时UNDO段的会话中,禁用临时UNDO段之后,这个禁用操作明显没有生效。

oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...相关推荐

  1. oracle12c 新增维护时间窗口,ORACLE 12C新特性-自动维护全局索引 | 信春哥,系统稳,闭眼上线不回滚!...

    今天在网上看了一篇关于12C新特性-自动维护全局索引的帖子,经测试,貌似根本不是那么回事呀.如果对分区表进行分区DDL操作,如果不加update index字句,全局索引就会失效,下面先看一下是11. ...

  2. oracle+12c+大表,ORACLE 12C新特性-在线迁移表或分区 | 信春哥,系统稳,闭眼上线不回滚!...

    今天测试一下ORACLE 12C的一个新功能-在线移动表或分区,这其实在10g版本就已经支持了,难道是官方文档写错了,先不按照文档描述的去测试,看看是否堆表也可以在线迁移.以下是实验过程: 下面先看下 ...

  3. oracle desc能看约束,ORACLE 12C新特性-DESC显示不可见字段 | 信春哥,系统稳,闭眼上线不回滚!...

    之前写过一篇关于12C新特性-不可见字段的文章,详见http://www.dbdream.com.cn/2014/01/19/oracle-12c%E6%96%B0%E7%89%B9%E6%80%A7 ...

  4. oracle 回滚 drop的表,使用ODU恢复被DROP的表 | 信春哥,系统稳,闭眼上线不回滚!...

    本实验模拟使用ODU恢复被DROP掉的表的恢复,有关ODU软件的下载和使用说明详见老熊的BLOG http://www.laoxiong.net 本实验以上一篇文章<使用ODU恢复被TRUNCA ...

  5. oracle数据泵导入提示00972,oracle数据库使用expdp指定FLASHBACK_TIME遇到ORA-39150错误 | 信春哥,系统稳,闭眼上线不回滚!...

    目前正在做一个数据库合并的项目,有一套系统使用分库分表并且读写分离的架构,订单系统和用户系统都是6个写库和6个读库,目前订单系统已经由6个写库合并为3个写库,马上要做用户系统的数据库合并工作,用户系统 ...

  6. oracle服务未启动失败,windows服务未启动导致 ORA-12560和RMAN-00554错误 | 信春哥,系统稳,闭眼上线不回滚!...

    今天,有人在群里问RMAN-00554.RMAN-04005.ORA-12560错误,如下: C:Usersstream>rman target / 恢复管理器: Release 11.2.0. ...

  7. linux oracle目录权限不够,Linux 目录权限不足导致ORA-39070错误 | 信春哥,系统稳,闭眼上线不回滚!...

    同事要做数据迁移测试,需要服务器权限,就在操作系统上给他创建了一个用户wzs,给分了dba组,拥有dba组的用户就可以正常操作数据库,而且可以使用最高权限(SYS). [root@SL010A-IVD ...

  8. 安装oracle不动了,windows2008安装ORACLE到2%不动的问题 | 信春哥,系统稳,闭眼上线不回滚!...

    最近又有网友遇到在windows2008服务器上安装ORACLE软件时到2%就卡住不动的问题,下面是该网友的描述: oralce 11g r2 windows server 2008 R2 安装到最后 ...

  9. oracle 设置输出显示中文乱码,修改oracle当前会话的语言环境,解决oracle显示中文乱码的问题 | 信春哥,系统稳,闭眼上线不回滚!...

    对于数据库ORACLE有时操作时,提示的是一串串???,不能起到提示的作用,这是由于语言环境的设置问题,下面是实际操作中要用到的. 查看当前会话的语言环境: SQL> select useren ...

最新文章

  1. linux下svn客户端安装及环境配置(转)
  2. RTT的IPC机制篇——IPC通信总结
  3. Eclipse添加git插件上传项目到github
  4. 用python画四叶草-python turtle工具绘制四叶草的实例分享
  5. Linux宝库名人轶事栏目 | 感恩每一天
  6. 战斗部毁伤效能评估软件系统
  7. 已知三点坐标,求圆心坐标 (外接圆)python实现
  8. python图片水印_用python来给图片加水印
  9. 抽签抽奖小程序小工具(jquery+html)只需浏览器运行xlsx.core.min.js
  10. 五光十色变色龙的制作
  11. w3c怎么检测html5,HTML5教程:html标签属性通过w3c验证
  12. Fxfactory插件:复古电影调色插件Sheffield Softworks Vintage
  13. 面试云计算工程师岗位经常被问到的40个问题
  14. 笨方法学python 习题14
  15. 区块链概念股2019:躁动与尴尬 |链捕手
  16. 讲一个故事:Redis的默认端口是6379
  17. 画出有3个节点的树和有3个结点的二叉树的所有不同的形态
  18. 三星android 8升级包,三星G930K官方安卓8.0固件rom升级更新包:KTC-G930KKKU2ESI3
  19. 互联网软件行业术语,非常全
  20. 安卓逆向学习——多开原理和实验

热门文章

  1. HBase基本操作命令整理
  2. docker,containerd,runc,docker-shim之间的关系
  3. vue商城项目开发:底部导航菜单(路由)
  4. javap分析字符串拼接执行流程
  5. Scala模式匹配:对元组进行匹配
  6. 【软考-系统架构师】计算机操作系统相关考题答案详解
  7. python进程共享内存_Python进程间通信之共享内存
  8. 用python玩转数据第四周答案_用Python玩转数据_章节答案
  9. Qt C++ 检测优盘插入或拔出
  10. 【通俗理解】锁存器,触发器,寄存器和缓冲器的区别