在12.2版本后您可以将CDB配置为在每个容器中使用本地撤消(默认),也可以对整个CDB使用共享撤消。
要确定当前的CDB撤消模式,请在CDB根目录中运行以下查询:
SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';
如果查询返回TRUE
了PROPERTY_VALUE
,那么,是本地撤销模式。否则,CDB处于共享撤消模式。
处于本地共享撤销模式下的时候我们每一个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数据库会自动创建所需的撤消表空间。
本地撤销模式下测试
本地模式下,当前undo表空间不能被删除测试数据select tablespace_name,con_id from cdb_tablespaces;在PDB中查询可以看到当前回滚段
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
语句。
在共享撤消模式下,CDB会忽略在本地撤消模式下创建的任何本地撤消表空间。Oracle建议您删除未使用的本地撤消表空间。
共享撤销模式下测试
关闭本地撤销
手动删掉PDB中的undo表空间
插入测试数据可以看到已经使用的是CDB的undo段了