oracle12c新特點——可插拔資料庫(Pluggable Database,PDB),oracle12cpluggable
1. 12c PDB新特點的優勢
1) 可以把多個PDB整合進一個平台。
2) 可以快速提供一個新的PDB或一個已有PDB的複製。
3) 通過拔插技術,可以快速把存在的資料庫重新部署到一個新平台上。
4) 多個PDB資料庫補丁或升級一次完成。
5) 通過把單個PDB拔插到較高版本的不同CDB,可以補丁或升級一個PDB。
6) 從同一個CDB中眾多PDB中分離出某個PDB的內容。
7) 分離這些PDB應用管理員的責任。
2. 12c PDB新特點的功能
1) 在一個CDB中,你可以擁有很多PDB。
2) PDB和12.1之前版本的普通資料庫是向後相容的。
3) PDB對應用是透明的——你不需要改變用戶端代碼或資料庫物件。
4) RAC中每個執行個體作為一個整體開啟CDB(因此CDB和其中的PDB資料庫版本都是相同的)。
5) 會話僅僅看到它自己串連的那個PDB。
6) 你可以從一個CDB拔出一個PDB,然後插入另一個CDB。
7) 你可以在同一個CDB或不同CDB間複製PDB。
8) 資源管理員隨著PDB的功能得以擴充。
9) 通過SQL語句實現了實體PDB的操作(建立,拔出,插入,複製,清除,設定開啟模式)。
10) 當串連到所謂的“根”(root)時,CDB管理員來執行這些操作。
11) 所有的PDB能被一次備份,但可以分別單獨恢複。
3. 12c PDB的詳解
1) 每個PDB有自己的私人資料字典用於使用者建立的資料庫物件;另一方面,CDB作為一個整體也包含Oracle提供系統的資料字典,其中,每個資料字典定義自己的命名空間。換句話說,有全域資料字典(CDB級)和本機資料字典(PDB級)。
2) 有新的分開的資料字典架構,該架構允許一個PDB被快速從一個CDB拔出並插入一個不同的CDB。
3) 每個PDB只能看到Oracle提供系統的唯讀定義。
4) 有全域資料庫參數,也有本機資料庫參數。PDB參數僅僅屬於特定的PDB,並且拔出後,PDB參數也將保持不變。
5) 資料庫使用者可以是全域的(CDB)或本地的(PDB)。SYS和SYSTEM使用者一開始就在兩級DB中存在。如果你在CDB中建立了一個新使用者,那麼你在PDB中也能看到這個使用者。在PDB中建立的使用者只能在該PDB中使用。
6) 暫存資料表空間可以是全域或本地的。
7) Redo日誌和Undo資料表空間都是全域的(CDB級)。
8) Data Guard在CDB級作為一個整體發揮作用;RMAN調度的備份也作為一個整體在CDB級完成;任何時候,你可以只備份一個PDB。
9) 應用串連PDB時,不需做代碼修改;系統管理員可以串連CDB;串連串中的服務名確定目標PDB。
10) PDB允許更加清晰的聲明定義一個應用;一個PDB對同一個CDB裡的其他PDB一無所知;每個PDB是個密閉的容器。這保證了新層面DB的獨立和安全。
4. 串連到一個PDB
建立一個PDB時,一個服務也會被建立在該PDB內,並且,該服務被作為初始化容器。你可以通過下列語句顯示目前的容器:
selectSys_Context('Userenv', 'Con_Name') "current container" from dual;
在12.1 SQL*Plus提示符下,你能用SHOW con_name來顯式目前的容器。
在建立PDB時,也會啟動服務。雖然服務的中繼資料被記錄在PDB中,但名字和PDB名字是一樣的。會話將被一個不能改變目前容器的使用者建立。
用戶端應用代碼通常被設計成在代碼外面確定串連描述資訊。例如:代碼也許使用TNS別名,允許在不改變代碼的情況下改變串連串。
當然,在一個PDB中可以有多個服務。每個將表示它被定義為PDB初始目前容器。可以用常規方法建立、維護、清除PDB中另外的服務,但一定不要清除PDB中預設的服務。建立初始容器是一個PDB的會話的唯一方法是確定一個服務。
下面的例子中,看如何用容易的文法串連到Orale12c中被叫做“cdb1”的CDB,並且串連到其中一個PDB:
sqlplusSys/Sys@localhost:1521/cdb1 AS SYSDBA
CONNECTScott/tiger@localhost:1521/My_PDB
5. 建立並開啟一個新的Oracle12c可插拔資料庫(PDB)
現在,我們將要建立並開啟一個名叫my_pdb新的可插拔資料庫(PDB)。每個CDB都有一個叫做 PDB$Seed 的標準的PDB模板。我們實際是通過複製該模板來建立一個新PDB。看下面例子:
sqlplussys/pass@localhost:1521/cdb1 as sysdba
create pluggable database My_PDB
admin user App_Admin identified by pass
file_name_convert = ('/pdbseed/', '/my_pdb/');
“ file_name_convert”子句確定新檔案名稱如何從模板庫派生出來,這點和我們知道的rman差不多。在PDB建立期間,Oracle僅拷貝system和sysaux資料表空間的兩個資料 檔案,undo,redo等其餘資料庫檔案是CDB全域的檔案,並且它們屬於特定的叫做CDB$Root的容器。
“admin user”子句是必須的,在擴充格式,給新使用者賦予了許可權和角色,該使用者僅在my_pdb內可以建立新會話。
在建立完可插拔資料庫後,新的PDB處於MOUNTED模式。在新PDB中建立一個新會話前,必須先開啟它。因此,我們可以用下面的命令開啟它:
alter pluggabledatabase My_PDB open;
6. 檢查容器資料庫(CDB)和可插拔資料庫(PDB)檔案
select con_id,tablespace_name, file_name
fromcdb_data_files
where file_Namelike '%/cdb1/pdbseed/%'
or file_Namelike '%/cdb1/my_pdb/%'
order by 1, 2;
CON_IDTablespace_Name File_Name
------------------ -------------------------------------------------
2 SYSAUX /home/oracle/oradata/cdb1/pdbseed/sysaux01.dbf
2 SYSTEM /home/oracle/oradata/cdb1/pdbseed/system01.dbf
3 SYSAUX /home/oracle/oradata/cdb1/My_PDB/sysaux01.dbf
3 SYSTEM /home/oracle/oradata/cdb1/My_PDB/system01.dbf
7. Open all Oracle 12c Pluggable Databases (PDB)
RAC每個執行個體中的每個CDB中的PDB有它自己的開啟模式(Open_Mode )和限制狀態(Restricted status)。開啟模式的可能值為MOUNTED,READ ONLY,和 READ WRITE;當PDB開啟時,限制狀態可能的值為YES和NO,否則為null;
啟動一個執行個體(這回開啟這個CDB)並不會開啟PDB。“alterpluggable database”語句被用來設定PDB的開啟模式。在該SQL語句中,可以給一個特定PDB名或用關鍵字“all”,例如:
alter pluggabledatabase all open;
8. 關閉CDB中所有的Oracle12c可插拔資料庫
下列語句關閉CDB中所有的PDB:
alter pluggabledatabase all close;
9. 複製同一個CDB中一個現有的Oracle12cPDB
下面,我們將複製同一個CDB中的現有的PDB。為此,在開始複製前,必須先關閉該PDB,然後以READ ONLY模式開啟:
alterpluggable database My_PDB close;
alterpluggable database My_PDB open read only;
createpluggable database My_Clone
fromMy_PDB
file_name_convert= ('/my_pdb', '/my_clone');
alterpluggable database My_PDB close;
alterpluggable database My_PDB open;
alterpluggable database My_Clone open;
10. 從容器資料庫(CDB)中拔出可插拔資料庫(PDB)
下面,展示如何從cdb1中拔出my_pdb。“into”關鍵字後必須跟PDB描述的全路徑,被該操作以XML格式產生:
alterpluggable database My_PDB
unpluginto '/home/oracle/oradata/cdb1/my_pdb/my_pdb.xml';
“my_pdb.xml“檔案確定資料檔案的名字和全路徑等資訊。這些資訊在插入操作時會用到。注意:PDB還是其從中拔出的CDB的一部分,只是現在狀態變為了拔出(UNPLUGGED)而已。
拔出操作實際上對資料檔案做了一些改變,以便記錄PDB被正確成功的拔出。因為它還是CDB得一部分,你能給它做一個RMAN備份。這提供了一個歸檔拔出日誌的方便方法。
一旦你備份了它,你就可以把它從字典庫裡移走——但是,當然,為了今後的插入操作,你必須保留這些資料檔案。
droppluggable database My_PDB keep datafiles;
11. Oracle 12c可插拔資料庫——拔插和複製操作
11.1. 把My_PDB插入cdb2
1) 串連到目標容器資料庫,這裡是目錄/home/oracle/oradata/cdb2下的cdb2
sqlplus sys/pass@localhost:1521/cdb2 as sysdba
2) 然後,確認將要被插入的PDB和新的主容器資料庫是相容的
exec DBMS_PDB.Check_Plug_Compatibility(PDB_Descr_File=>'/home/oracle/oradata/cdb1/my_pdb/my_pdb.xml');
如果不相容,該過程會報錯。
3) 現在,插入PDB。using關鍵字後必須跟上PDB描述的絕對路徑,即,先前拔出操作時產生的.XML檔案。
create pluggable database My_PDB
using '/home/oracle/oradata/cdb1/my_pdb/my_pdb.xml'
move
file_name_convert = ('/cdb1/', '/cdb2/');
alter pluggable database My_PDB open;
11.2. 從拔出的PDB複製建立一個PDB
該例子建議保留一個被拔出的PDB的備份,這會有很多應用情境,例如:
1) 在一個開發部門,允許研發者和測試者快速、重複的提供一個開始;
2) 支援自學;
3) 提供一個交付新應用的方法;
為了示範,假設你已經拔出了MY_PDB1,並把它放在了合適的目錄下,並設定為唯讀。
create pluggable database MY_PDB1 as clone
using
'/home/oracle/oradata/bk_pdbs/my_pdb1/my_pdb1.xml'
copy
file_name_convert =
('/bk_pdbs/my_pdb1/', '/cdb1/my_pdb1/');
alter pluggable database my_pdb1 open;
“as clone”SQL子句確保新的PDB得到一個正確的、全域的唯一標識。然後,你能看到你的GUIDs:
selectPDB_Name, GUID
fromDBA_PDBs
orderby Creation_scn;
注意:PBD被從CBD拔出後以及後來插入另一個CBD,DBA_PDBs.GUID就會一直伴隨著它。伺服器代碼會強制CBD內PDB的唯一性,但並不強制CBD間的唯一性。
11.3. 把一個非CBD庫當做PDB插入一個已有的CBD庫
這裡,我將展示給你如何把12.1前的資料庫轉變為一個PDB。你共有幾個方法做到這點:
1) 可傳輸資料表空間/資料泵;
2) 複製;
3) 把原來的非CBD庫升級到12c,並把它插入12c CDB;
因為頭兩個方法曾經都是標準方法,我們這裡將只描述最後一個。
注意:不是一個升級步驟就能完成所有任務,它是一個兩階段操作:首先,把你現存的資料庫升級為12.1非CDB庫;接著,把你的非CDB庫插入現存的CDB中——僅僅插入PDB和接著完成一個插入後步驟。
Ø 第一步,先把12.1前的庫升級為12c版本;
Ø 第二步,連到非CDB庫,以便產生表示檔案,正如拔出一個PDB部分所示:
shutdownimmediate
startupmount
alterdatabase open read only;
begin
DBMS_PDB.Describe(PDB_Descr_File=> ‘/home/oracle/oradata/noncdb/noncdb.xml’);
end;
/
shutdownimmediate
Ø 下一步是串連到接收CDB庫——cdb2,並用表示檔案將非cdb庫的資料檔案插入。
createpluggable database noncdb_pdb
asclone
using'/home/oracle/oradata/noncdb/noncdb.xml'
source_file_name_convert= none
copy
file_name_convert= ('/noncdb/', '/cdb2/noncdb_pdb/')
storageunlimited;
Ø 現在開啟庫,最後完成插入,關閉,再開啟,把限制狀態設定為YES:
alterpluggable database noncdb_pdb open;
alterpluggable database noncdb_pdb close;
alterpluggable database noncdb_pdb open restricted;
Ø 最後,運行一個Oracle提供的SQL*Plus指令碼來移去現在本地字典中的資料,因為,在新版本中,定義Oracle系統的中繼資料僅僅在整個CDB中儲存一次。
altersession set container = ExNonCDB;
@?/rdbms/admin/noncdb_to_pdb.sql
Ø 作為最後一步,開啟新被接收的先前的非CDB庫。
alterpluggable database noncdb_pdb open;
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。