Oracle DataGuard是Oracle自帶的數據同步功能,基本原理是將日誌文件從原數據庫傳輸到目標數據庫,而後在目標數據庫上應用這些日誌文件,從而使目標數據庫與源數據庫保持同步,是一種數據庫級別的高可用性方案。
DataGuard能夠提供Oracle數據庫的冗災、數據保護、故障恢復等,實現數據庫快速切換與災難性恢復。在生產數據庫的保證"事務一致性"時,使用生產庫的物理全備份建立備庫,備庫會經過生產庫傳輸過來的歸檔日誌或重作條目自動維護備用數據庫。
DataGuard數據同步技術有如下優點:
1) Oracle數據庫自身內置的功能,與每一個Oracle新版本的新特性都徹底兼容,且不須要另外付費。
2) 配置管理較簡單,不須要熟悉其餘第三方的軟件產品。
3) 物理Standby數據庫支持任何類型的數據對象和數據類型;
4) 邏輯Standby數據庫處於打開狀態,能夠在保持數據同步的同時執行查詢等操做。
5) 在最大保護模式下,可確保數據的零丟失。
1、架構
Oracle DataGuard由一個primary數據庫(生產數據庫)及一個或多個standby數據庫(最多9個)組成。組成Data Guard的數據庫經過Oracle Net鏈接,而且有能夠分佈於不一樣地域。只要各庫之間能夠相互通訊,它們的物理位置並無什麼限制,不受操做系統的限制。
1.Primary 數據庫
DataGuard包含一個primary數據庫即被大部分應用訪問的生產數據庫,該庫既能夠是 單實例數據庫,也能夠是RAC。
2.Standby 數據庫
Standby數據庫是primary數據庫的複製(事務上一致)。在同一個Data Guard中能夠最多建立9個standby數據庫。一旦建立完成,Data Guard經過應用primary數據庫的redo自動維護每個standby數據庫。Standby數據庫一樣便可以是單實例數據庫,也能夠是RAC結構。
2、Standby數據庫類型
Standby數據庫一般分兩類:邏輯standby和物理standby。 邏輯standby
邏輯standby是經過接收primary數據庫的redo log並轉換成sql語句,而後在standby數據庫上執行SQL語句實現同步。 物理standby
物理standby是經過接收並應用primary數據庫的redo log以介質恢復的方式實現同步,不只文件的物理結構相同,連塊在磁盤上的存儲位置都是如出一轍的。
3、服務
重作傳輸服務(Redo Transport Services)
控制redo數據的傳輸到一個或多個歸檔目的地。 日誌應用服務(Log Apply Services)
應用redo數據到standby數據庫,以保持與primary數據庫的事務一致。redo數據便可以從standby數據庫的歸檔文件讀取,也可直接應用備用日誌文件讀取。 角色轉換服務(Role Transitions)
DataGuard中有兩種角色:primary和standby。角色轉換就是讓數據庫在這兩個角色中切換, 切換分兩種:switchover和failover
1)switchover:轉換primary數據庫與standby數據庫。switchover能夠確保不會丟失數據。
2)failover:當primary數據庫出現故障而且不能被及時恢復時,會調用failover將一個standby數據庫轉換爲新的primary數據庫。在最大保護模式或最高可用性模式下,failover能夠保證不會丟失數據。
4、保護模式
1.最大保護
這種模式是默認的數據保護模式,在不影響源數據庫性能的條件下提供儘量高的數
據保護等級。在該種模式下,一旦日誌數據寫到源數據庫的聯機日誌文件,事務便可提交,沒必要等待日誌寫到目標數據庫,若是網絡帶寬充足,該種模式可提供相似於最大可用模式的數據保護等級。
2.最大可用性
這種模式和"最大保護"基本上差很少。正常狀況下,主備庫之間是同步的。
當網絡或者備庫出現問題時,不會影響到主庫的當機,主庫會自動轉換庫"最大性能"模式,等待備庫可用時,將歸檔傳輸到備庫作恢復。
3.最大性能
這種模式保證主庫性能最大化,主備庫之間數據是異步傳輸的。即,主備日誌歸檔以
後纔會傳輸到備用庫
一、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)
二、物理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;
三、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;