当对数据进行修改时,Oracle数据库会将旧的数据存储到UNDO表空间(回滚表空间)。回滚表空间让用户可以rollback到修改前的数据,提供了读一致性,并支持闪回查询过去的数据。Undo也用来在Transaction出问题的时候恢复数据,例如用户在执行事务的时候断开会话,没有进行rollback或者commit。或者实例出问题需要shutdown abort的时候,Oracle数据库会恢复数据到用户更改之前的状态。

回滚信息保留到以下条件发生:

  • rollback
  • commit
  • DDL(因为DDL会先Commit)
  • 用户不正常的断开会话(自动rollback到用户更改之前的数据)
  • 用户使用exit正常断开会话(自动commit)

Undo信息的存储

回滚数据保留的数量和保留的时间依赖于数据库的操作量以及初始化参数的设置。



进行数据操作的时候,数据值变化时,旧值就会被复制到UNDO表空间的UNDO段。Undo段是Oracle数据库自动创建用来支持Transaction的,和所有的段一样,Undo段也是由区组成,区由数据块组成。Undo段自动的增长与收缩,不需要认为干预。

Transaction填充undo段中的区,当transaction结束后,空间将会被回收。如果一个区被写满了,Transaction会从段中下一个区获得空间写入数据。当所有的区都被写满了,Transaction会回到段的第一个区开始重写或者再为段申请分配新的区。

Undo段自动创建,Owner是SYS用户。因为Undo是循环使用的,所以一个Undo段至少两个区。

Undo信息保存在Undo表空间,Undo表空间只能存储Undo段。DBCA创建数据库的时候,会自动创建一个small file的UNDO表空间,虽然可以创建Big file的Undo表空间,但如果在高并发的OLTP环境,大量并发的事务会造成对Undo文件头的争抢,Small File可以避免这个问题。

Undo表空间也是永久表空间,它的Extent Management采用的本地管理Locally Managed(相对于数据字典),Auto Extent Allocation(相对于Uniform)。

通过cdb_tablespaces查看每个容器的undo表空间名。

SQL> SELECT tablespace_name,extent_management,allocation_type, con_id
2 FROM cdb_tablespaces
3 WHERE tablespace_name like 'UNDO%'; TABLESPACE_NAME EXTENT_MAN ALLOCATIO CON_ID
------------------------------ ---------- --------- ----------
UNDOTBS1 LOCAL SYSTEM 1
UNDOTBS1 LOCAL SYSTEM 3

对比Undo与Redo数据

Undo用来撤销改变,并保证读一致性与闪回操作。Redo用来重现一个改变。Undo数据也写入到Redo日志中。

随着commit, redo数据被写入到redo日志文件中,redo日志文件存储在磁盘上,redo日志文件是多个副本同时存在磁盘上。Redo用来保证数据的一致性。

对比Shared与Local Undo模式

  • Shared Undo: 只在CDB$ROOT设置一个Undo表空间,所有的PDB公用。
  • Local Undo: 每个PDB有自己的Undo表空间。如果创建PLUGGABLE PDB的时候需要用到HOT CLONE或者NEAR-ZERO DOWN TIME PDB RELOCATION,必须使用LOCAL UNDO表空间。
启用共享UNDO表空间
SQL> STARTUP UPGRADE;
SQL> ALTER DATABASE LOCAL UNDO OFF; 启用本地UNDO表空间
SQL> STARTUP UPGRADE;
SQL> ALTER DATABASE LOCAL UNDO ON;

通过DATABASE_PROPERTIES试图可以查看LOCAL_UNDO_ENABLED的值, FALSE=SHARED UNDO TABLESPACE, TRUE=LOCAL UNDO TABLESPACE。

SQL> select property_name, property_value from database_properties
2 where property_name = 'LOCAL_UNDO_ENABLED'; PROPERTY_NAME PROPERTY_VALUE
-------------------- --------------------
LOCAL_UNDO_ENABLED FALSE

配置Undo

undo信息的三种状态

  • Active 没有提交的undo信息。这些信息永远不会覆写。
  • Unexpired 已经提交的undo信息,对于事务来说不再需要,但仍在retention interval内进行保留。如果没有Retention Guarantee,在UNDO表空间没有空间可用时的时候会被覆写。
  • Expired 已经提交并以超出retention interval的undo信息,会被active的undo信息覆写。

