一、DataGuard 工作原理
Data Gurad 通過冗余數據來提供數據保護,Data Gurad 通過日志同步機制保證冗余數據和主數之前的同步,這種同步可以是實時,延時,同步,異步多種形式。Data Gurad 常用於異地容災和小企業的高可用性方案,雖然可以在Standby 機器上執行只讀查詢,從而分散Primary 數據庫的性能壓力,但是Data Gurad 決不是性能解決方案。
Stream 是以Oracle Advanced Queue為基礎實現的數據同步,提供了多種級別的靈活配置,並且Oracle 提供了豐富的API等開發支持,Stream 更適用在應用層面的數據共享。
在Data Gurad 環境中,至少有兩個數據庫,一個處於Open 狀態對外提供服務,這個數據庫叫作Primary Database。第二個處於恢復狀態,叫作Standby Database。運行時primary Database 對外提供服務,用戶在Primary Database 上進行操作,操作被記錄在聯機日志和歸檔日志中,這些日志通過網絡傳遞給Standby Database。這個日志會在Standby Database 上重演,從而實現Primary Database 和Standby Database 的數據同步。
Oracle Data Gurad 對這一過程進一步的優化設計,使得日志的傳遞,恢復工作更加自動化,智能化,並且提供一系列參數和命令簡化了DBA工作。
如果是可預見因素需要關閉Primary Database,比如軟硬件升級,可以把Standby Database 切換為Primary Database 繼續對外服務,這樣即減少了服務停止時間,並且數據不會丟失。如果異常原因導致Primary Database 不可用,也可以把Standby Database 強制切換為Primary Database繼續對外服務,這時數據損失成都和配置的數據保護級別有關系。因此Primary 和Standby 只是一個角色概念,並不固定在某個數據庫中。

