閱讀593 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【12.2新特性】在Oracle Active Data Guard上部署列式存儲

一、In-Memory and Active Data Guard

在Active Data Guard上部署列式存儲的目的

可以選在在主庫、備庫或者兩者同時部署列式存儲。當在主備庫上同時部署了列式存儲的時候,可以在兩個庫上對相同或者不同的對象集做操作,如果是操作不同的對象集,那就相當於增加了In-Memory的存儲大小。


  • 在主備庫上部署同樣的In-Memory。

在最簡單的情況下,主數據庫和備用數據庫都包含具有相同大小(不是必需的)的IM列存儲。 IM列存儲包含相同的對象。


此方案的優點是分析查詢可以訪問任一數據庫上的IM列存儲。 因此,可以將分析查詢定向到備用數據庫,而不消耗主數據庫上的資源。主數據庫用於支持事務工作負載,備用數據庫支持分析工作負載。


實現方案如下:

1、在主數據庫實例和備用數據庫實例上設置INMEMORY_SIZE初始化參數。

2、確保備用數據庫實例上的INMEMORY_ADG_ENABLED初始化參數設置為true(默認值)。

3、在要填充到兩個IM列存儲中的所有對象上設置INMEMORY屬性。


如果更改對象的INMEMORY屬性,則主數據庫將更改傳播到備用數據庫。 例如,如果在銷售表上設置NO INMEMORY屬性,那麼兩個IM列存儲都會逐出銷售。


在主數據庫上,可以啟用表的一部分列以填充到IM列存儲中。還可以為不同的列指定不同的壓縮級別。啟用特定列涉及字典更改。 主數據庫上的DDL將傳播到Oracle Active Data Guard數據庫。


  • 隻在standby 庫上部署列存儲


在此方案中,IM列存儲存在於備用數據庫中,但不存在於主數據庫中。


在這種情況下,主數據庫可以充當純OLTP數據庫。在IM列存儲的主數據庫中不需要額外的內存。可以將分析報告應用程序引導到備用數據庫,而不會犧牲性能或消耗主數據庫上的資源。


實現方案如下:

1、將備用數據庫實例中的INMEMORY_SIZE初始化參數設置為非零值,並在主數據庫實例中將其設置為0。

2、確保備用數據庫實例上的INMEMORY_ADG_ENABLED初始化參數設置為true(默認值)。

3、使用要在備用數據庫中的IM列存儲中填充的所有對象的DISTRIBUTE FOR SERVICE子句設置INMEMORY屬性。


例如,如果登錄到主數據庫,並且如果在shsales表上設置INMEMORY屬性,則該表將不會填充到主數據庫上的IM列存儲中 - 因為沒有IM列存儲這個數據庫。但是,備用數據庫將繼承sh.sales表上的INMEMORY屬性。該表將填充在備用數據庫中的IM列存儲中。


  • 主庫IN-MEMORY和備庫IN-MEMORY存儲不同對象

最靈活的場景是單獨配置主數據庫和備用數據庫的IM列存儲。


此方案的優點是您可以在每個數據庫中運行不同的工作負載。 例如,HR應用程序在主數據庫中運行報告,而銷售曆史記錄應用程序在備用數據庫中運行報告。 因此,兩個數據庫都沒有承擔分析報告的全部負載。


實現方案如下:

1、在備用數據庫和主數據庫實例上將INMEMORY_SIZE初始化參數設置為非零值。 這些值不需要相同。

2、確保備用數據庫實例上的INMEMORY_ADG_ENABLED初始化參數設置為true(默認值)。

3、對要在兩個IM列存儲中填充的所有對象設置INMEMORY ... DISTRIBUTE FOR SERVICE子句。 服務指定填充對象的實例。


對應的三種服務:

在以上三種典型的配置中,將會創建三種服務:僅備用,僅主用、主用和備用三種服務。 例如,如果需要主實例中最近一個月的銷售事實表數據,而備用實例中存儲前一個月的銷售數據。 則需要在兩個實例中填充維度表。 對於每個銷售分區,可以使用INMEMORY ... DISTRIBUTE FOR SERVICE指定備用或主要服務。 對於每個維度表,指定包括主數據庫實例和備用數據庫實例的服務。


