基於版本:19c (12.2.0.3) AskScuti
創建方法:從零開始創建一個PDB(從PDB$SEED創建新的PDB)
對應路徑:Creating a PDB --> Creating From Scratch
在容器數據庫CDB里面如何創建PDB,官方文檔給出了一張創建PDB技術選項圖,圖片如下:
內容總覽
1. 概述
2. 使用位置子句創建
2.1 FILE_NAME_CONVERT
2.2 CREATE_FILE_DEST
3. 不使用位置子句創建
3.1 定義傳統OMF參數
3.2 定義新參數
1. 概述
使用種子(PDB$SEED)創建新的PDB,過程是把PDB$SEED中的數據文件復制到 CREATE PLUGGABLE DATABASE 語句中定義的目標目錄中。如下圖:
整體過程為:
1). 從 PDB$SEED 中復制數據文件
2). 創建 SYSTEM 和 SYSAUX 表空間
3). 創建新目標目錄,並在根容器中記錄元數據進行關聯
4). 創建臨時表空間 TEMP
5). 創建公共用戶 SYS 和 SYSTEM
6). 創建默認服務
2. 使用位置子句創建
所謂使用位置子句的意思就是:在創建的語句中直接指定目標目錄。
2.1 FILE_NAME_CONVERT
使用 FILE_NAME_CONVERT 參數,例如:
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb2 SQL> create pluggable database pdb2 admin user henry identified by henry roles=(connect) file_name_convert=('/u01/app/oracle/oradata/CDB1/pdbseed','/u01/app/oracle/oradata/CDB1/pdb2');
查看創建的PDB2
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED
注意:語句中的 roles=(connect)是直接授予了該用戶的 create session 系統權限,就是允許連接登陸(connect是角色權限包,里面包含 create session 系統權限)
2.2 CREATE_FILE_DEST
使用 CREATE_FILE_DEST 參數,例如:
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb3 SQL> create pluggable database pdb3 admin user henry identified by henry roles=(connect) create_file_dest='/u01/app/oracle/oradata/CDB1/pdb3';
查看創建的PDB3
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED
注意:仔細觀察上面兩個參數的使用。一個參數指定兩個路徑(種子路徑,新路徑),一個參數指定一個路徑(新路徑)。
如果覺得在語句中指定路徑有些麻煩,可以提前定義好相關OMF參數。OMF具體使用在后續博文中,發布后連接更新在此處。現在只需了解OMF(Oracle Managed Files) 就是自動管理文件路徑名稱和大小的,可以簡化用戶管理的一種機制。
3. 不使用位置子句創建
如果在創建PDB時不指定路徑,則可以使用OMF提前定義好。
3.1 定義傳統OMF參數
數據庫有個傳統的OMF參數:DB_CREATE_FILE_DEST
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb4 SQL> show parameter db_create_file_dest; SQL> alter system set db_create_file_dest='/u01/app/oracle/oradata/CDB1/pdb4'; System altered. SQL> create pluggable database pdb4 admin user henry identified by henry roles=(connect); Pluggable database created.
查看創建的PDB4
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED 6 PDB4 MOUNTED
SQL> select name from v$datafile where con_id=6; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5B9ECD51E0530E01A8C0E0DD/datafile /o1_mf_system_gnz3rh9k_.dbf /u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5B9ECD51E0530E01A8C0E0DD/datafile /o1_mf_sysaux_gnz3rh9m_.dbf /u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5B9ECD51E0530E01A8C0E0DD/datafile /o1_mf_undotbs1_gnz3rh9n_.dbf
注意:觀察 db_create_file_dest 這個參數是如何管理PDB4文件的。另外,如果下次創建PDB,則需要繼續改這個參數到新的路徑下。
3.2 定義新參數
在12c中,引入了一個新的參數:PDB_FILE_NAME_CONVERT
這個參數的使用其實和 2.1 小節很類似,只不過這個參數是提前定義好的(種子路徑,新路徑)。
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb5 SQL> show parameter pdb_file_name_convert SQL> alter system set pdb_file_name_convert='/u01/app/oracle/oradata/CDB1/pdbseed','/u01/app/oracle/oradata/CDB1/pdb5'; System altered. SQL> create pluggable database pdb5 admin user henry identified by henry roles=(connect); Pluggable database created.
查看創建的PDB5
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED 6 PDB4 MOUNTED 7 PDB5 MOUNTED SQL> select name from v$datafile where con_id=7; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5BA0CD51E0530E01A8C0E0DD/datafile /o1_mf_system_gnz44ft4_.dbf /u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5BA0CD51E0530E01A8C0E0DD/datafile /o1_mf_sysaux_gnz44ft6_.dbf /u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5BA0CD51E0530E01A8C0E0DD/datafile /o1_mf_undotbs1_gnz44ft7_.dbf
注意:這里好像有個問題,仔細觀察數據文件的路徑,我們創建PDB5指定的 pdb_file_name_convert 這個參數好像沒用上,路徑依然使用的是我們創建PDB4時候的路徑。原因是因為 OMF 這個參數 DB_CREATE_FILE_DEST 進行了全局指定,因此也了解到,當這兩個參數同時定義的時候,使用的是 DB_CREATE_FILE_DEST。
嘗試取消DB_CREATE_FILE_DEST,創建PDB6。
SQL> alter system set DB_CREATE_FILE_DEST=''; System altered. SQL> create pluggable database pdb6 admin user henry identified by henry roles=(connect); Pluggable database created.
查看創建的PDB6
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED 6 PDB4 MOUNTED 7 PDB5 MOUNTED 8 PDB6 MOUNTED SQL> select name from v$datafile where con_id=8; NAME ----------------------------------------------- /u01/app/oracle/oradata/CDB1/pdb5/system01.dbf /u01/app/oracle/oradata/CDB1/pdb5/sysaux01.dbf /u01/app/oracle/oradata/CDB1/pdb5/undotbs01.dbf
這時候,用上了我們創建的 pdb5 文件路徑。