要使用CDB环境,我们首先要创建一个CDB,其实创建起来是非常简单的,和non-CDB差不多,总的来说有两种方式:(1)使用DBCA的方式,这也是Oracle强烈推荐的一种方式 (2)使用SQLPLUS来创建。
在一个CDB中,大部分用户数据是放在PDB中的,只有非常少的数据放在root容器中,一个CDB最多包含253个PDB,并且seed也是算在内的。对于每个容器(root seed pdbs)都有单独的数据文件,但对于一个单实例的CDB,redolog只有一份,RAC环境下每个实例一份,所有的数据文件和redolog都必许放在共享存储上。一个CDB中只有一个参数文件,默认是spfile,在root中设置的参数会被自动继承到pdb中,涉及到参数文件内容的修改,可以使用传统alter system …..,但此时的容器必须是root,如果修改某个pdb的参数,则可以使用alter system set …=xxx container=current/all scope=xxxx;对于单个pdb的参数修改并没有记录到spfile中,而是记录到了pdb_spfile$的表中了:
SQL> select con_id,dbid,name from v$pdbs;
CON_ID DBID NAME
---------- ---------- -------------
2 4064981781 PDB$SEED
3 1752457863 NEWPDB1
4 1337772140 NEWPDB2
SQL> selectDB_UNIQ_NAME,PDB_UID,SID,NAME,VALUE$ from pdb_spfile$;
DB_UNIQ_NA PDB_UID SID NAME VALUE$
---------- ---------- ----------------------- ----------
newcdb 1752457863 * open_cursors 150
对于CDB中的表空间,每个容器都有自己的表空间,但redolog和controlfile只能有一个,
例如下面CDB名为newcdb,包含两个PDB为newpdb1 newpdb2,查看相关文件就可以验证这些
,我们可以为root和pdb指定单独的默认表空间。活动的UNDO表空间在整个CDB中只能有一个
SQL> select FILE#,TS#,NAME,CON_ID fromv$datafile order by 4;
FILE# TS# NAME CON_ID
---------- ---------- ------------------------------------------------------------
6 4/u01/oracle/oradata/newcdb/users01.dbf 1
3 1/u01/oracle/oradata/newcdb/sysaux01.dbf 1
4 2/u01/oracle/oradata/newcdb/undotbs01.dbf 1
1 0/u01/oracle/oradata/newcdb/system01.dbf 1
5 0/u01/oracle/oradata/newcdb/pdbseed/system01.dbf 2
7 1/u01/oracle/oradata/newcdb/pdbseed/sysaux01.dbf 2
8 0/u01/oracle/oradata/newcdb/newpdb1/system01.dbf 3
9 1/u01/oracle/oradata/newcdb/newpdb1/sysaux01.dbf 3
10 3/u01/oracle/oradata/newcdb/newpdb1/newpdb1_users01 3
.dbf
FILE# TS# NAME CON_ID
---------- ------------------------------------------------------------ ----------
11 0/u01/oracle/oradata/newcdb/newpdb2/system01.dbf 4
12 1/u01/oracle/oradata/newcdb/newpdb2/sysaux01.dbf 4
13 3/u01/oracle/oradata/newcdb/newpdb2/newpdb2_users01 4
.dbf
SQL> select group#,member,con_id from v$logfile;
GROUP# MEMBER CON_ID
------------------------------------------------------------ ----------
3 /u01/oracle/oradata/newcdb/redo03.log 0
2 /u01/oracle/oradata/newcdb/redo02.log 0
1 /u01/oracle/oradata/newcdb/redo01.log 0
SQL> select status,name,con_id fromv$controlfile;
STATUS NAME CON_ID
----------------------------------------------------------------------- ----------
/u01/oracle/oradata/newcdb/control01.ctl 0
/u01/oracle/fast_recovery_area/newcdb/control02.ct 0
L
对于内部的pdb里的数据库服务,在RAC架构下可以使用srvctl来添加,如果是单实例架构可以使用DBMS_SERVICE来修改,如下:
BEGIN
DBMS_SERVICE.DELETE_SERVICE(
service_name => 'newpdb1_test');
END;
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'pdb1test',
network_name => 'pdb1test');
END;
BEGIN
DBMS_SERVICE.START_SERVICE(service_name => 'pdb1test');
END;
SQL> select service_id,name,network_namefrom ALL_SERVICES;
SERVICE_ID NAME NETWORK_NAME
---------- ----------------------------------------
6 newpdb1 newpdb1
1 pdb1test pdb1test
通过lsnrctlstatus命令可以看到,pdb1test服务已经启动
Service"pdb1test" has 1 instance(s).
Instance "newcdb", status READY,has 1 handler(s) for this service...
The commandcompleted successfully
在CDB中,root和pdbs共享一个实例,我们可以启动和关闭整个CDB,但对于单个PDB不能进行这样的操作,当CDB打开后,可以对单独PDB使用ALTER PLUGGABLE DATABASE xxxx命令来改变PDB的状态。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------------------------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 NEWPDB1 READ WRITE NO
4 NEWPDB2 READ WRITE NO
SQL> alter pluggable database newpdb1 close;
Pluggable databasealtered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------------------------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 NEWPDB1 MOUNTED
4 NEWPDB2 READ WRITE NO
SQL> alter pluggable database newpdb1 open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------------------------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 NEWPDB1 READ WRITE NO
4 NEWPDB2 READ WRITE NO