要使用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