LOCAL UNDO特性及管理

在12.2版本后您可以将CDB配置为在每个容器中使用本地撤消(默认),也可以对整个CDB使用共享撤消。
要确定当前的CDB撤消模式,请在CDB根目录中运行以下查询:
SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM   DATABASE_PROPERTIES
WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';
如果查询返回TRUE了PROPERTY_VALUE,那么,是本地撤销模式。否则,CDB处于共享撤消模式。
TRUE
PROPERTY_VALUE
处于本地共享撤销模式下的时候我们每一个PDB都有自己的UNDO表空间

关于本地撤消模式

本地撤消模式意味着每个打开容器的实例都有一个自己的撤消表空间。

在这种模式下,Oracle数据库会自动为CDB中的每个容器创建一个撤消表空间。对于Oracle RAC CDB,在本地撤消模式下,每个PDB的每个实例都有一个活动的撤消表空间。

本地撤消模式为每个容器提供了更高的隔离度,并提高了某些操作的效率,例如拔出容器或在容器上执行时间点恢复。另外,要支持某些操作,例如,重定位PDB或克隆处于开放式读/写模式的PDB,需要本地撤消模式。

当CDB处于本地撤消模式时,以下条件适用:

  • 任何对当前容器具有适当特权的用户都可以为该容器创建一个撤消表空间。
  • 在CDB中每个容器的静态数据字典视图和动态性能(V $)视图中都可以看到撤消表空间。
配置CDB使用本地撤消模式

您可以通过发出一条ALTER DATABASE LOCAL UNDO ON语句并重新启动数据库,将CDB更改为本地撤消模式

当CDB处于本地撤消模式时,每个容器在打开它的每个实例中都有自己的撤消表空间。Oracle数据库会在CDB中没有容器的任何容器中自动创建一个撤消表空间。如果将没有撤消表空间的PDB克隆,重定位或插入配置为使用本地撤消模式的CDB,则Oracle数据库在首次打开PDB时会自动为其创建撤消表空间。

当CDB从共享撤消模式更改为本地撤消模式时,Oracle数据库会自动创建所需的撤消表空间。

  1. 如果CDB实例已打开,则将其关闭。
  2. OPEN UPGRADE模式下启动CDB实例例如:
    STARTUP UPGRADE
  3. 在SQL * Plus中,确保当前容器是CDB根目录。例如,输入以下内容:
  4. SHOW CON_NAME
    
    CON_NAME
    ------------------------------
    CDB$ROOT
  5. 查询CDB当前的撤销模式:
    SELECT PROPERTY_NAME, PROPERTY_VALUE 
    FROM   DATABASE_PROPERTIES 
    WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';
  6. 要启用本地撤消,请发出以下SQL语句:
    ALTER DATABASE LOCAL UNDO ON;
  7. 关闭并重新启动CDB实例。
  8. 可选:在PDB种子中手动创建撤消表空间。
    当Oracle数据库以本地撤消模式在PDB种子中自动创建撤消表空间时,您可能希望通过手动创建撤消表空间来控制撤消表空间的大小和配置。为了确保从PDB种子创建的PDB使用手动创建的撤消表空间而不是自动创建的撤消表空间,必须将UNDO_TABLESPACE初始化参数设置为手动创建的撤消表空间,或者删除自动创建的撤消表空间。
    1. 在SQL * Plus中,确保当前容器是根。
    2. 将PDB种子置于开放读/写模式:
      ALTER PLUGGABLE DATABASE PDB$SEED OPEN READ WRITE FORCE;
    3. 将容器切换到PDB种子:
      ALTER SESSION SET CONTAINER=PDB$SEED;
    4. 在PDB种子中创建一个撤消表空间。例如:
      CREATE UNDO TABLESPACE seedundots1
         DATAFILE 'seedundotbs_1a.dbf'
         SIZE 10M AUTOEXTEND ON
         RETENTION GUARANTEE;
    5. 将容器切换到根目录:
      ALTER SESSION SET CONTAINER=CDB$ROOT;
    6. 将PDB种子置于开放只读模式:
      ALTER PLUGGABLE DATABASE PDB$SEED OPEN READ ONLY FORCE;
本地撤销模式下测试
本地模式下,当前undo表空间不能被删除
测试数据
select tablespace_name,con_id from cdb_tablespaces;
在PDB中查询可以看到当前回滚段

关于共享撤消模式

共享撤消模式意味着单实例CDB仅存在一个活动的撤消表空间。对于Oracle RAC CDB,每个实例都有一个活动的撤消表空间。

当CDB处于共享撤消模式时,以下条件适用:

  • 只有具有适当特权且当前容器为CDB根目录的普通用户才能创建撤消表空间。
  • 当当前容器不是CDB根目录时,创建撤消表空间的尝试将失败并返回错误。
  • 当前容器为CDB根目录时,撤消表空间在静态数据字典视图和动态性能(V $)视图中可见。当当前容器是PDB,应用程序根目录或应用程序PDB时,撤消表空间仅在动态性能视图中可见。

注意:

  • 当您更改CDB的撤消模式时,新的撤消模式将在更改后首次打开容器时应用于单个容器。
  • 当您更改CDB的撤消模式时,CDB中的容器无法闪回到更改之前的时间或SCN。

配置CDB使用共享撤消模式

要将CDB更改为使用共享撤消模式,请使用一条ALTER DATABASE LOCAL UNDO OFF语句。

  1. 如果CDB实例已打开,则将其关闭。
  2. OPEN UPGRADE模式下启动CDB实例例如:
    STARTUP UPGRADE
  3. 在SQL * Plus中,确保当前容器是CDB根目录。例如,输入以下内容:
    SHOW CON_NAME
    
    CON_NAME
    ------------------------------
    CDB$ROOT
    
  4. (可选)查询CDB的当前撤消模式:
    SELECT PROPERTY_NAME, PROPERTY_VALUE 
    FROM   DATABASE_PROPERTIES 
    WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';
  5. 要关闭本地撤消,请发出以下SQL语句:
    ALTER DATABASE LOCAL UNDO OFF;
  6. 关闭并重新启动CDB实例。
在共享撤消模式下,CDB会忽略在本地撤消模式下创建的任何本地撤消表空间。Oracle建议您删除未使用的本地撤消表空间。

共享撤销模式下测试
关闭本地撤销
手动删掉PDB中的undo表空间


插入测试数据可以看到已经使用的是CDB的undo段了






posted @   悠游~~~  阅读(463)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示