系统初始化参数UNDO_RETENTION(单位:秒)设置了在COMMIT之后的多少秒内保留Undo数据。

开启了AUTO-EXTENDING的UNDO表空间,这个值是UNDO信息的最短保留时间,也是最长的闪回操作时间。因为开启了AUTO-EXTENDING的UNDO表空间可能会自动重写已经提交但还没有过期的Undo信息,他可能会降低闪回操作能够回退的时间点。

为了避免没有过期的undo信息被重写从而影响闪回,可以设置保证回滚信息的保留期限Guarantee Undo Retention。

RETENTION GUARANTEE是表空间的属性,需要使用ALTER TABLESPACE <tbs name> RETENTION GUARANTEE | NOGUARANTEE 来设置。

启用RETENTION GUARANTEE

SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
Tablespace altered.

禁用RETENTION GUARANTEE

SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
Tablespace altered.

RETENTION GUARANTEE只能设置在UNDO表空间,如果应用到其他表空间,命令执行会报错。

SQL> ALTER TABLESPACE users RETENTION GUARANTEE;
ALTER TABLESPACE users RETENTION GUARANTEE
*
ERROR at line 1:
ORA-30044: 'Retention' can only specified for undo tablespace

临时Undo



临时表也有undo信息,临时表的更改很频繁,将undo存在临时表中可以提升性能,主要是因为临时表空间中的更改不进行redo log的写入。

临时Undo的好处

  • 减少Undo表空间的使用量。
  • 减少到redo log的写入。
  • 使Oracle Active Data Guard的物理备用服务器可以在临时表空间进行DML(服务器上的TEMP_UNDO_ENABLED默认开启)。

启用临时UNDO

初始化参数TEMP_UNDO_ENABLED可以启用或者禁用临时UNDO。

可以在会话和系统级别定义这个参数。如果在会话级别启用,则只会在当前会话启用临时Undo,其他会话不受影响。如果在系统级别启用,所有当前会话和新会话都使用临时Undo。

SQL> ALTER SESSION SET temp_undo_enabled = True;
Session altered. SQL> ALTER SYSTEM SET temp_undo_enabled = False;
System altered.

监控临时Undo

V$TEMPUNDOSTAT包含了临时UNDO的统计信息,每十分钟进行一次统计。

Begin_Time: 统计开始时间

Txncount: 统计的十分钟内的Transaction数量。

MaxConcurrency: 最大的并发事务数。

Undoblkcnt: Temporary Undo使用的数据块数。

USCNT: 创建的Temp Undo段数量。

NoSPEERRCNT: No Space Left for temporary Undo错误发生的数量。

SQL> SELECT to_char(BEGIN_TIME, 'yy-mm-dd hh24:mi.ss') "Begin Time",
txncount "Transaction amt", maxconcurrency, undoblkcnt,
uscount "USCNT", nospaceerrcnt "NOSPEERRCNT" FROM v$tempundostat; Begin Time Transaction amt MAXCONCURRENCY UNDOBLKCNT USCNT NOSPEERRCNT
----------------- --------------- -------------- ---------- ---------- -----------
23-01-27 21:37.51 0 0 0 0 0
23-01-27 21:27.51 1 0 1 1 0
23-01-27 16:07.51 0 0 0 0 0

