一.创建CDB
一般使用dbca和命令行方式来创建CDB,dbca有两种方式:
1.使用图形化dbca
2.使用dbca命令行静默方式安装
dbca -createDatabase \
-slient \
....
一大堆参数,可以参考官方文档.
还可以指定响应文件,即事先编辑好dbca的响应文件,直接使用
dbca -createDatabase -responseFile xxxxx(文件名) -slient
具体响应文件模版在$ORACLE_HOME/ass*/dbca.rp中,具体配置方法可以参考官方文档.
还可以使用sqlplus命令行方式.即使用CREATE DATABASE命令来创建,具体的CREATE DATABASE命令可以参考oracle官方文档.
建议使用DBCA图形化方式安装CDB,就和以前的创建非CDB数据库一样
二.创建PDB
1.同样,创建PDB一般也可以使用dbca和命令行方式创建
dbca图形化方式就不讲了,这里主要讲SQLPLUS命令行创建PDB的方法
2.命令行的方式可以使用PDB$SEED这个种子容器生成该容器的副本,从而快速创建新的PDB
1).如果使用的是OMF,例如是集群环境,直接使用create pluggable database命令创建PDB,如下:
create pluggable database pdb1 admin user pdb1admin identified by pdb1admin;
这里由于使用的是OMF,可以不指定新建的PDB数据文件路径,则会将数据文件存放到DB_CREATE_FILE_DEST下的GUID目录下(GUID可以在v$pdbs中查询到).
还可以指定文件的创建路径,例如:
create pluggable database pdb1 admin user pdb1admin identified by pdb1admin create_file_dest='+PDBDATA';
2).如果使用的是非OMF环境,则需要指定PDB数据文件的目录.由于是从PDB$SEED进行的克隆,所以需要指定一个FILE_NAME_CONVERT参数,将PDB$SEED的数据文件目录进行转换.
例如这里我们PDBSEED文件目录为:
[oracle@ora19c1 pdbseed]$ pwd
/u01/app/oracle/oradata/ORA19C/pdbseed
则创建新的PDB语法如下:
create pluggable database testpdb2 admin user suq identified by suq
file_name_convert=('/u01/app/oracle/oradata/ORA19C/pdbseed','/u01/app/oracle/oradata/ORA19C/testpdb2');
这样创建的PDB默认只创建了SYSTEM,SYSAUX,TEMP,UNDO表空间(19c环境)
还可以进行简写,如下:
create pluggable database testpdb4 admin user suq identified by suq file_name_convert=('pdbseed','testpdb4');
上面的意思,默认从pdb$seed容器进行拷贝,并且将pdb$seed的数据文件路径中的pdbseed都替换为testpdb4.
[oracle@ora19c1 testpdb2]$ ls -l
total 609360
-rw-r-----. 1 oracle oinstall 173023232 Jun 23 22:27 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 220209152 Jun 23 22:27 system01.dbf
-rw-r-----. 1 oracle oinstall 20979712 Jun 23 22:27 temp01.dbf
-rw-r-----. 1 oracle oinstall 230694912 Jun 23 22:27 undotbs01.dbf
还可以指定默认表空间创建:
create pluggable database testpdb3 admin user suq identified by suq
file_name_convert=('/u01/app/oracle/oradata/ORA19C/pdbseed','/u01/app/oracle/oradata/ORA19C/testpdb3')
default tablespace users
datafile '/u01/app/oracle/oradata/ORA19C/testpdb3/user01.dbf' size 10m autoextend on;
Pluggable database created.
上面创建完成之后,我们发现 在test3pdb/目录下面并没有生成user01.dbf文件,是因为刚创建完成之后pdb的状态为mount:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 BRENT READ WRITE NO
4 TESTPDB1 READ WRITE NO
5 TESTPDB2 MOUNTED
6 TESTPDB3 MOUNTED
需要手工将PDB进行open,之后pdb才会创建刚刚的默认表空间和数据文件,alter pluggable database testpdb3 open
SQL> alter pluggable database testpdb3 open;
Pluggable database altered.
3.还可以从其他的PDB(非PDB$SEED)容器进行克隆,生成新的PDB
使用此方法需要注意:
i)如果使用的是12.1版本,则源PDB必须处于只读模式.如果使用的是12.2版本,则源PDB可以处于打开状态,只要CDB处于归档模式,并且使用本地的UNDO管理(默认选项)
ii)CDB中的每一个PDB必须被唯一标识
iii)一旦克隆完毕,新PDB至少需要以读写模式打开一次,以便进行后继的操作
1)在OMF环境中的克隆
在OMF中克隆PDB非常简单,无需指定额外的子句即可.例如克隆PDB1来创建PDB5
CREATE PLUGGABLE DATABASE PDB5 FROM PDB1;
alter pluggable database pdb5 open;
2)在非OMF环境中克隆
同意在非OMF环境中克隆需要指定FILE_NAME_CONVERT子句,例如克隆TESTPDB1来创建TESTPDB5
SQL> create pluggable database testpdb5 from testpdb1
file_name_convert=('/u01/app/oracle/oradata/ORA19C/testpdb1','/u01/app/oracle/oradata/ORA19C/testpdb5');
注意这里的文件名称转换是将testpdb1转换成testpdb5;
删除PDB之前需要将PDB先关闭,使用drop pluggable database命令,如下:
SQL> alter pluggable database testpdb5 close;
Pluggable database altered.
SQL> drop pluggable database testpdb5 including datafiles;
Pluggable database dropped.
如果是删除PDB一般使用including datafiles则会将数据文件一起删除.
还可以使用keep datafiles为保留数据文件,默认如果不添加任何参数即为keep datafiles,但是注意keep datafiles则必须先将PDB拔出,所以一般是用在拔出和插入PDB场景下.
1.拔出PDB
1)关闭PDB
SQL> alter pluggable database testpdb4 close immediate;
Pluggable database altered.
2)拔出PDB
拔出PDB的时候指定xml位置,xml中记录了PDB的信息,例如数据文件目录,DBID,PDB参数等等
SQL> alter pluggable database testpdb4 unplug into '/home/oracle/testpdb4.xml';
被拔出的PDB只能被删除,不能做其它操作,例如mount,打开等.
3)删除PDB
下面删除PDB,如果不加任何参数,默认为keep datafiles保留数据文件.
SQL> drop pluggable database testpdb4;
Pluggable database dropped.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 BRENT READ WRITE NO
4 TESTPDB1 READ WRITE NO
5 TESTPDB2 READ WRITE NO
6 TESTPDB3 READ WRITE NO
2.插入PDB
1)插入PDB
使用create pluggable database指定xml位置来插入PDB
SQL> create pluggable database testpdb4 using '/home/oracle/testpdb4.xml' nocopy;
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 BRENT READ WRITE NO
4 TESTPDB1 READ WRITE NO
5 TESTPDB2 READ WRITE NO
6 TESTPDB4 MOUNTED
注意:上面的,创建pdb的时候,你可以指定不同的PDB命令,例如你unplug的PDB为testpdb4,你创建的时候名字可以是testpdb3,但是如果你使用的是同样的xml文件,则数据文件位置不会变动,只是pdb名字变化了
一般我拔出了PDB之后,使用场景是将他插入到其它的CDB中,那么我们可以将他的数据文件和生成的xml文件拷贝到另外一台CDB上,一般情况下的数据文件目录都是不一样的,那么就可以使用下面的语法:
SQL> create pluggable database PDB8 using '/u01/tmp/pdb8.xml'
SOURCE_FILE_NAME_CONVERT=('/u02/app/oracle/oradata/DG/PDB8/','/u01/tmp/PDB8/')
MOVE FILE_NAME_CONVERT=('/u01/tmp/PDB8/','/u01/app/oracle/oradata/MPCDB/PDB8/')
PATH_PREFIX='/u01/app/oracle/oradata/MPCDB/PDB8/' ;
这里xml文件中指示数据文件在/u02/app/oracle/oradata/DG/PDB8/中,
而实际上数据文件在/u01/tmp/PDB8/中,
且最终我们要将数据文件放在/u01/app/oracle/oradata/MPCDB/PDB8/中。
2)打开PDB
SQL> alter pluggable database testpdb4 open;
3)查看插入PDB是否有报错
SQL> select name,cause,type,message,status from PDB_PLUG_IN_VIOLATIONs order by name;