需要了解的Data Guard理論知識(三)

zhcunique發表於2021-03-12

一. 物理Standby 和邏輯Standby 的區別

Standby資料庫型別分為兩類:物理Standby和邏輯Standby。

1.物理Standby

我們知道物理Standby與Primary資料庫完全一模一樣,DG透過REDO應用來維護物理Standby資料庫。

通常在物理Standby沒有執行REDO應用操作的時候,可以將物理Standby資料庫以READ ONLY模式開啟,如果資料庫中指定了Flashback Area的話,甚至還可以被臨時性的置為READ WRITE模式,操作完之後再透過Flashback Database特性恢復回READ WRITE前的狀態,以便繼續接收Primary端傳送的REDO並應用。

REDO應用。物理Standby透過REDO應用來保持與Primary資料庫的一致性,所謂的REDO應用,實質是透過Oracle的恢復機制,應用歸檔檔案(或Standby Redologs檔案)中的REDO資料。恢復操作屬於塊對塊的應用。如果正在執行REDO應用的操作,Oracle資料庫就不能被Open。

READ ONLY模式開啟。以READ ONLY模式開啟後,可以在Standby資料庫執行查詢或備份等操作(變相減輕Primary資料庫壓力)。此時Standby資料庫仍然能夠繼續接收Primary資料庫傳送的REDO資料,不過並不會應用,直到Standby資料庫重新恢復REDO應用。

也就是說在READ ONLY模式下不能執行REDO應用,REDO應用時資料庫肯定處於未開啟狀態。如果需要的話,你可以在兩種狀態間轉換,如先應用REDO,然後將資料庫置為READ ONLY狀態,需要與Primary同步時再次執行REDO應用命令,切換回REDO應用狀態。呵呵,人生就是迴圈,資料庫也是一樣。

提 示: Oracle 11g版本中增強物理Standby的應用功能,在11g版本中,物理Standby可以在OPEN READ ONLY模式下繼續應用REDO資料,這就極大地提升了物理Standby資料庫的應用場合。

READ WRITE模式開啟。如果以READ WRITE模式開啟,那麼Standby資料庫將暫停從Primary資料庫接收REDO資料,並且暫時失去災難保護的功能。當然,以READ WRITE模式開啟也並非一無是處,如你可能需要臨時除錯一些資料,但又不方便在正式庫中操作,那就可以臨時將Standby資料庫置為READ WRITE模式,操作完之後將資料庫閃回到操作前的狀態(閃回之後,Data Guard會自動同步,不需要重建物理Standby,不過如果從另一個方向看,沒有啟動閃回,那就回不到READ WRITE前的狀態了)。

物理Standby特點如下:

(1)災難恢復及高可用性。物理Standby提供了一個健全、高效的災難恢復,以及高可用性的解決方案。更加易於管理switchover/failover角色轉換及在更短的計劃內或計劃外停機時間。

(2)資料保護。使用物理Standby資料庫,DG能夠確保即使面對無法預料的災害也能夠不丟失資料。前面也提到物理Standby是基於塊對塊的複製,因此與物件、語句無關,Primary資料庫上有什麼,物理Standby資料庫端也會有什麼。

(3)分擔Primary資料庫壓力。透過將一些備份任務、僅查詢的需求轉移到物理Standby資料庫,可以有效節省Primary資料庫的CPU及I/O資源。

(4)提升效能。物理Standby所使用的REDO應用技術使用最底層的恢復機制,這種機制能夠繞過SQL級程式碼層,因此效率最高。

2.邏輯Standby

邏輯Standby也要透過Primary資料庫(或其備份,或其複製庫,如物理Standby)建立,因此在建立之初與物理Standby資料庫類似。不過由於邏輯Standby透過SQL應用的方式應用REDO資料,因此邏輯Standby的物理檔案結構,甚至資料的邏輯結構都可以與Primary不一致。

與物理Standby不同,邏輯Standby正常情況下是以READ WRITE模式開啟,使用者可以在任何時候訪問邏輯Standby資料庫,就是說邏輯Standby是在OPEN狀態執行SQL應用。同樣有利也有弊,由於SQL應用自身特點,邏輯Standby對於某些資料型別及一些DDL/DML語句會有操作上的限制。可以在檢視DBA_LOGSTDBY_UNSUPPORTED 中檢視不支援的資料型別,如果使用了這種資料型別,則不能保證資料庫完全一致。

    邏輯Standby 的讀寫開啟可以使它做報表系統,這樣減輕系統的壓力。

除了上述物理Standby中提到的類似災難恢復、高可用性及資料保護等特點之外,邏輯Standby還有下列一些特點:

(1)有效地利用備機的硬體資源。除災難恢復外,邏輯Standby資料庫還可用於其他業務需求。如透過在Standby資料庫建立額外的索引、物化檢視等提高查詢效能並滿足特定業務需要;又如建立新的SCHEMA(該SCHEMA在Primary資料庫端並不存在),然後在這些SCHEMA中執行那些不適於在Primary資料庫端執行的DDL或者DML操作等。

(2)分擔Primary資料庫壓力。邏輯Standby資料庫可以在保持與Primary同步時仍然置於開啟狀態,這使得邏輯Standby資料庫能夠同時用於資料保護和報表操作,從而將主資料庫從報表和查詢任務中解脫出來,節約寶貴的 CPU和I/O資源。

