1. 程式人生 > >oracle 18c 18.3 學習之一 cdb pdb介紹

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也一起關閉了。