注:在Oracle RAC中,可以將用於指定用於填充的實例的FOR SERVICE子句與控製IMCU分發的DISTRIBUTE AUTO或DISTRIBUTE BY子句組合。 但是,在Oracle Active Data Guard中,FOR SERVICE子句指定要在其中填充指定對象的主實例或備用實例:您不能使用DISTRIBUTE AUTO或DISTRIBUTE BY在主實例和備用實例之間分發IMCU。 例如,不能在主實例和備用實例之間劃分銷售表的總體,因此一半的IMCU位於主實例中,一半的IMCU位於備用實例中。


二、How IM Column Stores Work in Oracle Active Data Guard

在Oracle Active Data Guard環境中,對象級別PRIORITY屬性控製填充。 僅在服務處於活動狀態的數據庫實例中填充對象。


用戶是基於優先級的按需,取決於PRIORITY值。 當發生角色更改或切換時,數據庫根據服務最新映射到的數據庫實例集合重新填充表。


下圖說明了使用主數據庫中的重做更新備用數據庫的內部機製。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


實現方案如下:

1、主數據庫生成重做,然後將重做傳輸到備用數據庫。

2、在主數據庫上為所有DML語句生成的重做包括指示是否對INMEMORY對象進行更改的元數據。

3、備用數據庫將重做應用於存儲在磁盤中的數據塊。

4、由於備用數據庫將正在進行的操作生成的重做應用於主數據庫,備用數據庫使它們在事務上保持一致。

5、如果修改了INMEMORY對象,則備用數據庫將使用事務日誌和快照元數據單元(SMU)來跟蹤更改,從而使已修改的行無效,就像在主數據庫上一樣。


重新填充機製在備用數據庫中的工作方式與在主數據庫中相同。 當對象上發生足夠的DML以達到內部閾值時,備用數據庫會重新填充IM列存儲中的對象。


三、Configuring IM Column Stores in an Oracle Active Data Guard Environment

在Oracle Active Data Guard中配置IM列存儲需要設置INMEMORY_SIZE,並為要填充的對象正確設置INMEMORY屬性。此任務需要充分了解Oracle Active Data Guard的概念和過程。


必須滿足以下要求

COMPATIBLE設置必須為12.2.0或更大。

要填充每個數據庫中的不同對象,請配置相應的服務。


要在Oracle Active Data Guard環境中配置IM列存儲:


1、在將包含IM列存儲的數據庫實例上設置INMEMORY_SIZE初始化參數。


請遵循以下準則:

  • 要在主數據庫和備用數據庫上配置IM列存儲,請在兩個數據庫實例上設置INMEMORY_SIZE。

  • 要僅在備用數據庫上配置IM列存儲,請在備用數據庫實例上設置INMEMORY_SIZE。

2、確保備用數據庫實例上的INMEMORY_ADG_ENABLED初始化參數設置為true(默認值)。


3、在主數據庫上,使用INMEMORY屬性執行DDL語句。


任務取決於IM列存儲的存在位置,以及是否在每個IM列存儲中填充不同的對象:

  • 如果兩個數據庫中都存在IM列存儲,則連接到主數據庫,並設置INMEMORY屬性,而不使用DISTRIBUTE FOR SERVICE子句。例如,將INMEMORY屬性應用於sh.sales表。


根據標準規則,在每個數據庫上出現人口。例如,如果備用數據庫上的銷售優先級為NONE,那麼觸發完全掃描銷售的備用數據庫的查詢會填充備用IM列存儲中的此表。

  • 如果IM列存儲僅存在於備用數據庫中,則登錄到主數據庫,並設置INMEMORY屬性而不使用DISTRIBUTE FOR SERVICE子句。


在重做傳輸期間,備用數據庫從主數據庫接收此DDL語句。 Population以正常方式出現在備用數據庫上。例如,如果sales具有INMEMORY屬性並且優先級為NONE,則表必須經曆全麵掃描以進行填充。


  • 如果兩個數據庫中都存在IM列存儲,並且希望這些IM列存儲包含不同的對象,請登錄到主數據庫,然後根據每個對象設置INMEMORY ... DISTRIBUTE FOR SERVICE。


在每個DDL語句中,服務指定應填充對象的實例。例如,要僅在備用數據庫中啟用銷售,請在DDL語句中指定僅備用服務。要在兩個數據庫中啟用產品群,請在DDL語句中指定一個備用和主要服務。


文章轉自數據和雲公眾號,原文鏈接

最後更新:2017-07-18 10:32:50

  上一篇:go  Oracle 12.2 的連接消除特性
  下一篇:go  關於Oracle Sharding,你想知道的都在這裏