(3)平滑升級。可以透過邏輯Standby來實現如跨版本升級,為資料庫打補丁等操作。應該說應用的空間很大,而帶來的風險卻很小(前提是如果你擁有足夠的技術實力。另外雖然物理Standby也能夠實現一些升級操作,但如果跨平臺的話恐怕就力不從心了,所以此項沒有作為物理Standby的特點列出),我個人認為這是一種值得可行的線上的滾動的平滑的升級方式,如果你的應用支援建立邏輯Standby的話。

二. Log應用服務(Log Apply Services)

Data Guard透過應用REDO維持Primary資料庫與各Standby資料庫之間的一致性,在後臺默默無聞地支撐著的就是傳說中的Log應用服務。Log應用服務又分以下兩種方式:

REDO應用:物理Standby資料庫專用,透過介質恢復的方式保持與Primary資料庫的同步。

SQL應用:邏輯Standby資料庫專用,核心是透過LogMiner分析出SQL語句在Standby端執行。

因此物理Standby在應用REDO資料時必須是MOUNT狀態,而邏輯Standby則是以READ WRITE模式開啟並應用REDO資料,不過被維護的物件預設處於只讀狀態,無法在邏輯Standby端直接修改。

7.1  Log應用服務配置選項

預設情況下,Log應用服務會等待單個歸檔檔案全部接收之後再啟動應用,如果Standby資料庫配置了Standby Redologs,就可以開啟實時應用(Real-Time Apply),這樣Data Guard就不需要再等待接收完歸檔檔案,只要RFS程式將REDO資料寫入Standby Redologs,即可透過MRP/LSP實時寫向Standby資料庫。

7.1.1.REDO資料實時應用

啟動實時應用的優勢在於,REDO資料不需要等待歸檔完成,接收到即可被應用,這樣執行角色切換時,操作能夠執行得更快,因為日誌是被即時應用的。

要啟動實時應用也簡單,前提是Standby資料庫端配置了Standby Redologs。

物理Standby要啟用實時應用,要在啟動REDO應用的語句後附加USING CURRENT LOGFIE子句,例如:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE ;

邏輯Standby要啟用實時應用,只需要在啟動REDO應用的語句後附加IMMEDIATE子句即可,例如:

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

7.1.2.REDO資料延遲應用

有實時就有延遲,某些情況下你可能不希望Standby資料庫與Primary太過同步,那就可以在Primary資料庫端傳送REDO資料的相應LOG_ARCHIVE_DEST_n引數中指定DELAY屬性(單位為分鐘,如果指定了DELAY屬性,但沒有指定值,則預設是30分鐘)。

注意:該屬性並不是說延遲傳送REDO資料到Standby,而是指明歸檔到Standby後,開始應用的時間。

例如:設定LOG_ARCHIVE_DEST_3的DELAY屬性為15分鐘:

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='SERVICE=DavePrimary ARCH VALID_ FOR=  

(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=Dave DELAY=15';

不過,如果DBA在啟動REDO應用時指定了實時應用,那麼即使在LOG_ ARCHIVE_DEST_n引數中指定了DELAY屬性,Standby資料庫也會忽略DELAY屬性。

另外,Standby端還可以在啟動REDO應用時,透過附加NODELAY子句的方式,取消延遲應用。

物理Standby可以透過下列語句取消延遲應用:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY;

邏輯Standby可以透過下列語句取消延遲應用:

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NODELAY;

一般設定延遲應用的需求都是基於容錯方面的考慮,如Primary資料庫端由於誤操作,資料被意外修改或刪除,只要Standby資料庫尚未應用這些修改,你就可以快速從Standby資料庫中恢復這部分資料。不過自Oracle從9i版本開始提供FLASHBACK特性之後,對於誤操作使用FLASHBACK特性進行恢復,顯然更加方便快捷,因此DELAY方式延遲應用已經非常少見了。

7.2  應用REDO資料到Standby資料庫

7.2.1.物理Standby應用REDO資料

物理Standby啟動REDO應用,資料庫要處於MOUNT狀態或是OPEN READ ONLY狀態,啟動REDO應用的命令相信大家已經非常熟悉了。

前臺應用:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;

語句執行完成後,不會將控制權返回到命令列視窗,除非你手動中止應用。在這種情況下如果還需要對資料庫進行操作,只能新開一個命令列連線,在Oracle 8i剛推出Standby特性時(那時不叫Data Guard),只提供了這種方式。

後臺應用:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

這是現在比較通用的方式,語句執行完後,控制權自動返回到當前的命令列模式,REDO應用以後臺程式執行。

啟動實時應用,附加USING CURRENT LOGFILE子句即可:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;

如果要停止REDO應用,執行下列語句即可:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

7.2.2.邏輯Standby應用REDO資料

SQL應用的原理是將接收到的REDO資料轉換成SQL語句在邏輯Standby資料庫端執行,因此邏輯Standby需要啟動至OPEN狀態。

(1)啟動SQL應用。邏輯Standby資料庫啟動SQL應用沒有前、後臺執行之說,語句執行完之後,控制權就會自動返回當前命令列視窗。

要啟動SQL應用,直接執行下列語句即可:

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;

如果要啟動實時應用,附加IMMEDIATE子句即可,例如:

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
(2)停止SQL應用,如:

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;

由於是執行SQL語句的方式應用REDO資料,因此上述語句的執行需要等待當前執行的SQL觸發的事務結束,才能真正停止REDO應用的狀態。

如果不考慮事務執行情況,馬上停止REDO應用,可以透過下列的語句來完成:

SQL> ALTER DATABASE ABORT LOGICAL STANDBY APPLY;

注: 整理自 張曉明《大話Oracle RAC》和 李丙洋《塗抹Oracle》

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

相關文章