
3.2 管理CDB
管理CDB和管理Non-CDB相似,但也有一些不同的地方,主要体现在管理任务上,有些是应用到整个CDB上,而有些只能应用到PDB上。
3.2.1 当前容器
CDB中的每个容器的数据字典都是独立的。当前容器可以是CDB root、应用程序root、PDB或应用程序PDB。每个会话同时只能连接一个容器,但会话可以从一个容器切换到另一个容器。
如果当前容器是CDB root,那么只能用公共用户来连接;如果当前容器是PDB,那么可以指定公共用户和本地用户来连接;如果SQL语句中包含CONTAINER=ALL,那么当前容器必须是CDB root或应用程序root。
每个容器都有唯一的CON_ID和CON_NAME,可以用以下两种方式来查看当前容器的CON_ID和CON_NAME。
通过SYS_CONTEXT命令来查看,代码如下:

通过show命令来查看,代码如下:

使用alter session命令可以切换当前容器,代码如下:

使用SQLPLUS或CONNECT命令可以连接指定的PDB,这种方法需要先配置好tnsnames.ora文件,代码如下:


3.2.2 CDB中的管理任务
只有公共用户才能执行CDB中的管理任务,当然,公共用户也需要具有相应的权限。如表3-2所示是一些常见的CDB中的管理任务及其说明。
表3-2 常见的CDB中的管理任务及其说明

续表

3.2.3 修改CDB参数
PDB中的部分参数值继承自CDB中的参数值,也可以单独修改。PDB中每个初始化参数都有一个继承属性(TRUE或FALSE)。当PDB的参数值继承自CDB root的参数值时,继承属性为TRUE;否则为FALSE。如果为TRUE,那么PDB会继承CDB中该参数的值,即如果修改了CDB中该参数的值,那么PDB中该参数的值也会被修改;反之,若为FALSE,则修改CBD中该参数的值,不会修改PDB中该参数的值。
PDB中的部分参数的继承属性必须为TRUE。对于其他参数,当当前容器是PDB时,可以通过执行ALTER SYSTEM SET语句将继承属性修改为FALSE。如果想把该参数的继承属性修改回来,可以通过执行ALTER SYSTEM RESET语句来修改。
如果V$SYSTEM_PARAMETER视图中参数的ISPDB_MODIFIABLE列是TRUE,那么该参数的继承属性是FALSE。在Oracle 18c中,这样的参数一共有210个。当当前容器为CDB root时,ALTER SYSTEM SET语句中的CONTAINER参数将决定修改哪个PDB的参数值。
CONTAINER = { CURRENT | ALL },CONTAINER参数有以下两个值。
CURRENT:只修改当前容器的参数值,如果当前容器是root,那么也会修改继承属性是TRUE的参数值。
ALL:适用于CDB中的所有容器,包括root和所有PDB。
例如,要修改所有容器的参数open_ cursors,先查看该参数的继承属性是否为FALSE,代码如下:

再查看当前参数值,代码如下:

如果在PDB中修改参数值,那么继承属性就会被修改为FALSE,该参数值将不会再受CDB的影响。
修改当前root的参数open_ cursors,看PDB的参数是否也会被修改,步骤如下。
(1)修改CDB,代码如下:

(2)查看PDB,可以看到PDB的参数没有受到影响,代码如下:


3.2.4 修改PDB参数
以公共用户身份连接到CDB root,可以通过ALTER PLUGGALE DATABASE语句来修改PDB的相关配置,也可以直接连接到PDB中,通过ALTER DATABASE语句来修改相关配置。
1.使用ALTER DATABASE命令修改CDB的参数
使用ALTER DATABASE语句可以修改整个CDB的参数,包括root的参数和其中所有的PDB的参数,但并不是所有参数都支持在CDB级别中修改,部分参数只能修改root,而不会修改PDB。
(1)修改CDB。当公共用户连接的是CDB root时,通过ALTER DATABASE命令执行如下语句会修改整个CDB:

(2)只修改CDB root。当公共用户连接的是CDB root时,通过ALTER DATABASE命令执行如下语句只修改CDB root:

下面的语句会修改CDB root并提供给PDB一个默认值:

(3)修改一个或多个PDB。当公共用户连接到CDB root时,可以通过ALTER PLUGGABLE DATABASE语句修改PDB的打开状态(MOUNT/READ ONLY/READ WRITE等),以及保存/忽略PDB的打开状态。
使用ALTER DATABASE命令添加、修改、删除数据文件的操作,只针对当前容器,不针对所有容器。而使用ALTER DATABASE命令备份控制文件、启动数据库、修改redo日志会对整个CDB产生影响,包括CDB root和所有PDB。
2.使用ALTER DATABASE命令修改CDB的UNDO模式
默认情况下是本地UNDO模式,每个PDB都有自己的UNDO表空间。在Oracle RAC中,每个节点中的每个PDB都有独立的UNDO表空间。本地 UNDO模式使每个PDB更加独立,提高了操作效率,例如插入PDB或PDB基于时间点的恢复。另外,有些操作必须在本地 UNDO模式下执行,例如迁移PDB和复制PDB。
(1)查看当前UNDO 模式,代码如下:

TRUE代表本地 UNDO模式,FLASE代表共享UNDO模式。
(2)共享UNDO模式转换为本地 UNDO模式的步骤如下。
关闭CDB,代码如下:

以UPGRADE方式启动CDB,代码如下:

确认当前容器是CDB root ,代码如下:

启用本地UNDO,代码如下:

重启CDB,正常打开,代码如下:

(3)本地 UNDO模式转换为共享UNDO 模式的步骤如下。
关闭CDB,代码如下:

以UPGRADE方式启动CDB,代码如下:

确认当前容器是CDB root ,代码如下:

禁用本地UNDO,代码如下:

重启CDB,正常打开,代码如下:

3.2.5 CDB和PDB参数保存位置说明
CDB中的参数文件和Oracle 12c版本之前的参数文件一样,使用SPFILE,而PDB的参数有一些变化,它并没有具体的参数文件。在前面的章节中提到PDB会继承CDB的参数,也可以修改PDB的参数,使其与CDB的参数不同,这些不同的PDB参数会保存在 CDB 的 PDB_SPFILE$字典表中,并以con_id区分。当拔出PDB 时,PDB参数会被写入PDB的XML文件中;当执行drop pluggable database命令后,PDB信息和PDB_SPFILE$记录会被清除。


在3.2.3小节中,我们修改了PDB的open_cursors参数,这里验证一下:
