当对数据进行修改时,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. Git与GitHub的快速使用

    Git的快速使用 1. Git简介 Git最初是Linus花了两周时间自己用C写了一个分布式版本控制系统 特点: 分布式,每一个主机都有完整版本库 开源免费性能好 注:类似GitHub这种中心环境的存 ...

  2. pat乙级1023 组个最小数

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  3. MSB/LSB的意思

    MSB一般指最高有效位. 最高有效位( most significant bit,MSB)指的是一个n位二进制数字中的n-1位,具有最高的权值2^(n-1).最低有效位和最高有效位是相对应的概念. L ...

  4. fabric学习笔记7

    Fabric2.0Java SDK实践-合约交易 20201303张奕博 2023.1.18 1.创建基础工程 新建一个Maven工程,添加以下依赖 <dependency> <gr ...

  5. Windows清除DNS缓存

    第一步,刷新DNS WIN+R 输入cmd 再输入ipconfig/flushdns 第二步,恢复默认 输入netsh winsock reset 重启电脑.

  6. C++ MFC学习 (三)

    视窗口覆盖在框架窗口之上 如果有了 OnDraw 不要再用OnPaint  OnPaint会覆盖掉OnDraw所画内容 1 // MFC_Demo1View.cpp : CMFC_Demo1View ...

  7. More exceptional c++读书笔记【附高清PDF下载】

    Part1我是在读完Scott Meyers的<Effective c++>之后才读到这本书的.能够讨论特定的主题而不是将一门语言作为一个整体来看待是我理解c++的首选方式,所以Sutte ...

  8. 新的学习历程-python2 print

    1 print('hello world!') 2 print('hello','world!') #逗号自动添加默认的分隔符:空格 3 print('hello'+'world!') #加号表示字符 ...

  9. SQL语句中索引失效的原因

    SQL语句中索引失效的情况. 总结如下: 1. 索引字段进行判空查询时.也就是对索引字段判断是否为NULL时.语句为is null 或is not null. select * from 表一 whe ...

  10. yagmail 邮件模块

    安装 yagmail 安装yagmail:https://coding.net/s/01e2c2fe-82c0-4e05-a31b-f3e9e2dbc43a 下载完成之后,cmd 切换到文件目录下,执 ...