Oracle12c 中,增加了可插接數據庫的概念,即PDB,允許一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)。CDB全稱為 ContainerDatabase,中文翻譯為數據庫容器,PDB全稱為PluggableDatabase,即可插拔數據庫。在ORACLE 12C之前,實例與數據庫是一對一或多對一關系(RAC):即一個實例只能與一個數據庫相關聯,數據庫可以被多個實例所加載。而實例與數據庫不可能是一對 多的關系。當進入ORACLE 12C后,實例與數據庫可以是一對多的關系。下面是官方文檔關於CDB與PDB的關系圖。
首先,容器數據庫創建新用戶並分配表空間時必須在沒有PDB的情況下進行或PDB與CDB有相同的表空間的時候進行,否則會報錯。如果是在PDB與CDB 有相同表空間的情況下給CDB用戶分配表空間,則分配CDB的表空間給用戶PDB的表空間並不受影響。而且,CDB用戶必須以‘C##’為開頭,否則創 建不了。如下:
1.這是在沒有PDB的情況下創建用戶“C##ukprod”並分配”USERS“(系統自帶的表空間),如果不以C##開頭的用戶名就會報錯。
2.在CDB中創建表空間TBLSPACE_OTH,而PDB中不存在該表空間,然后創建用戶默認表空間為TBLSPACE_OTH將報錯
3.在PDB中創建表空間TBLSPACE_OTH,注意文件名不能和CDB中的一樣(在不同目錄也沒關系)
3.1 show con_name --查看當前容器
3.2 alter session set container=UKPDB1; --轉換容器到PDB
alter session set container=CDB$ROOT; --轉換容器到CDB
通過查詢可知: “C##test” 的默認表空間是容器數據庫 “CDB” 的, 跟插接式數據庫 “PDB” 一點關系都沒有。如果硬要說有關系的話就是 ” 如果 PDB中沒有表空間 ’TBLSPACE_OTH‘ 的話 CDB 中的用戶就不能以 ’TBLSPACE_OTH‘ 表空間做為默認表空間 ” 。
oracle推薦是把應用放在PDB中的,然而PDB中創建的用戶你會發現按照以前11g的方法是連接不上的,如下圖:
這是為什么呢?
原因是要寫成conn test11/test11@UKPDB1
這個UKPDB1是tnsName, 如下圖:
注意這個SERVER_NAME,並不是UKPDB1,可以用lsnrctl -status查看,我在本地客戶端按照11g的慣例寫了SERVER_NAME = UKPDB1;結果怎么也連不上,在本地注意把PDB的監聽也配上。