oracle 18c 18.3 學習之一 cdb pdb介紹
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。
cdb 檢視
使用 sqlplus 預設連線的就是cdb
$ sqlplus / as sysdba;
SQL> show con_id
CON_ID
------------------------------
1
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
pdb 檢視
通過 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
pdb 開啟
在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>
pdb 切換
使用 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後,可以修改該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 <pdd-name-clause> OPEN READ WRITE [RESTRICTED][FORCE];
ALTER PLUGGABLE DATABASE <pdd-name-clause> OPEN READ ONLY [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE <pdd-name-clause> OPEN UPGRADE [RESTRICTED];
ALTER PLUGGABLE DATABASE <pdd-name-clause> CLOSE [IMMEDIATE];
關閉cdb時,毫無疑問,所有的pdb也一起關閉了。