创建 PDB
-
使用 dbca 创建 PDB
dbca 图形化方式就不讲了,这里主要讲 SQLPLUS 命令行创建 PDB 的方法
-
使用 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 数据文件的目录.由于是从 PDBSEED进行的克隆,所以需要指定一个FILE_NAME_CONVERT参数,将PDBSEED 的数据文件目录进行转换.
例如这里我们 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.
-
其他的 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;
-
从非 CDB 插入 CDB
SQL> startup mount ORACLE instance started. Total System Global Area 2622255104 bytes Fixed Size 2685024 bytes Variable Size 1644169120 bytes Database Buffers 956301312 bytes Redo Buffers 19099648 bytes Database mounted. SQL> alter database open read only; Database altered. SQL> exec dbms_pdb.describe('/tmp/rptqa12c.xml'); PL/SQL procedure successfully completed.
删除 PDB
删除 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 为默认选项。
拔出和插入 PDB
拔出 PDB
当 PDB 被拔出(unplugged)后,它在物理存储上是一个独立的文件集合,但从数据库实例的角度看,它处于一种特殊的状态。它不再与源 CDB(Container Database)实例有活动的关联,比如不再参与事务处理、用户连接等操作。因此其仍然可以,而且应该对其进行备份。
- 关闭 PDB
SQL> alter pluggable database testpdb4 close immediate;
Pluggable database altered.
- 拔出 PDB
拔出 PDB 的时候指定 xml 位置,xml 中记录了 PDB 的信息,例如数据文件目录,DBID,PDB 参数等等
SQL> alter pluggable database testpdb4 unplug into '/home/oracle/testpdb4.xml';
被拔出的 PDB 只能被删除,不能做其它操作,例如 mount,打开等.
- 删除 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
插入 PDB
- 插入 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/中。
- 打开 PDB
SQL> alter pluggable database PDBC open;
- 查看插入 PDB 是否有报错
SQL> select name,cause,type,message,status from PDB_PLUG_IN_VIOLATIONs order by name;
NAME CAUSE TYPE MESSAGE STATUS
PDB$SEED SQL Patch ERROR '19.3.0.0.0 Release_Update 1904101227' is installed in the CDB but no release updates are installed in the PDB RESOLVED
PDBC Parameter WARNING CDB parameter processes mismatch: Previous 200 Current 320 PENDING
实战:Oracle plug & unplug1
实战:Oracle plug & unplug
-- close PDB SQL> alter pluggable database all close; Pluggable database altered. SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBA MOUNTED 4 PDBC MOUNTED 5 PDBB MOUNTED -- unplug PDBC SQL> alter pluggable database PDBC unplug into '/tmp/pdbc.xml'; Pluggable database altered. SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBA MOUNTED 4 PDBC MOUNTED 5 PDBB MOUNTED SQL> SELECT PDB_NAME, STATUS FROM DBA_PDBS; PDB_NAME STATUS PDBA NORMAL PDB$SEED NORMAL PDBC UNPLUGGED PDBB NORMAL -- 不删除PDBC,直接插入会报错 SQL> create pluggable database PDBC using '/tmp/pdbc.xml' nocopy; create pluggable database PDBC using '/tmp/pdbc.xml' nocopy * ERROR at line 1: ORA-65012: Pluggable database PDBC already exists. SQL> drop pluggable database PDBC; Pluggable database dropped. -- 也可使用参数including datafiles SQL> drop pluggable database PDBC including datafiles; SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED 2 PDB$SEED READ ONLY NO 3 PDBA MOUNTED 5 PDBB MOUNTED SQL> create pluggable database PDBC using '/tmp/pdbc.xml' nocopy; Pluggable database created. SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED 2 PDB$SEED READ ONLY NO 3 PDBA MOUNTED 5 PDBB MOUNTED 6 PDBC MOUNTED SQL> SELECT PDB_NAME, STATUS FROM DBA_PDBS; PDB_NAME STATUS PDBA NORMAL PDB$SEED NORMAL PDBB NORMAL PDBC NEW
↩
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于