天天看點

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為隻讀模式:

ALTER DATABASE OPEN READ ONLY;

将恢複模式的STANDBY轉換成read only模式:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

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

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;