oracle12c新特點之可插拔資料庫(Pluggable Database,PDB)

sqysl發表於2016-06-11

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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2118667/,如需轉載,請註明出處,否則將追究法律責任。

相關文章