轉自:http://chuansong.me/n/443660447865
在使用 dbca 建庫時,創建數據庫之前,可以保存一下創建腳本,分析其具體執行過程。以自定義方式創建名稱為julia的數據庫為例,其主要腳本 julia.sql 中包含如下腳本調用:
在第一個腳本 CreateDB.sql 中的末尾部分包含了 Pluggable Database 的變化,這段命令啟用了插接式數據庫,並且初始化了種子 PDB,存儲目錄位於數據庫目錄下的 pdbseed 子目錄。
注意以下語句,種子數據庫的文件都來自於當前創建的 CDB 數據庫,這些文件被復制到 PDBSEED 目錄下,這也是創建 PDB 的第一種方式:
當然我們也可以通過模板方式創建 PDBSEED,此時文件將來自於軟件包中的 pdbseed.tar.gz 壓縮包。相應的,創建腳本也會有所不同,在模板方式下增加了一個 plugDatabase.sql 腳本,包含以下主要內容:
腳本中的 null 目錄最終會被替換為實際目錄,其執行過程就是解壓縮拷貝文件。
在使用自定義方式創建數據庫時,觀察腳本的執行過程,可以看到種子數據庫的 SYSTEM 和 SYSAUX 表空間初始大小完全一致:
以下查詢顯示當前的 PDB$SEED 種子數據庫以只讀方式打開:
接下來以這個種子數據庫為模版,創建第一個 PDB,首先設置一個創建目錄:
然後通過如下命令創建 PDB:
查詢一下,顯示當前新創建的數據庫狀態為 Mount:
使用如下語句打開 PDB:
當打開 PDB 之後,在日志中可以看到如下一行:
數據庫在 PDB 打開後,自動增加一個服務名,注冊到監聽器,然後就可以接受外部的連接請求了。
在測試環境中,配置了以下本地網絡服務名:
接下來就可以通過如下方式連接到 PDB 數據庫,可以查看歸屬於 PDB 的數據文件:
也可以查詢數據庫中的用戶,可以看到 EYGLE 用戶已經被建立:
接下來就可以通過 EYGLE 這個 PDB 數據庫用戶連接訪問這個數據庫,通過如下方式連接:
也可以通過 SYS 用戶連接 PDB,如下使用 EZCONNECT 方式連接到數據庫,查詢 v$datafile 視圖,可以看到當前 PDB 有三個數據文件,其中 UNDO 表空間共享的全局數據文件,其余兩個為 SYSTEM 和 SYSAUX 表空間文件:
查詢 v$tempfile 視圖,可以看到 PDB 的獨立臨時文件:
控制文件屬於共享范疇,在 PDB 級別查詢可見:
在 DBA 等高級權限的用戶下,可以通過 ALTER 命令進行會話級別的容器切換,訪問不同容器下的對象:
注意,如果 PDB 的服務名沒有自動添加,可以通過手工配置實現:
在完成測試之後,通過以下命令可以刪除一個 PDB:
除了通過種子 PDB 創建新的空 PDB 之外,還可以通過一個現有的用戶PDB克隆創建新的 PDB 數據庫。以下詳細記錄一個 PDB 的創建與訪問過程。
創建 PDB 的源需要置於只讀模式:
隨後可以打開這個新創建的 PDB:
檢查數據庫的告警日志文件,可以看到,新創建的數據庫,其服務名已經被自動添加到數據庫的服務名配置中:
檢查數據庫監聽器,可以看到 PDB 都已經被監聽器監聽服務:
在12c 的建庫過程中,引入了 Perl 腳本的調用方式,以下是在創建過程中跟蹤到的腳本調用,在數據庫創建的日志中也可以觀察這種方式:
這個過程完成之後,會在告警日志文件中記錄如下信息:
在 tnsnames.ora 文件中,增加相應的配置,就可以通過服務名連接數據庫了,以下是兩個 PDB 的本地網絡服務名配置:
對於 PDB 的一些更改操作不能在 CDB 級別進行,CDB 級操作會提示不能在 PDB 之外執行,如以下更改 GLOBAL_NAME 的操作:
連接到 PDB 以 RESTRICTED 模式可以進行這些修改:
在 PDB 創建完成之後,可以通過 SYSDBA 連接到 PDB,執行維護操作,這和常規的 Non-CDB 數據庫沒有差別,在 PDB 中,只要具備足夠的權限,可以創建表空間、數據文件、用戶和數據對象等。
以下通過 SYS 用戶連接到一個名為 ENMO 的 PDB 數據庫:
在 PDB 中執行用戶及表空間創建命令:
執行用戶管理,分配空間、更改默認表空間等:
通過指定用戶連接,可以創建數據對象,以下測試以 SCOTT 用戶腳本為例創建:
查看這些信息:
這些信息在 CDB 級別的數據庫中是不可見的:
跨數據庫的數據訪問,需要通過 DB Link 進行,如以下測試范例:
在數據庫創建的最後過程,可以在告警日志中觀察到,數據庫最後調整了文件號的順序,如下日志顯示,原有2號文件和4號文件被刪除,並增加了7號和8號文件:
檢查底層 file$ 字典表,確實可以發現文件號2和文件號4 已經被刪除:
而通過 v$datafile 視圖可以查詢到來自控制文件的信息,2號和4號文件是 PDBSEED 中的兩個文件:
從數據字典中隱藏了文件號,就徹底屏蔽了對於種子數據庫的操作,該 PDB 就只能以只讀的方式打開。
在日志中可以看到,數據庫創建完成之前,pdb$seed 可以被打開和關閉,但是創建完成,刪除文件號之後,則被保護了起來:
在數據庫啟動過程中,如嘗試 Offline 的操作,就會收到2號文件不存在的提示(雖然在 v$datafile 中可以看到這個文件):
首先 PDB 的訪問依賴於 CDB,必須啟動 CDB 之後,才能夠對 PDB 進行操作。當 CDB 打開訪問時,PDB 處於 Mount 狀態,需要進一步的操作打開 PDB。下圖描述了在 PDB 的模式下,數據庫的啟動過程和步驟:
接下來通過測試來驗證一下這個過程。以下首先啟動 CDB 到 NOMOUNT 狀態,可以看到 v$pdbs 視圖是不能訪問任何 PDB 信息的:
當 MOUNT 數據庫之後,PDB 隨之被 MOUNT,以下查詢顯示當前數據庫中包含三個 PDB,一個種子庫,兩個用戶庫:
在 CDB 打開之前,PDB 不能夠執行 Open 操作:
當 CDB 打開之後,可以看到種子庫被以只讀方式打開,其他用戶 PDB 數據庫未自動打開:
可以通過獨立的 PDB 命令,執行數據庫 OPEN 操作,可以通過 ALL 關鍵字同時打開或關閉所有 PDB:
如果需要在數據庫啟動之後,自動打開全部的 PDB 數據庫,可以創建一個觸發器,用於在數據庫開啟後自動執行數據庫讀寫打開: