Oracle Dataguard 基本原理

1、DATAGUARD原理

DATAGUARD是通過建立一個PRIMARY和STANDBY組來確立其參照關係。


STANDBY一旦創建,DATAGUARD就會通過將主數據庫(PRIMARY)的REDO傳遞給STANDBY數據庫,然後在STANDBY中應用REDO實現數據庫的同步。


有兩種類型的STANDBY:物理STANDBY和邏輯STANDBY

物理STANDBY提供與主數據庫完全一樣的拷貝(塊到塊),數據庫SCHEMA,包括索引都是一樣的。它是直接應用REDO實現同步的。

邏輯STANDBY則不是這樣,在邏輯STANDBY中,邏輯信息是相同的,但物理組織和數據結構可以不同,它和主庫保持同步的方法是將接收的REDO轉 換成SQL語句,然後在STANDBY上執行SQL語句。邏輯STANDBY除災難恢復外還有其它用途,比如用於用戶進行查詢和報表。


DATAGUARD包含三個服務(日誌傳輸、日誌應用、角色轉換)

日誌傳輸服務控制REDO數據的傳輸(傳輸日誌,實施數據庫保護模式)--------------STANDBY上通過起用RFS進程接收REDO數據。

日誌應用服務則一方面自動應用日誌,另一方面自動檢測STANDBY缺少的REDO,並從主數據庫或其它STANDBY中自動查詢出丟失的REDO。


DATAGUARD的幾種保護模式:最大保護,最大可用,最大性能

最大保護是指除非REDO在至少一個STANDBY中可用,否則事務不能提交。如果在某個STANDBY中不可用,則主數據庫的操作被停止。通常受制約比較多,在生產環境中不是很常用(性價比不好)。

最大可用是指如果STANDBY不可用,主數據庫仍然可以處理事務,只是在問題被糾正後,STANDBY和主數據庫進行再同步。這樣的一個問題是:當再同步之前有FAILOVER時,有些數據可能會丟失。

最大性能是指主數據庫的提交操作不等待STANDBY。PRIMARY和STANDBY鬆耦合,數據保護級別較低。


物理STANDBY可能的模式:只讀模式(OPEN READONLY)和恢復模式(MANANGED RECOVERY)


2、物理DATAGUARD實施簡要過程

主數據庫的準備工作:FORCE LOGGING,ENABLE ARCHIVING,一個本地歸檔目的地。

創建STANDBY數據庫:

a.關閉主庫,冷備份主庫數據文件、日誌文件和密碼文件,然後啓動主庫,在主庫上創建STANDBY的控制文件:alter database create standby controlfile as '文件名'

b.準備參數文件,將參數文件、備份的主庫文件和STANDBY控制文件拷貝到STANDBY系統。

需要更改的參數有:standby_archive_dest-----接收的歸檔日誌存放處

db_file_name_convert和log_file_name_convert-----僅當主庫和STANDBY庫在同一系統下時用

log_archive_dest_1-----本地歸檔目的地

log_archive_dest_2='service=standby'-----歸檔到STANDBY的目的地

standby_file_management=auto

remote_archive_enable=true

fal_server

fal_client

instance_name-----當主庫和STANDBY庫在同一系統下時該參數用於區分主庫

lock_name_space-----當主庫和STANDBY庫在同一系統下時指定STANDBY的實例名和INSTANCE_NAME相同

c.如果是WINDOWS系統,需要創建WINDOWS服務。

d.配置兩臺機器的tnsnames.ora,雙方都能tnsping通

e.在主庫和STANDBY庫上配置監聽

f.起用STANDBY系統上的死連接檢測:sqlnet.ora中設置sqlnet.expire_time=2

g.在STANDBY上創建SPFILE

h.啓動STANDBY:

startup nomount

alter database mount standby database

i.初始化日誌應用服務

alter database recover managed standby database disconnect from session;


3、DATAGUARD維護


a.日誌傳送服務

有些情況下,你可能需要在歸檔日誌和應用日誌之間有個時間間隔,此時可以通過在STANDBY上指定參數log_archive_dest_n中指定delay=minutes屬性。

STANDBY上的日誌應該與主庫上的日誌大小相同,另外STANDBY上的日誌組應該比主庫多,因爲這樣歸檔操作纔有時間完成。也就是RFS(日誌接 收)進程在使用STANDBY的日誌前,不用等待該日誌被歸檔。最簡單判斷日誌組是否夠的方法是查看警告日誌和RFS的TRACE文件。

增加STANDBY日誌文件的方法:

alter database 語句中使用add standby logfile子句。相關視圖v$standby_log,v$logfile

