Oracle 12C引入了CDB與PDB的新特性,在ORACLE 12C資料庫引入的多租使用者環境(Multitenant Environment)中,允許一個數據庫容器(CDB)承載多個可插拔資料庫(PDB)。CDB全稱為Container Database,中文翻譯為資料庫容器,PDB全稱為Pluggable Database,即可插拔資料庫。在ORACLE 12C之前,例項與資料庫是一對一或多對一關係(RAC):即一個例項只能與一個數據庫相關聯,資料庫可以被多個例項所載入。而例項與資料庫不可能是一對多的關係。當進入ORACLE 12C後,例項與資料庫可以是一對多的關係。下面是官方文件關於CDB與PDB的關係圖。 clip_image002 其實大家如果對SQL SERVER比較熟悉的話,這種CDB與PDB是不是感覺和SQL SERVER的單例項多資料庫架構是一回事呢。像PDB$SEED可以看成是master、msdb等系統資料庫,PDBS可以看成使用者建立的資料庫。而可插拔的概念與SQL SERVER中的使用者資料庫的分離、附加其實就是那麼一回事。看來ORACLE也“抄襲”了一把SQL SERVER的概念,只是改頭換面的包裝了一番。 CDB元件(Components of a CDB) 一個CDB資料庫容器包含了下面一些元件: ROOT元件 ROOT又叫CDB$ROOT, 儲存著ORACLE提供的元資料和Common User,元資料的一個例子是ORACLE提供的PL/SQL包的原始碼,Common User 是指在每個容器中都存在的使用者。 SEED元件 Seed又叫PDB$SEED,這個是你建立PDBS資料庫的模板,你不能在Seed中新增或修改一個物件。一個CDB中有且只能有一個Seed. 這個感念,個人感覺非常類似SQL SERVER中的model資料庫。 PDBS CDB中可以有一個或多個PDBS,PDBS向後相容,可以像以前在資料庫中那樣操作PDBS,這裡指大多數常規操作。 這些元件中的每一個都可以被稱為一個容器。因此,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱。 1)連線到CDB資料庫 連線到CDB資料庫容器非常簡單,跟以前連線資料庫是一樣的複製程式碼 [oracle@get-orasvr02 ~]$ sqlplus / as sysdbaSQL*Plus: Release 12.1.0.1.0 Production on Sun Oct 20 23:41:36 2013Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> [oracle@get-orasvr02 ~]$ sqlplus sys/password as sysdbaSQL*Plus: Release 12.1.0.1.0 Production on Sun Oct 20 23:43:17 2013Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> 複製程式碼 2)檢視資料庫是否為CDB 複製程式碼 SQL> select name, decode(cdb, "YES", "Multitenant Option enabled", "Regular 12c Database: ") "Multitenant Option" , open_mode, con_id from v$database;NAME Multitenant Option OPEN_MODE CON_ID--------- ----------------------------- -------------------- ----------EPPS Multitenant Option enabled READ WRITE 0複製程式碼 YES表示該資料庫是CDB,如果是NO表示是NO-CDB(普通資料庫)3)檢視當前容器(Container) 3.1 複製程式碼 SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> 3.2 SQL> select sys_context("userenv", "con_name") "Container DB" from dual;Container DB ----------------------------------------------------CDB$ROOT SQL> 複製程式碼 4)檢視CDB容器中的PDBS資訊 檢視CDB中有多少個pluggable database 複製程式碼 SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;CON_ID DBID GUID NAME OPEN_MODE---------- ---------- -------------------------------- ------------------------------ ----------2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS MOUNTEDSQL> 複製程式碼 5)啟動PDB資料庫 方式1: 複製程式碼 SQL> alter pluggable database PDBEPPS open;Pluggable database altered. SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;CON_ID DBID GUID NAME OPEN_MODE---------- ---------- -------------------------------- ------------------------------ ----------2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS READ WRITE複製程式碼 方式2: 複製程式碼 SQL> alter session set container=PDBEPPS;Session altered. SQL> startup Pluggable Database opened. SQL> 複製程式碼 6)關閉PDB資料庫 SQL> alter pluggable database PDBEPPS close;Pluggable database altered. SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;CON_ID DBID GUID NAME OPEN_MODE---------- ---------- -------------------------------- ------------------------------ ----------2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS MOUNTEDSQL> 7)在容器間切換 SQL> alter session set container=PDBEPPS;Session altered. SQL> show con_name; CON_NAME ------------------------------ PDBEPPS SQL> SQL> alter session set container=CDB$ROOT;Session altered. SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL>
Oracle 12C引入了CDB與PDB的新特性,在ORACLE 12C資料庫引入的多租使用者環境(Multitenant Environment)中,允許一個數據庫容器(CDB)承載多個可插拔資料庫(PDB)。CDB全稱為Container Database,中文翻譯為資料庫容器,PDB全稱為Pluggable Database,即可插拔資料庫。在ORACLE 12C之前,例項與資料庫是一對一或多對一關係(RAC):即一個例項只能與一個數據庫相關聯,資料庫可以被多個例項所載入。而例項與資料庫不可能是一對多的關係。當進入ORACLE 12C後,例項與資料庫可以是一對多的關係。下面是官方文件關於CDB與PDB的關係圖。 clip_image002 其實大家如果對SQL SERVER比較熟悉的話,這種CDB與PDB是不是感覺和SQL SERVER的單例項多資料庫架構是一回事呢。像PDB$SEED可以看成是master、msdb等系統資料庫,PDBS可以看成使用者建立的資料庫。而可插拔的概念與SQL SERVER中的使用者資料庫的分離、附加其實就是那麼一回事。看來ORACLE也“抄襲”了一把SQL SERVER的概念,只是改頭換面的包裝了一番。 CDB元件(Components of a CDB) 一個CDB資料庫容器包含了下面一些元件: ROOT元件 ROOT又叫CDB$ROOT, 儲存著ORACLE提供的元資料和Common User,元資料的一個例子是ORACLE提供的PL/SQL包的原始碼,Common User 是指在每個容器中都存在的使用者。 SEED元件 Seed又叫PDB$SEED,這個是你建立PDBS資料庫的模板,你不能在Seed中新增或修改一個物件。一個CDB中有且只能有一個Seed. 這個感念,個人感覺非常類似SQL SERVER中的model資料庫。 PDBS CDB中可以有一個或多個PDBS,PDBS向後相容,可以像以前在資料庫中那樣操作PDBS,這裡指大多數常規操作。 這些元件中的每一個都可以被稱為一個容器。因此,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱。 1)連線到CDB資料庫 連線到CDB資料庫容器非常簡單,跟以前連線資料庫是一樣的複製程式碼 [oracle@get-orasvr02 ~]$ sqlplus / as sysdbaSQL*Plus: Release 12.1.0.1.0 Production on Sun Oct 20 23:41:36 2013Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> [oracle@get-orasvr02 ~]$ sqlplus sys/password as sysdbaSQL*Plus: Release 12.1.0.1.0 Production on Sun Oct 20 23:43:17 2013Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> 複製程式碼 2)檢視資料庫是否為CDB 複製程式碼 SQL> select name, decode(cdb, "YES", "Multitenant Option enabled", "Regular 12c Database: ") "Multitenant Option" , open_mode, con_id from v$database;NAME Multitenant Option OPEN_MODE CON_ID--------- ----------------------------- -------------------- ----------EPPS Multitenant Option enabled READ WRITE 0複製程式碼 YES表示該資料庫是CDB,如果是NO表示是NO-CDB(普通資料庫)3)檢視當前容器(Container) 3.1 複製程式碼 SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> 3.2 SQL> select sys_context("userenv", "con_name") "Container DB" from dual;Container DB ----------------------------------------------------CDB$ROOT SQL> 複製程式碼 4)檢視CDB容器中的PDBS資訊 檢視CDB中有多少個pluggable database 複製程式碼 SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;CON_ID DBID GUID NAME OPEN_MODE---------- ---------- -------------------------------- ------------------------------ ----------2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS MOUNTEDSQL> 複製程式碼 5)啟動PDB資料庫 方式1: 複製程式碼 SQL> alter pluggable database PDBEPPS open;Pluggable database altered. SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;CON_ID DBID GUID NAME OPEN_MODE---------- ---------- -------------------------------- ------------------------------ ----------2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS READ WRITE複製程式碼 方式2: 複製程式碼 SQL> alter session set container=PDBEPPS;Session altered. SQL> startup Pluggable Database opened. SQL> 複製程式碼 6)關閉PDB資料庫 SQL> alter pluggable database PDBEPPS close;Pluggable database altered. SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;CON_ID DBID GUID NAME OPEN_MODE---------- ---------- -------------------------------- ------------------------------ ----------2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS MOUNTEDSQL> 7)在容器間切換 SQL> alter session set container=PDBEPPS;Session altered. SQL> show con_name; CON_NAME ------------------------------ PDBEPPS SQL> SQL> alter session set container=CDB$ROOT;Session altered. SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL>