os: centos 7.4
db: oracle 18c(18.3)
最近一直在玩 postgresql,补一下 oracle 的知识。
cdb,pdb 是 oracle 12c引入的概念,一直觉得oracle的单库多用户架构简单高效,可能是oracle自己觉得不好,实现了多库多用户。但同时又不象其他数据库的天生就是多库多用户,自己感觉引入了一定的复杂度。
CDB:指的就是容器。
PDB:指的就是可插拔的意思。
CDB的组成部分。
1、ROOT:root,又名CDB$ROOT,用来存储Oracle提供的 metadata和 common user 的。
2、SEED:seed,又名PDB$SEED,是用来创建新的PDB的模版。但是,你不能在seed 里添加或者修改对象,一个CDB只能有一个SEED,状态为 READ ONLY。
3、PDB:PDB展现给用户和应用的形象就像是一个没有CDB的普通数据库一样。例 如,一个PDB可以包括支持一个特定应用程序所需的所有数据和代码。PDB 完全向后兼容Oracle12c之前版本的所有数据库。
以上的每个组成部分都被称为容器(container),ROOT、SEED、PDB都是容器。而这些容器在CDB中都有他们自己唯一的容器ID和名称。我们可以很轻松的向CDB中插入一个PDB或者从CDB中拔出一个PDB。
使用 sqlplus 默认连接的就是cdb
$ sqlplus / as sysdba;
SQL> show con_id
CON_ID
------------------------------
1
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
通过 sqlplus 连接 cdb后,可以操作pdb
$ sqlplus / as sysdba;
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBPEIYB MOUNTED
SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;
CON_ID DBID GUID NAME OPEN_MODE
---------- ---------- -------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ----------
2 2569652277 7B3DCA17AEF945C6E0536538A8C0CD92 PDB$SEED READ ONLY
3 1382952877 7B3DF131086D5813E0536538A8C08359 PDBPEIYB MOUNTED
在CDB 启动之后,所有的 PDB 是自动启动到mount状态,而不是 open。
所以我们还需要手工去open它,当然,也可以通过在CDB中配置触发器来自动open。
create or replace trigger open_all_pdbs
after startup on database
begin
execute immediate 'alter pluggable database all open';
end;
不过最好不要用触发器
$ sqlplus / as sysdba;
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBPEIYB MOUNTED
SQL> alter pluggable database pdbpeiyb open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBPEIYB READ WRITE NO
SQL>
使用 alter session set container=pdbpeiyb 进行切换到指定pdb。
如果再次切换到cdb,可以执行 alter session set container=CDB$ROOT;
$ sqlplus / as sysdba;
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBPEIYB READ WRITE NO
SQL> alter session set container=pdbpeiyb;
Session altered.
SQL> show con_id
CON_ID
------------------------------
3
SQL> show con_name
CON_NAME
------------------------------
PDBPEIYB
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDBPEIYB READ WRITE NO
切换后,其余的pdb就看不到了,然后所有的操作就是在指定的pdb进行了。
切换到指定的pdb后,可以修改该pdb的一些状态。
ALTER PLUGGABLE DATABASE OPEN READ WRITE [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE OPEN READ ONLY [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE OPEN UPGRADE [RESTRICTED];
ALTER PLUGGABLE DATABASE CLOSE [IMMEDIATE];
如果在cdb中操作pdb,就需要在 ALTER PLUGGABLE DATABASE 加pdb的名字。
如果要同时操作多个pdb,就用逗号隔开。比如 = pdb1, pdb2, pdb3
如果要操作所有的pdb,就用 all 关键字。比如 = all
如果要排除某个pdb,就用 except 关键字。比如 = all except pdb3
这个应该很好理解。
ALTER PLUGGABLE DATABASE OPEN READ WRITE [RESTRICTED][FORCE];
ALTER PLUGGABLE DATABASE OPEN READ ONLY [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE OPEN UPGRADE [RESTRICTED];
ALTER PLUGGABLE DATABASE CLOSE [IMMEDIATE];
关闭cdb时,毫无疑问,所有的pdb也一起关闭了。