編輯手記:在oracle12.2 中提供了多種建立pdb的方式,能夠更快速便捷地實作資料庫的擴充和變更。今天我們來介紹通過sql*plus管理的方式。
注:文檔内容來自于官方文檔翻譯,想了解更多資訊請參閱官方文檔。
1
pdb的建立
在建立pdb之前,需要滿足以下條件:
cdb必須存在。 cdb必須處于讀/寫模式。 操作使用者必須是目前cdb root或application container的公共使用者。 操作使用者必須具有create pluggable database的系統特權。 必須為每個容器确定唯一的容器名稱。每個容器名稱在單個cdb中必須是唯一的,并且每個容器名稱在通過特定偵聽器通路執行個體的所有cdb的範圍内必須是唯一的。 pdb名稱用于區分pdb與cdb中的其他pdb。 pdb名稱遵循與服務名稱相同的規則,其中包括不區分大小寫。 如果要在具有實體standby資料庫的oracle dg配置中建立pdb,則必須在建立pdb之前完成其他任務。 如果要建立包含使用了透明資料加密過的資料的pdb,或者建立啟用了資料庫保險庫的pdb,則會有更多的前提條件
通過sql*plus 的方式建立pdb共有以下幾種方式。
creating a pdb using the seed
可以使用create pluggable database語句在cdb中使用cdb seed的檔案建立pdb。
實作過程如下:
還可以使用此語句在application container中使用application seed或cdb seed的檔案建立application pdb。
兩種方式的使用場景:
當application container包含application seed時,并且在application root目錄中運作create pluggable database語句以從seed建立 application pdb時,将使用應用程式種子application seed 建立 application pdb。 但是,當application container不包含application seed,并且在application root 目錄中運作create pluggable database語句以從seed 建立 application pdb時,将使用cdb種子(pdb $ seed)建立 application pdb。
建立步驟
登入sql *plus,確定目前容器是cdbroot或者application root
對于cdb root,使用cdb root的檔案在cdb中建立pdb;
對于application root,使用application root的檔案建立pdb;
對于沒有application root的容器,都使用cdb root的檔案在cdb中建立pdb
運作create pluggable database語句,并為pdb指定本地管理者。
建立pdb後,它處于mount模式,其狀态為new。 可以通過查詢v$ pdbs視圖中的open_mode列來檢視pdb的打開模式。 通過查詢cdb_pdbs或dba_pdbs視圖的status列來檢視pdb的狀态。
該過程pdb有一個新的預設服務被建立。該服務與pdb具有相同的名稱,可用于通路pdb。 必須為用戶端正确配置oracle net services才能通路此服務
将建立好的pdb以read/write模式打開
必須以read/write模式為oracle資料庫打開新的pdb,以完成新pdb到cdb的內建。 如果嘗試在read only模式下打開pdb,則會傳回錯誤。 在read/write模式下打開pdb後,其狀态為normal。
備份新 建的pdb
隻有完成備份才能實作必要的恢複
最簡單的建立文法:
預定義pdb管理者的建立文法:
指定存儲、表空間、檔案位置等相關内容的建立文法:
creating a pdb by cloning an existing pdb or non-cdb
可以使用create pluggable database語句從源pdb或從非cdb克隆pdb。通過克隆,将源pdb或非cdb克隆為新的pdb,并自動将克隆插入cdb。要使用該技術,需要在建立語句中包含有from子句指定源。
源可以是本地cdb中的pdb,遠端cdb中的pdb或non-cdb。 create pluggable database語句将與源關聯的檔案複制到新位置,并将檔案與目标pdb關聯。 當cdb處于archivelog模式和本地撤消模式時,源pdb可以在讀/寫模式下打開,并在操作期間完全起作用。 是以支援熱pdb克隆。
克隆的一個用途是測試。 通過克隆,可以建立一個或多個pdb或non-cdb,并單獨安全地進行測試。 例如,在将application與production pdb一起使用之前,可以在克隆的pdb上測試新的application或修改過的的application。
本地pdb的克隆
遠端pdb的克隆
若源pdb在遠端cdb中,必須使用dblink克隆pdb,在cdb中建立包含克隆的pdb的dblink。
從包含新pdb的cdb root目錄發出create pluggable database語句時,必須指定到包含正在from子句中克隆pdb的遠端cdb的dblink。 dblink連接配接到遠端cdb的根目錄,或從包含新pdb的cdb連接配接到遠端源pdb。
non-cdb的克隆
當源為non-cdb時,必須在from子句中指定指向非cdb的dblink。
在所有克隆方案(本地,遠端和non-cdb)中,當application root目錄是運作create pluggable database語句時的目前容器時,将在application container中建立克隆的pdb。 在這種情況下,源pdb的application名稱和版本必須與克隆的應用程式名稱和應用程式容器的版本相比對。
application container中pdb的克隆
如果目标cdb沒有具有相同名稱的公共使用者,則該使用者帳戶被鎖定在目标pdb中。 對于每個鎖定的使用者,可以選擇以下選項處理:
1、關閉pdb,連接配接到根目錄,并建立具有相同名稱的公共使用者。 當pdb在讀/寫模式下打開時,共同授予使用者的角色和特權的差異将得到解決,可以解鎖使用者。 在此過程中,本地授予使用者的權限和角色保持不變。 2、在pdb中建立新的本地使用者,并使用資料泵将鎖定的使用者資料導出/導入到新的本地使用者模式中。 3、保留使用者鎖定。 4、删除使用者。
creating a pdb by relocating it
可以使用create pluggable database語句将pdb從一個cdb重定位到另一個cdb。必須包括指定pdb的目前位置的from子句;包括relocate子句以指定正在移動pdb而不是克隆。在操作完成之後,pdb被添加到pdb被重定位到的cdb。使用這種技術是以最少停機時間重定位pdb的最快方式,被重定位的pdb可以在讀/寫模式下打開并且在重定位過程期間完全起作用。
第一種情況,在cdb之間relocate pdb。
第二種情況是relocate 一個pdb到application container。
當pdb重新定位時,有以下兩個選項:availability max和availability normal。使用availability max子句将連接配接從pdb的舊位置重定向到新位置。
也可以通過以下的間接方式将連接配接從pdb的舊位置重定向到新位置。
如果系統使用oracle internet directory(oracle的ldap目錄服務),則可以在中央位置更新連接配接資訊,而不是在多個用戶端配置檔案中更新。 如果在舊位置和新位置為pdb使用相同的偵聽器,則在重新定位完成時,新連接配接将自動路由到pdb的新位置。 如果pdb使用不同的偵聽器,并且通過local_listener和remote_listener參數的配置使用它們各自偵聽器的交叉注冊,則重新定位是無縫的,因為pdb的服務的可用性和位置将被自動注冊到偵聽器。
第三種情況是從遠端cdb relocate pdb。
在這種情況下,運作create pluggable database語句時,新pdb所屬的root取決于目前容器:
若目前容器是cdb root時,會在cdb根目錄中建立新的pdb。 若目前容器是application container的application目錄時,新的pdb将作為application pdb建立。
creating a pdb by plugging an unplugged pdb into a cdb
該技術使用描述pdb的xml元檔案和相關的資料庫檔案将pdb插入到cdb中。這些檔案可以單獨使用,也可以壓縮為一個.pdb字尾的檔案。如以下兩種情況:
第二種情況,将pdb插入到application root。如下圖所示:
可以使用create pluggable database語句插入pdb,必須包括一個using子句,指定描述pdb或.pdb歸檔檔案的xml元檔案。源cdb是從其拔下pdb的cdb。 目标cdb是要插入pdb的cdb。 源cdb和目标cdb可以是相同的cdb或不同的cdb。
插入步驟如下:
1、登入sql*plus,確定目前的容器是目标cdb或者目标application container。 若目前容器是目标cdb root的時候,會建立pdb并插入cdb,若目前容器是application container,則會建立相應的application pdb。 2、執行dbms_pdb.check_plug_compatibility包,確定pdb與cdb相容; 3、如果pdb還未從源cdb拔下,先拔下來。 4、執行 create pluggable database包,使用using語句指定xml元檔案、.pdb歸檔檔案及其他相關參數。 5、将新的pdb以read/write模式打開 6、對新的pdb進行備份。
creating a pdb as a proxy pdb
代理pdb提供對遠端cdb中的另一個pdb的通路。可以使用create pluggable database語句通過引用其他pdb來建立代理pdb。
當需要遠端pdb的本地上下文環境時,可以使用代理pdb。 另外,當不同cdb中的application container具有相同的application時,它們的application 肉體可以與代理pdb保持同步。
代理pdb建立圖解如下:
第二種情況,建立application container中的代理pdb
在建立代理pdb的過程中,始終需要dblink。建立完成之後,該dblink不再被使用,代理pdb直接與被引用的pdb通信。
直接通信需要包含引用的pdb的cdb的偵聽器的端口号和主機名,預設情況下,代理pdb使用以下值:
偵聽器端口号:1521 如果引用的pdb的偵聽器不使用預設端口号,則必須使用port子句指定偵聽器的端口号。 您可以在建立代理pdb時指定端口号,也可以更改代理pdb以更改端口号。 偵聽器主機名:包含引用的pdb的cdb的主機名 如果引用的pdb的偵聽器不使用預設主機名,則必須使用host子句指定偵聽器的主機名。 您可以在建立代理pdb時指定主機名,也可以更改代理pdb以更改主機名。
creating a pdb using a non-cdb
使用non-cdb建立pdb的時候,有以下幾種方式:
1、通過建立non-cdb的庫建立pdb
該方法是使用non-cdb建立pdb的最簡單的方法,但它需要将non-cdb的檔案複制到新位置。前提條件是無論是non-cdb還是将要用于pdb插入的新的cdb,必須是12.1或者更新的版本。
2、使用dbms_pdb的包建立xml元檔案
xml元檔案描述non-cdb的資料庫檔案,此方法需要比通過克隆non-cdb建立pdb更多的步驟,但它允許在某些情況下使用non-cdb建立pdb而不移動non-cdb檔案。
3、使用oracle datapump 的導入的導出功能建立pdb。
從一個non-cdb中導出相關檔案,并導入到pdb中,在執行導入時,在使用者名後面指定pdb的連接配接辨別符。 例如,如果pdb的連接配接辨別符是hrpdb,則在運作oracle data pump import實用程式時輸入以下内容:
4、通過ogg複制建立pdb
将來自non-cdb的資料複制到pdb, 當建立的pdb與源non-cdb同步時,可以故障轉移到pdb。
2
将pdb從cdb中拔出
要拔出pdb,需要連接配接到其cdb root或application root目錄,并使用alter pluggable database語句指定xml檔案或.pdb檔案。
當指定xml檔案(.xml擴充名)時,它将包含有關pdb的中繼資料,被拔除後, sql語句建立xml檔案,并且它包含在目标cdb上啟用create pluggable database語句以插入pdb所需的資訊。 指定.pdb檔案時,它包含描述pdb和pdb使用的檔案(例如資料檔案和元檔案)的xml檔案的壓縮歸檔。 .pdb檔案允許您将單個壓縮檔案(而不是多個檔案)複制到新位置,以将pdb插入cdb。
該過程圖解如下:
第二種情況,從application container中拔出:
必須關閉pdb,然後才能出。 當拔下pdb時,同一cdb中的其他pdb處于mount模式。 拔除操作會在pdb的資料檔案中進行一些更改以記錄。 因為它仍然是cdb的一部分,是以被拔出的pdb包含在整個cdb的rman備份中。以備将來需要時使用。
當然,也可以從cdb中完全删除pdb。 在拔出的pdb上支援的唯一操作是 dropping pdb。如果需要将pdb插回到同一個cdb中, 必須先從cdb中删除該pdb,并且 pdb隻有在插入cdb時才可用。
在drop pdb的過程中,可以使用一下語句指定要不要保留pdb的檔案。
1、keep datafiles選項保留pdb的檔案 2、including datafiles則将pdb檔案一起從cdb磁盤中删除。