[Oracle19C 数据库管理] 管理回滚表空间(UNDO Tablespace)的更多相关文章

  1. Oracle基础 03 回滚表空间 undo

    --查询默认的undo表空间 select name,value from v$parameterwhere name like '%undo%'; --创建 undotbs2 表空间 create ...

  2. 表空间(TableSpace)

    我们知道Oracle数据库真正存放数据的是数据文件(Data File),oracle表空间(tablespace)实际上是一个逻辑的概念,在物理上是并不存在的,那么把一组data files捻在一起 ...

  3. ORACLE的还原表空间UNDO写满磁盘空间,解决该问题的具体步骤

    产生问题的原因主要以下两点:1. 有较大的事务量让Oracle Undo自动扩展,产生过度占用磁盘空间的情况:2. 有较大事务没有收缩或者没有提交所导制:说明:本问题在ORACLE系统管理中属于比较正 ...

  4. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  5. Spring事务管理回滚问题

    Spring事务管理不能回滚问题 在前段时间学习SpringMVC的练习中,碰到声明式事务管理时,事务不能回滚的情况,通过查看博客和资料,解决了问题. 原因 导致Spring事务管理不能回滚的原因有两 ...

  6. oracle创建用户和角色、管理授权以及表空间操作

    show user 显示当前用户connect username/password@datebasename as sysdba 切换用户和数据库 和用户身份 Oracle登录身份有三种: norma ...

  7. 修改Oracle 表空间名称 tablespace name

    修改表空间名称步骤如下: 1. 使用oracle用户登录执行 $sqlplus / as sysdba 2. 执行修改表空间命令如下 SQL> alter tablespace  TEST re ...

  8. oracle --(四)表空间(tablespace)

    基本关系:数据库---表空间---数据段---分区---数据块 表空间(tablespace)表空间(tablespace)是包含物理数据文件的逻辑实体,存放数据库的所有可用数据,因此表空间的尺寸也是 ...

  9. springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息

    一.知识点及问题 后端框架: Spring .Spring mvc .mybatis 业务需求: client先从服务端获取用户大量信息到client,编辑完毕之后统一Post至服务端,对于数据的改动 ...

  10. Spring事务管理——回滚(rollback-for)控制

    探讨Spring事务控制中,异常触发事务回滚原理.文章进行了6种情况下的Spring事务是否回滚. 以下代码都是基于Spring与Mybatis整合,使用Spring声明式事务配置事务方法. 1.不捕 ...

随机推荐

  1. CSS 数学函数与容器查询实现不定宽文本溢出跑马灯效果

    在许久之前,曾经写过这样一篇文章 -- 不定宽溢出文本适配滚动.我们实现了这样一种效果: 文本内容不超过容器宽度,正常展示 文本内容超过容器的情况,内容可以进行跑马灯来回滚动展示 像是这样: 但是,之 ...

  2. Python爬虫:原来微博上的视频下载链接在这啊

    最近看了一下网页版的微博,觉得那上面的视频不错,想获取它上面的下载链接,于是就写了这篇博文. 1. 几个视频播放平台的下载链接的实现 1. 西瓜视频 西瓜视频这个平台上面的视频下载链接一开始就存在于视 ...

  3. LeetCode-1219 黄金矿工

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/path-with-maximum-gold 题目描述 你要开发一座金矿,地质勘测学家已经探明了这 ...

  4. Kotlin学习-类(嵌套类,内部类,数据类,静态类)及类扩展

    一般类形式: class Person(var name: String){//构造函数放在类头部 var age = 1 var fulName: String var address = &quo ...

  5. AttributeError: module 'requests' has no attribute 'get' 报错分析

    这个报错与代码时没有关系 当文件名与调用模块名重合时,系统找不到我们调用的requests模块. 在命名时,我们要注意不要重合.

  6. 搜索(todo)

    目录 BFS 3. 最短单词路径 DFS 1. 最大连通面积 2. 矩阵中的连通分量 Backtracking 在矩阵中寻找字符串 5. 全排列 6. 含有相同元素全排列 7. 组合 8.组合求和 9 ...

  7. Vulnhub:mhz_c1f靶机

    kali:192.168.111.111 靶机:192.168.111.197 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  8. oracle收缩表和表空间

    oracle shrink space收缩表 segment shrink分为两个阶段: 1).数据重组(compact):通过一系列insert.delete操作,将数据尽量排列在段的前面.在这个过 ...

  9. Golang依赖管理工具: go module 详解

    Golang依赖管理工具: go module (go1.11+) 大多数语言都会有包管理工具,像Node有npm,PHP有composer,Java有Maven和Gradle. 可是,Go语言一直缺 ...

  10. Vue项目使用/deep/报错:SassError: expected selector解决方案--亲测有效

    项目npm run dev报错如下: 解决方法: 尝试用 ::v-deep 替换 /deep/ ,成功解决了问题. 效果如下图所示(完美解决~) 某些预处理器(例如Sass)可能无法>>& ...