DG架構可以按照功能分成3個部分:
DataGuard 數據保護模式
Data Guard 允許定義3鍾數據保護模式,分別是最大保護(Maximum Protection),最大可用(Maximum Availability)和最大性能(Maximum Performance)。
1. 最大保護(Maximum Protection)
這種模式能夠確保絕無數據丟失。要實現這一步當然是有代價的,它要求所有的事務在提交前其REDO不僅被寫入到本地的Online Redologs,還要同時寫入到Standby數據庫的Standby Redologs,並確認REDO數據至少在一個Standby數據庫中可用(如果有多個的話),然后才會在Primary數據庫上提交。如果出現了什么故障導致Standby數據庫不可用的話(比如網絡中斷),Primary數據庫會被Shutdown,以防止數據丟失。
使用這種方式要求Standby Database 必須配置Standby Redo Log,而Primary Database必須使用LGWR,SYNC,AFFIRM 方式歸檔到Standby Database.
2. 最高可用性(Maximum availability)
這種模式在不影響Primary數據庫可用前提下,提供最高級別的數據保護策略。其實現方式與最大保護模式類似,也是要求本地事務在提交前必須至少寫入一台Standby數據庫的Standby Redologs中,不過與最大保護模式不同的是,如果出現故障導致Standby數據庫無法訪問,Primary數據庫並不會被Shutdown,而是自動轉為最高性能模式,等Standby數據庫恢復正常之后,Primary數據庫又會自動轉換成最高可用性模式。
這種方式雖然會盡量避免數據丟失,但不能絕對保證數據完全一致。這種方式要求Standby Database 必須配置Standby Redo Log,而Primary Database必須使用LGWR,SYNC,AFFIRM 方式歸檔到Standby Database.
3. 最高性能(Maximum performance)
缺省模式。這種模式在不影響Primary數據庫性能前提下,提供最高級別的數據保護策略。事務可以隨時提交,當前Primary數據庫的REDO數據至少需要寫入一個Standby數據庫,不過這種寫入可以是不同步的。如果網絡條件理想的話,這種模式能夠提供類似最高可用性的數據保護,而僅對Primary數據庫的性能有輕微影響。這也是創建Standby數據庫時,系統的默認保護模式。
這種方式可以使用LGWR ASYNC 或者 ARCH 進程實現,Standby Database也不要求使用Standby Redo Log。
二、搭建環境
| 名稱 | 主庫 | 備庫 |
| 主機名 | oracle11g | oracle11gstandby |
| 操作系統 | CentOS release 6.10 (Final) | CentOS release 6.10 (Final) |
| IP | 172.16.8.10 | 172.16.8.11 |
| ORACLE_BASE | /data/oracle/app/oracle | /data/oracle/app/oracle |
| ORACLE_HOME | /data/oracle/app/oracle/product/11.2.0/db_1 | /data/oracle/app/oracle/product/11.2.0/db_1 |
| ORACLE_SID | orcl | orcl |
| 歸檔模式 | 是 | 否 |
| 數據庫安裝 | 安裝數據庫軟件,創建監聽,建庫 | 安裝數據庫軟件,創建監聽,不建庫 |
首先設置主備服務器時間同步參考:Linux修改時間方法總結
三、主庫配置
1、開啟歸檔模式,參考:oracle開啟關閉歸檔以及歸檔空間滿的處理方法總結
2、開啟強制日志模式:
alter database force logging;
查看
SQL> select name,log_mode,force_logging from v$database; NAME LOG_MODE FOR --------- ------------ --- ORCL ARCHIVELOG YES
3、創建standby redolog日志組:
原則:
1:standby redo log的文件大小與primary 數據庫online redo log 文件大小相同 2:standby redo log日志文件組的個數依照下面的原則進行計算: Standby redo log組數公式>=(每個instance日志組個數+1)*instance個數 假如只有一個節點,這個節點有三組redolog, 所以Standby redo log組數>=(3+1)*1 == 4 所以至少需要創建4組Standby redo log
查看當前線程與日志組的對應關系及日志組的大小:
SQL> select thread#,group#,bytes/1024/1024 from v$log; THREAD# GROUP# BYTES/1024/1024 ---------- ---------- --------------- 1 1 50 1 2 50 1 3 50
如上,這里有三組redo log,所以至少需要創建4組Standby redo log,大小均為50M:
alter database add standby logfile group 4 ('/data/oracle/app/oracle/oradata/archivelog/redo_dg_04.log') size 50M; alter database add standby logfile group 5 ('/data/oracle/app/oracle/oradata/archivelog/redo_dg_05.log') size 50M; alter database add standby logfile group 6 ('/data/oracle/app/oracle/oradata/archivelog/redo_dg_06.log') size 50M; alter database add standby logfile group 7 ('/data/oracle/app/oracle/oradata/archivelog/redo_dg_07.log') size 50M;
若刪除組:
alter database drop standby logfile group x;
查看standy日志組的信息:
SQL> select group#,sequence#,status, bytes/1024/1024 from v$standby_log; GROUP# SEQUENCE# STATUS BYTES/1024/1024 ---------- ---------- ---------- --------------- 4 0 UNASSIGNED 50 5 0 UNASSIGNED 50 6 0 UNASSIGNED 50 7 0 UNASSIGNED 50
4、創建主庫密碼文件
su - oracle orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle force=y
5、配置spfile文件:
查看spfile文件路徑:
SQL> show parameter spfile; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /u01/app/oracle/product/11.2.0 /dbhome_1/dbs/spfileorcl.ora
用spfile創建一個pfile,用於修改:
create pfile='/tmp/initorcl.ora' from spfile;
修改pfile文件
vim /tmp/initorcl.ora
orcl.__db_cache_size=637534208
orcl.__java_pool_size=16777216
orcl.__large_pool_size=33554432
orcl.__oracle_base=’/u01/app/oracle’
orcl.__pga_aggregate_target=671088640
orcl.__sga_target=989855744
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=268435456
orcl.__streams_pool_size=16777216
*.audit_file_dest=’/u01/app/oracle/admin/orcl/adump’
*.audit_trail=’db’
*.compatible=’11.2.0.4.0′
*.control_files=’/u01/app/oracle/oradata/orcl/control01.ctl’,’/u01/app/oracle/fast_recovery_area/orcl/control02.ctl’
*.db_block_size=8192
*.db_domain=”
*.db_name=’orcl’
*.db_recovery_file_dest=’/u01/app/oracle/fast_recovery_area’
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest=’/u01/app/oracle’
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)’
*.memory_target=1653604352
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile=’EXCLUSIVE’
*.undo_tablespace=’UNDOTBS1′
*.db_unique_name=’orclpr’
*.fal_client=’orclpr’
*.fal_server=’orcldg’
*.standby_file_management=’AUTO’
*.log_archive_config=’DG_CONFIG=(orclpr,orcldg)’
*.log_archive_dest_1=’location=/u01/app/oracle/oradata/orcl/archivelog’
*.log_archive_dest_2=’SERVICE=orcldg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcldg’
*.log_archive_dest_state_1=’ENABLE’
*.log_archive_dest_state_2=’ENABLE’
復制pfile文件到spfile:
shutdown immediate; create spfile from pfile='/tmp/initorcl.ora'; startup;
主庫參數詳解:
保持同一個Data Guard中所有的DB_NAME相同 DB_NAME=ora11g 為一個數據庫指定一個唯一的名稱,該參數一經指定就不會發生改動除非DBA主動改動 DB_UNIQUE_NAME=ora11g_primary 初始化參數LOG_ARCHIVE_CONFIG用於控制發送歸檔日志到遠程位置、接收遠程歸檔日志,並指定Data Guard配置的惟一數據庫名,默認值為SEND,RECEIVE,NODG_CONFIG。 當設置該參數為SEND時,會激活發送歸檔日志到遠程位置;當設置該能數為NOSEND時,會禁止發送歸檔日志到遠程位置;當設置該參數為RECEIVE時,會激活接收遠程歸檔日志;當設置該參數 為NORECEIVE時,會禁止接收遠程歸檔日志;當設置該參數為DG_CONFIG時,可以最多指定9個惟一數據庫名;當設置該參數為NODG_CONFIG時,會禁止指定惟一數據庫名。 LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary ,ora11g_standby)' 指定本地歸檔的路徑 LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ora11g_primary' 指定遠端備庫的歸檔路徑 LOG_ARCHIVE_DEST_2='SERVICE=ora11g_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora11g_standby' LOG_ARCHIVE_DEST_n(從1到10)定義redo文件路徑。該參數必須通過location或service指定歸檔文件路徑。location表示本地路徑,service通常是net service name,即接收redo數據的 standby數據庫。 注意:每一個LOG_ARCHIVE_DEST_n都有一個對應的LOG_ARCHIVE_DEST_STATE_n參數,該參數擁有以下4個屬性值: ENABLE:默認值,表示允許傳輸服務 DEFER: 指定對應的log_archive_dest_n參數有效,但暫不使用 ALTERNATE:禁止傳輸,但是如果其他相關的目的地的連接通通失敗,則它將變成enable RESET:功能與DEFER類似,不過如果傳輸目的地之前有過錯誤,它會清除所有錯誤信息 LOG_ARCHIVE_DEST_STATE_1=ENABLE LOG_ARCHIVE_DEST_STATE_2=ENABLE 遠程登錄設置獨享模式(z注意保證主備庫密碼相同) REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE %s log sequence number %S log sequence number, zero filled %t thread number, RAC的節點中設有THREAD參數, 就是這個值了 %T thread number, zero filled ------其中這前4項是可以用在 9I 中的 %a activation ID %d database ID %r resetlogs ID that ensures unique names are constructed for the archived log files across multiple incarnations of the database Oracle 10g開始,log_archive_format初始化參數必須包含%s, %t 和 %r,以確保生成的歸檔重做日志名稱唯一。 (原因:10g能做穿越resetlog的恢復,所以要加%r.而9i的不能做穿越resetlog的恢復,所以沒有%r的參數) LOG_ARCHIVE_FORMAT=%t_%s_%r.arc 當Primary Database的某些日志沒有發送到Standby Database 這時候發生歸檔裂縫(Archive Gap) 缺失的日志就是裂縫(GAP)。Data Guard 能夠自動檢測,解決歸檔裂縫,不需要DBA的介入。這需要配置 FAL_CLIENT,FAL_SERVER這兩個參數(FAL:Fetch Archive Log) 從FAL這個名字可以看出,這個過程是 Standby Database 主動發起的取日志的過程,Standby Database 就是 FAL_CLIENT,它是從FAL_SERVER中取這些GAP。