Oracle 12c中,增加了可插接數據庫的概念,即PDB,允許一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)。
CDB全稱為Container Database,中文翻譯為數據庫容器,PDB全稱為Pluggable Database,即可插拔數據庫。
在ORACLE 12C之前,實例與數據庫是一對一或多對一關系(RAC):即一個實例只能與一個數據庫相關聯,數據庫可以被多個實例所加載。
而實例與數據庫不可能是一對多的關系。當進入ORACLE 12C后,實例與數據庫可以是一對多的關系。
下面是官方文檔關於CDB與PDB的關系圖。
1 Container Database (CDB) 對於CDB,啟動和關閉與之前傳統的方式一樣,具體語法如下: STARTUP[NOMOUNT | MOUNT | RESTRICT | UPGRADE | FORCE | READ ONLY] SHUTDOWN[IMMEDIATE | ABORT] 要注意,在12c數據庫創建完成后,默認情況下使用sqlplus / as sysdba 登錄連接的是CDB。 [oracle@Ora12c~]$ sqlplus / as sysdba SQL*Plus:Release 12.1.0.1.0 Production on Thu Apr 24 17:50:34 2014 Copyright(c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL>show con_name CON_NAME ------------------------------ CDB$ROOT SQL> SQL>select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE ---------- ------------------------------------------ ------------------------------ ---------- 2 4088301206 F7C1E3C96BBF0585E0430A01A8C05459PDB$SEED READ ONLY 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787 PDBCNDBA READ WRITE 我們現在連接的是CDB,即root container。 我們關閉CDB: SQL>shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. 我們關閉CDB之前PDB 是沒有關閉的,所以這個操作也會把PDB 關閉掉。 SQL>startup ORACLE instance started. Total System Global Area 1269366784 bytes Fixed Size 2287912 bytes Variable Size 788530904 bytes Database Buffers 469762048 bytes Redo Buffers 8785920 bytes Database mounted. Database opened. SQL> select con_id, dbid, guid, name , open_modefrom v$pdbs; CON_ID DBID GUID NAME OPEN_MODE ---------- ------------------------------------------ ------------------------------ ---------- 2 4088301206F7C1E3C96BBF0585E0430A01A8C05459 PDB$SEED READ ONLY 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787 PDBCNDBA MOUNTED 注意這里的PDB,在CDB 啟動之,PDB 是自動啟動到mount狀態,而不是OPEN。 所以我們還需要手工去open它,當然,也可以通過在CDB中配置觸發器來自動open。 2 Pluggable Database (PDB) PDB 的操作可以通過SQL*PLUS 來操作,也可以通過ALTER PLUGGABLE DATABASE 命令操作。 2.1 使用SQL*Plus 命令 因為默認連接的是CDB,所以必須先指定PDB才可以通過sqlplus來啟動和關閉PDB, 具體語法和普通實例一樣: STARTUP FORCE; STARTUP OPEN READ WRITE [RESTRICT]; STARTUP OPEN READ ONLY [RESTRICT]; STARTUP UPGRADE; SHUTDOWN[IMMEDIATE]; SQL>show con_name CON_NAME ------------------------------ CDB$ROOT SQL>select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE -------------------- -------------------------------- --------------- ---------- 2 4088301206F7C1E3C96BBF0585E0430A01A8C05459 PDB$SEED READ ONLY 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787 PDBCNDBA MOUNTED 注意這里是mount,表示PDB 是關閉的。 --指定PDB 數據庫: SQL>alter session set container=pdbcndba; Session altered. SQL>startup Pluggable Database opened. SQL>select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE -------------------- -------------------------------- --------------- ---------- 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787 PDBCNDBA READ WRITE SQL> 啟動成功。 當我們切換到PDB之后,就看不到seed PDB的信息了。 2.2 使用ALTER PLUGGABLE DATABASE命令 如果在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中,可以使用如下語法: 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]; <pdd-name-clause>表示的是多個PDB,如果有多個,用逗號分開。 也可以使用ALL或者ALL EXCEPT關鍵字來替代。 ALL:表示所有的PDBS。 ALL EXCEPT 表示需要排除的PDBS。 如: ALTER PLUGGABLE DATABASE pdb1, pdb2 OPEN READ ONLY FORCE; ALTER PLUGGABLE DATABASE pdb1, pdb2 CLOSE IMMEDIATE; ALTER PLUGGABLE DATABASE ALL OPEN; ALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE; ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 OPEN; ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 CLOSE IMMEDIATE; 示例: SQL>alter session set container=CDB$ROOT; Session altered. SQL>select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE -------------------- -------------------------------- --------------- ---------- 2 4088301206F7C1E3C96BBF0585E0430A01A8C05459 PDB$SEED READ ONLY 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787 PDBCNDBA READ WRITE SQL>ALTER PLUGGABLE DATABASE ALL CLOSE ; Pluggable database altered. SQL>select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE -------------------- -------------------------------- --------------- ---------- 2 4088301206F7C1E3C96BBF0585E0430A01A8C05459 PDB$SEED READ ONLY 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787PDBCNDBA MOUNTED SQL>alter session set container=pdbcndba; Session altered. SQL>ALTER PLUGGABLE DATABASE OPEN; Pluggable database altered. SQL> select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE -------------------- -------------------------------- --------------- ---------- 3 426143573 F7C209EB1DFC0854E0430A01A8C0B787PDBCNDBA READ WRITE 3 設置Pluggable Database (PDB) 的自動startup 默認情況下,在CDB 啟動的時候,all 的PDB 都是mount狀態,也沒有默認的機制,在CDB啟動時自動啟動PDB。 但這里可以通過觸發器來實現PDB的自動open: CREATE OR REPLACE TRIGGER open_pdbs AFTER STARTUP ON DATABASE BEGIN EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN'; END open_pdbs; / 示例: SQL>show con_name CON_NAME ------------------------------ PDBCNDBA SQL>alter session set container=CDB$ROOT; Session altered. SQL>CREATE OR REPLACE TRIGGER open_pdbs 2 AFTER STARTUP ON DATABASE 3 BEGIN 4 EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN'; 5 END open_pdbs; 6 / Triggercreated.