Oracle 12c R2版本 Application Containers 特性(一)

沃趣科技發表於2017-10-11

沃趣科技  楊禹航




在Oracle Database 12c R2版本中,Oracle帶來新的Application Containers特性,該特性對原有的多租戶功能進行了增強,在CDB root容器中可以建立一個叫做Application root的容器,類似於CDB root,可在其內建立多個依賴於Application root的Application PDBs,其架構圖如下:

Oracle 12c R2版本 Application Containers 特性(一)

“Application”

Oracle 12c R2版本 Application Containers 特性(一)

在Application Container特性下還有另一個概念,被命名為“Application”,我們可以把“Application”理解為一個區域,“Application”只能建立在Application root中,其內可以建立表、檢視、函式等公共物件,然後可在Application PDBs中使用sync同步命令,來實現“Application”內的公共物件共享到Application PDBs中。

本篇文章中,通過"Application Root/PDBs"與"Application"的建立開始帶你認識Application Container特性,在第二篇中將帶你瞭解“Application”內的公共物件(Application Common Objects),並通過實驗讓你對其有一個更加直觀的認識。


Application root的建立


Application root與普通的PDB建立語句相似,在建立語句中需要指定“as application container”子句。

首先我們先設定db_create_file_dest:

Oracle 12c R2版本 Application Containers 特性(一)

建立一個名qdatacon1的Application root:

Oracle 12c R2版本 Application Containers 特性(一)

這樣一個名為qdatacon1的Application root就已經成功建立 ,可以通過檢視dba_pdbs.application_root欄位檢視是否是Application root,如下:

Oracle 12c R2版本 Application Containers 特性(一)

dba_pdbs.application_root欄位為YES

將QDatacon1開啟:

Oracle 12c R2版本 Application Containers 特性(一)

注意,當在使用Application Containers特性時需要使用資料檔案的OMF的管理方式,雖然在不使用OMF管理時依然可以成功建立Application root以及Application PDBs,但當“Application”內包含表空間後,在Application PDBs中進行同步“Application”時會報ORA-01537錯誤,無法將“Application”內的表空間同步到Application PDBs中。錯誤程式碼如下:

Oracle 12c R2版本 Application Containers 特性(一)

Application root的基本管理與普通的PDB基本上沒有區別, 包括Application root的cloning/unplug/plugin等。但需要注意as application container的使用,比如下面unplug/plugin的過程:

Oracle 12c R2版本 Application Containers 特性(一)

當然,如果你想將Application root拔出後,以普通PDB的方式插入CDB中,那麼去掉

as application container子句即可。

Oracle 12c R2版本 Application Containers 特性(一)


Application PDBs的建立


Application PDB在建立時必須連線到相應Application root中,而不是CDB root,當連線到Application root中時,只需按照建立普通PDB的方式建立即可,無需額外子句指定,建立完成的PDB既是相應Application root中的Application PDB。

切換到Application root中建立Application PDB:qdcpdb1

Oracle 12c R2版本 Application Containers 特性(一)

切換到CDB中:

Oracle 12c R2版本 Application Containers 特性(一)

在CDB$root中通過show pdbs顯示時,可以看到的Application PDB與普通的PDB並沒有什麼區別。

可以通過cdb_pdbs檢視,來檢視Application PDB屬於哪個Application root

Oracle 12c R2版本 Application Containers 特性(一)

當Applicatoin PDB建立成功,可以使用sync命令將它與Application root中定義的Application進行同步。

alter pluggable database application all sync;


Applications


文章的開篇提到,可以把“Application”做為一個區域來理解,而“Application”只能在Application root中建立及管理,相關命令如下:

 

Oracle 12c R2版本 Application Containers 特性(一)

application_clauses::=

 

Oracle 12c R2版本 Application Containers 特性(一)

在“Application”的維護命令中可能最常用的就是install、patch、upgrade以及uninstall,下面對三個命令做簡單描述。


Install an Application


當使用alter pluggable database帶有begin install子句時,即開始一個“Application”的安裝,這裡可以理解為一個區域的開始,當安裝完成後在Application PDB中使用sync命令同步相應的“Application”將會被自動安裝在本PDB內。

QDatacon1:

Oracle 12c R2版本 Application Containers 特性(一)

這樣我們開始了一個qdcon1_reg1的“Application”,使用end install命令封閉qdcon1_reg1,如下:

Oracle 12c R2版本 Application Containers 特性(一)

可以通過dba_applications檢視檢視,已經安裝的Application,如下:

