一.创建pdb
命令行的方式可以使用PDB$SEED这个种子容器生成该容器的副本,从而快速创建新的PDB
1.如果使用的是OMF,例如是集群环境,直接使用create pluggable database命令创建PDB,如下:
create pluggable database pdb1 admin user cz identified by 123456;
这里由于使用的是OMF,可以不指定新建的PDB数据文件路径,则会将数据文件存放到DB_CREATE_FILE_DEST下的GUID目录下(GUID可以在v$pdbs中查询到).
还可以指定文件的创建路径,例如:
create pluggable database pdb1 admin user pdb1admin identified by 123456 create_file_dest='+PDBDATA';
2.如果使用的是非OMF环境,则需要指定PDB数据文件的目录.由于是从PDB$SEED进行的克隆,所以需要指定一个FILE_NAME_CONVERT参数,将PDB$SEED的数据文件目录进行转换.
我的PDBSEED文件目录为
[oracle@dg2 pdbseed]$ pwd
/u01/app/oracle/oradata/ORCL/pdbseed
[oracle@dg2 pdbseed]$ ll
total 712148
-rw-r-----. 1 oracle oinstall 335552512 May 15 03:57 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 283123712 May 15 03:57 system01.dbf
-rw-r-----. 1 oracle oinstall 37756928 May 15 03:50 temp012024-05-15_03-41-23-314-AM.dbf
-rw-r-----. 1 oracle oinstall 104865792 May 15 03:57 undotbs01.dbf
则创建新的PDB语法如下:
create pluggable database hrpdb admin user test identified by 123456 file_name_convert=('/u01/app/oracle/oradata/ORCL/pdbseed','/u01/app/oracle/oradata/ORCL/hrpdb');
这样创建的PDB默认只创建了SYSTEM,SYSAUX,TEMP,UNDO表空间(19c环境)
还可以进行简写,如下:
create pluggable database pdb2 admin user lihua identified by 123456 file_name_convert=('pdbseed','pdb2');
SQL> create pluggable database pdb2 admin user lihua identified by 123456 file_name_convert=('pdbseed','pdb2');
Pluggable database created.
pdb2已创建
[oracle@dg2 pdb2]$ ll
total 706640
-rw-r----- 1 oracle oinstall 335552512 May 16 11:18 sysaux01.dbf
-rw-r----- 1 oracle oinstall 283123712 May 16 11:18 system01.dbf
-rw-r----- 1 oracle oinstall 37756928 May 16 11:17 temp012024-05-15_03-41-23-314-AM.dbf
-rw-r----- 1 oracle oinstall 104865792 May 16 11:18 undotbs01.dbf
[oracle@dg2 pdb2]$
上面的意思,默认从pdb$seed容器进行拷贝,并且将pdb$seed的数据文件路径中的pdbseed都替换为pdb2.
查看刚生成的pdb2 状态为mount
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB MOUNTED
4 HRPDB READ WRITE NO
5 PDB2 MOUNTED
6 PDB1 READ WRITE NO
需要手工将PDB进行open,之后pdb才会创建刚刚的默认表空间和数据文件
alter pluggable database pdb2 open;
再次查看状态,已经是打开状态
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB MOUNTED
4 HRPDB READ WRITE NO
5 PDB2 READ WRITE NO
6 PDB1 READ WRITE NO
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子句,例如克隆hrpdb来创建pdb3
create pluggable database pdb3 from hrpdb file_name_convert=('/u01/app/oracle/oradata/ORCL/hrpdb','/u01/app/oracle/oradata/ORCL/pdb3');
注意这里的文件名称转换是将hrpdb转换成pdb3
二.删除PDB
删除PDB之前需要将PDB先关闭,使用drop pluggable database命令,如下:
SQL> alter pluggable database pdb3 close;
Pluggable database altered.
SQL> drop pluggable database pdb3 including datafiles;
Pluggable database dropped.
如果是删除PDB一般使用including datafiles则会将数据文件一起删除.
还可以使用keep datafiles为保留数据文件,默认如果不添加任何参数即为keep datafiles,但是注意keep datafiles则必须先将PDB拔出,所以一般是用在拔出和插入PDB场景下.
三.拔出和插入PDB
1.拔出PDB
1)关闭PDB
SQL> alter pluggable database pdb2 close immediate;
Pluggable database altered.
2)拔出PDB
拔出PDB的时候指定xml位置,xml中记录了PDB的信息,例如数据文件目录,DBID,PDB参数等等
SQL> alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml';
被拔出的PDB只能被删除,不能做其它操作,例如mount,打开等.
3)删除PDB
下面删除PDB,如果不加任何参数,默认为keep datafiles保留数据文件.
SQL> drop pluggable database pdb2;
Pluggable database dropped.
2.插入PDB
1)插入PDB
使用create pluggable database指定xml位置来插入PDB
SQL> create pluggable database testpdb4 using '/home/oracle/pdb2.xml' nocopy;
Pluggable database created.
四、连接pdb并创建用户
1.打开pdb1
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
2.切入到pdb1
SQL> alter session set container=pdb1;
Session altered.
3、创建用户并授予权限
create user test01 identified by 123456;
grant resource,connect,dba to test01;
grant create session to test01;
grant create table to test01;
grant unlimited tablespace to test01;
grant select any table to test01;
4.创建表空间并指定用户默认表空间
create tablespace test01 logging datafile '/u01/app/oracle/oradata/ORCL/hrpdb/test01.dbf' size 100m ;
alter user test01 default tablespace test01;
5.查询测试用户默认表空间
SQL> select default_tablespace from dba_users where username='TEST01';
DEFAULT_TABLESPACE
------------------------------
TEST01
6.修改监听文件tnsnames.ora
加入监听对象
pdb1=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.140)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
7.启动监听
8.使用sqlplus直接连接指定pdb
[oracle@dg2 admin]$ sqlplus test01/123456@pdb1
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 16 12:21:45 2024
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Thu May 16 2024 10:40:34 -04:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
9.查看连接的pdb名称和用户
SQL> show con_name;
CON_NAME
------------------------------
PDB1
SQL> show user;
USER is "TEST01"
10、同理,设置其他pdb,比如我设置的hrpdb
create user test02 identified by 123456;
grant resource,connect,dba to test02;
grant create session to test02;
grant create table to test02;
grant unlimited tablespace to test02;
grant select any table to test02;
create tablespace test02 logging datafile '/u01/app/oracle/oradata/ORCL/hrpdb/test02.dbf' size 100m ;
alter user test02 default tablespace test02;
select default_tablespace from dba_users where username='TEST02';
11、修改监听文件tnsnames.ora
hrpdb=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.140)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hrpdb)
)
)
12、连接测试
打开hrpdb连接
SQL> alter pluggable database hrpdb open;
Pluggable database altered.
连接成功
[oracle@dg2 admin]$ sqlplus test02/123456@hrpdb
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 16 12:30:51 2024
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Thu May 16 2024 10:59:45 -04:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
测试被连接的pdb名称和用户名称
SQL> show con_name;
CON_NAME
------------------------------
HRPDB
SQL> show user;
USER is "TEST02"
SQL>
这样就可以同时启动多个pdb,同时连接,我这里就同时连接了pdb1和hrpdb