增加STANDBY日誌組的方法:

alter database add standby logfile group 10 ('文件名1','文件名2') size 100M對於多個 STANDBY共享歸檔日誌文件目的地,有些情況下需要指定log_archive_dest_n參數的dependency屬性,該屬性的作用是說明該目的地依賴於父目的地的成功歸檔。

參數log_archive_dest_n還可以指定reopen、max_failures、sync、async屬性。通過給該參數指定LGWR或者ARCH屬性以選擇是用LGWR還是ARCH進程傳送日誌。

用於日誌接收的幾個進程是:LGWR,ARCH,RFS,FAL。FAL進程用於解決日誌縫。

設置數據保護模式的語句爲:alter database set standby database to maximun(protection|availability|performance)


b.日誌應用服務

對於物理STANDBY,日誌應用服務涉及到下面幾個進程:RFS,ARC,MRP。MRP是管理恢復進程。

啓動STANDBY的恢復操作的幾個命令:alter database recover managed standby database(啓動前臺會話);alter database recover managed standby database disconnect from session(啓動後臺會話,也就是說會話可以繼續幹別的事情);alter database recover managed standby database cancel(停止日誌應用).

可以通過查詢視圖v$managed_standby查看日誌應用情況。


c.數據文件管理

當主庫新創建數據文件,可定義參數standby_file_management爲auto,讓standby也自動創建數據文件。如果主庫和 standby的數據文件的目錄結構不一樣,可以設定db_file_name_convert將主庫上的文件名轉換成standby上的文件名。如果 standby_file_management設爲auto,則不能在standby上重命名或創建數據文件、日誌文件。

每分鐘主庫會詢問standby是否有gap,該行爲被稱爲heartbeat.

可以查詢視圖v$archived_gap,如果發現有GAP,則可以從主庫上將日誌文件拷貝到standby,然後將相關文件註冊到standby,具體方法是:alter database register logfile '文件名'。當然也可以通過設置參數fal_server,fal_client,讓日誌應用服務自動處理gap問題。

對於STANDBY日誌應用服務,下面幾個視圖有助於監控:v$managed_standby,v$archived_dest_status,v$archived_log,v$log_status,v$dataguard_status.

可以設置參數log_archive_trace對歸檔進行不同級別的跟蹤。


d.角色轉換

ORACLE支持兩種形式的角色轉換----switchover和failover

switchover包含兩個步驟,首先主庫被轉換成STANDBY,然後STANDBY被轉換成主庫

switchover的準備工作:完成角色轉換需要改變的參數(必須改變所有STANDBY上的 log_archive_dest_n和log_archive_dest_state_n);確保主庫和所有STANDBY都有連接;確認沒有用戶連接 到數據庫;對於RAC環境確保只有一個實例是活動狀態;角色轉換之前,主庫實例應該是OPEN狀態,而STANDBY實例是MOUNT狀態,因爲這樣的 話,轉換過程中STANDBY數據庫也可以應用歸檔日誌,如果STANDBY爲READONLY,切換操作仍然可以進行,只是要花一點額外的時間;如果切 換操作包含邏輯STANDBY,那麼,主庫實例和STANDBY實例都必須爲OPEN狀態;將要轉換成主庫的STANDBY變成歸檔模式;取消在該 STANDBY庫上的日誌延遲。

switchover的步驟:在當前主庫上,首先確認可以執行switchover操作(select switchover_status from v$database,如果值爲TO STANDBY則可以切換,否則需要檢查當前DATAGUARD配置是否運行正常),然後將主庫切換爲STANDBY(執行ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;這樣原控制文件被備份並生成新的STANDBY控制文件,然後只要重新啓動該庫爲STANDBY模式就可以了);以上操作完成後,在原 STANDBY數據庫上,需要查詢原主庫的切換信息是否被目標STANDBY接收到(SELECT SWITCHOVER_STATUS FROM V$DATABASE;如果結果爲SWITCHOVER PENDING說明STANDBY切換爲PRIMARY是可行的,否則需要檢查DATAGUARD的配置是否運行正常),然後執行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;將STANDBY轉換成PRIMARY,並重新啓動該庫。這裏需要說明的是如果該庫在線重做日誌不存在,該切換語句會自動創建它們,然而 這樣一來,會花費很長的時間。因此ORACLE建議手工增加在線重做日誌。手工增加在線重做日誌的方法有兩種:第一種是將原主庫的日誌拷貝到原 STANDBY,並且定義參數log_file_name_convert,讓它將standby和新的日誌聯繫起來。第二種方法是DROP所有目標 STANDBY上存在的日誌,並且用命令ALTER DATABASE ADD STANDBY LOGFILE創建新的日誌。switchover的最後一步是將新生成的STANDBY轉換成恢復模式,並將新PRIMARY進行一次歸檔操作。