Oracle 12c R2版本 Application Containers 特性(一)

Application安裝完成後,可以在該Application root下的Application PDB中使用sync命令來進行同步,如下:

Oracle 12c R2版本 Application Containers 特性(一)

檢視dba_applications檢視,確認qdcon1_reg1是否已經安裝

Oracle 12c R2版本 Application Containers 特性(一)

可以看到qdcon1_reg1已經安裝完成,安裝完成後qdcon1_reg1中的公共物件會以特定的方式被共享到相應的Application PDB中,如下:

Oracle 12c R2版本 Application Containers 特性(一)

表tdata已經被共享到qdcpdb1中。

在Application root中可以通過dba_app_pdb_status檢視,檢視Application被安裝到哪些Application PDB中,如下:

Oracle 12c R2版本 Application Containers 特性(一)


Patch an Application


在上面的小結中,當我們使用end install子句將“Application”封閉後,如果想再次在“Application”中建立物件(table/view/packages/sequence等),以及對“Application”內已經存在的物件進行alter操作時,我們可以使用patch子句對現有的“Application”進行修補操作。

如下示例,開始一個patch,並且在application內創新增表以及更改現存表的表結構:

Oracle 12c R2版本 Application Containers 特性(一)

刪除Application內的表:

Oracle 12c R2版本 Application Containers 特性(一)

刪除失敗

結束patch:

Oracle 12c R2版本 Application Containers 特性(一)

檢視patch資訊

Oracle 12c R2版本 Application Containers 特性(一)

在qdcpdb1中同步qdcon1_reg1

Oracle 12c R2版本 Application Containers 特性(一)

tdata的表結構與texte表均同步完成


Upgrade an Application


對“Application”我們可以使用patch來對其進行修補操作,但修補操作只限新增/更改等,無法對已經存在“Application”中的公共物件進行刪除操作,如果我們想對公共物件進行刪除操作,可以使用UPGRADE子句對現有的“Application”進行升級,在升級的過程中,Oracle會首先自動建立Application root的Clone版本,Clone版本建立完成後,Application PDBs將指向Clone版本的Application root,“Application”將繼續執行升級操作,升級完成之後,Application root的Clone版本將繼續被保留,並且為不同步“Application”的Application PDB提供服務,同步“Application”後的Application PDB將指向升級後的Application root。

Oracle 12c R2版本 Application Containers 特性(一)

Oracle 12c R2版本 Application Containers 特性(一)

升級現有的qdcon1_reg1:

Oracle 12c R2版本 Application Containers 特性(一)

Oracle 12c R2版本 Application Containers 特性(一)

F1956732192_4_1即為qdatacon1的clone版本

刪除tdata表,並且建立新表tmeta:

Oracle 12c R2版本 Application Containers 特性(一)

結束升級,並檢視版本資訊:

Oracle 12c R2版本 Application Containers 特性(一)

在qdcpdb1中同步qdcon1_reg1

Oracle 12c R2版本 Application Containers 特性(一)

tdata被刪除/tmeata的建立已同步到qdcpdb1中。


Uninstall an Application


“Application”的解除安裝後並不會從資料字典中將該“Application”刪除,它會被標記為UNINSTALL,以便“Application”不可以進行upgrade/patch/uninstall等操作,當uninstall命令發出後,需要將該“Application”中包含的物件全部刪除。

Oracle 12c R2版本 Application Containers 特性(一)

Oracle 12c R2版本 Application Containers 特性(一)

uninstall同樣會產生clone版本的Application root

刪除物件且結束uninstall:

Oracle 12c R2版本 Application Containers 特性(一)

因為物件並沒有全部刪除,導致end uninstall失敗,下面繼續drop使用者和表空間:

Oracle 12c R2版本 Application Containers 特性(一)

檢視被uninstall的qdcon1_reg1狀態:

Oracle 12c R2版本 Application Containers 特性(一)

在qdcpdb1中檢視公共物件情況:

Oracle 12c R2版本 Application Containers 特性(一)

表texte是extended data-linked方式,資料儲存在Application root的qdata_tbs中,因為qdata_tbs已經被刪除,所以在qdcpdb1中查詢時報錯,而tmeta為metadata-linked方式,資料儲存在本地,所以可以在未做同步時可以查詢。

同步qdcon1_reg1:

Oracle 12c R2版本 Application Containers 特性(一)

同步完成。

本篇文章先到這裡,下一篇文章將講解“Application”內公共物件(Application Common Objects)的三種形式。

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

相關文章