failover的準備工作:完成角色轉換需要改變的參數(必須改變所有STANDBY上的log_archive_dest_n和 log_archive_dest_state_n);確保主庫和所有STANDBY都有連接;對於RAC環境確保只有一個實例是活動狀態;如果要進行 failover操作的STANDBY當前運行於最大保護模式,則應該將它轉換成最大性能模式(通過命令ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;)


failover的步驟:首先發現並解決日誌GAP的問題,然後從其它庫中將日誌號高於本庫的日誌拷貝過來並應用這些日誌,如果你沒有手工註冊新的日誌,那麼可以執行下面的語句ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;否則需要執行的語句爲ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH SKIP STANDBY LOGFILE;接下來執行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;完成切換並重新啓動新的主庫,可能的話對主庫進行一次備份。


e.啓動STANDBY

STARTUP NOMOUNT;

ALTER DATABASE MOUNT STANDBY DATABASE;

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;


f.關閉STANDBY

首先確認是否處於恢復狀態:SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;

取消恢復操作:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SHUTDOWN IMMEDIATE;


g.讓standby運行於只讀訪問模式

啓動STANDBY爲只讀模式:

STARTUP NOMOUNT;

ALTER DATABASE MOUNT STANDBY DATABASE;

ALTER DATABASE OPEN READ ONLY;

將恢復模式的STANDBY轉換成read only模式:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

ALTER DATABASE OPEN READ ONLY;


h.讓STANDBY從READ ONLY轉變成恢復模式

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;


i.讓爲只讀模式的STANDBY執行排序操作應該注意的問題:

排序操作不能使用非臨時表空間,臨時表空間必須是本地管理的,並且只包含臨時文件

如果在創建STANDBY時主庫沒有臨時表空間,則需要在主庫上創建臨時表空間,並執行ALTER SYSTEM SWITCH LOGFILE;將redo傳給STANDBY。如果要給STANDBY的臨時表空間增加臨時文件,需要先將STANDBY轉換成READ ONLY模式,並執行命令ALTER TABLESPACE temp1 ADD TEMPFILE '/disk1/oracle/dbs/s_temp1.dbf' SIZE 10M REUSE;增加臨時文件。


j.可以通過對STANDBY的備份實現對數據庫的備份。


k.主庫上的操作和STANDBY的應對:

如果你執行ALTER DATABASE CLEAR UNARCHIVED LOGFILE或者打開數據庫時使用RESETLOGS,那麼必須重新創建STANDBY。

如果你在主庫上執行ALTER DATABASE ENABLE|DISABLE,如果你改變表空間的狀態,如果你設置了參數STANDBY_FILE_MANAGEMENT爲AUTO並創建表空間或者增加數據文件,則不需要對STANDBY進行操作。

如果你在主庫上刪除了表空間或者數據文件,你需要在STANDBY上等日誌應用後在操作系統上刪除相關數據文件。

如果你在主庫上重命名了數據文件,你也要在STANDBY上重命名(因爲是對控制文件的改變,所以沒有日誌傳過去,因此兩邊都要進行相同的操作)

如果你在主庫上改變了控制文件,你就要重新創建STANDBY控制文件或者重建STANDBY數據庫。

如果你在主庫上增加或刪除日誌文件,你也需要在STANDBY上進行同步變化。

具體方法爲:先取消恢復,如果STANDBY_FILE_MANAGEMENT爲AUTO,則改爲MANUAL,然後使用命令ALTER DATABASE ADD STANDBY LOGFILE 'prmy3.log' SIZE 100K;增加日誌文件或者用命令ALTER DATABASE DROP STANDBY LOGFILE 'prmy3.log'DROP掉日誌文件,最後恢復參數STANDBY_FILE_MANAGEMENT的值。

如果你在主庫上進行了nologging|unrecoverable等操作,則應該將包含這些變化的表空間拷貝到STANDBY。

如果你改變了主庫的參數文件,那麼你也應該改變STANDBY的參數文件。


l.監控進程

SELECT PROCESS, CLIENT_PROCESS, SEQUENCE#, STATUS FROM V$MANAGED_STANDBY;


m.監控恢復操作的進程

SELECT ARCHIVED_THREAD#, ARCHIVED_SEQ#, APPLIED_THREAD#, APPLIED_SEQ# FROM V$ARCHIVE_DEST_STATUS;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章