Oracle11g搭建DataGuard及主備切換方法總結【親測可用】


 

一、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個部分:

1) 日志發送(Redo Send)
2) 日志接收(Redo Receive)
3) 日志應用(Redo Apply)

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日志組:

原則:

1standby redo log的文件大小與primary 數據庫online redo log 文件大小相同 2standby redo log日志文件組的個數依照下面的原則進行計算: Standby redo log組數公式>=(每個instance日志組個數+1)*instance個數 假如只有一個節點,這個節點有三組redolog 所以Standby redo log組數>=(3+1)*1 == 4 所以至少需要創建4Standby 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配置的惟一數據庫名,默認值為SENDRECEIVENODG_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(從110)定義redo文件路徑。該參數必須通過locationservice指定歸檔文件路徑。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中取這些GAP10g中,這個FAL_SERVER可以是Primary Database,也可以是其他的 Standby Database   FAL_CLIENTFAL_SERVER兩個參數都是Oracle Net NameFAL_CLIENT通過網絡向FAL_SERVER發送請求, FAL_SERVER通過網絡向FAL_CLIENT發送缺失的日志 但是這兩個連接不一定是一個連接。因此 FAL_CLIENTFAL_SERVER發送請求時,會攜帶FAL_CLIENT的參數 值,用來告訴FAL_SERVER應該向哪里發送缺少的日志。這個參數也是一個Oracle Net Name 這個NameFAL_SERVER 上定義的,用來指向FAL_CLIENT FAL_SERVER=ora11g_standby FAL_CLIENT=ora11g_primary   如果Primary數據庫數據文件發生修改(如新建)則在standby數據庫作相應修改 設為AUTO表示自動管理。設為MANUAL表示需要手工管理(注:重命名修改 是不會傳到standby數據庫) STANDBY_FILE_MANAGEMENT=AUTO

5、修改監聽文件,添加靜態監聽:

vi $ORACLE_HOME/network/admin/listener.ora
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.10)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = orcl) ) ) ADR_BASE_LISTENER = /u01/app/oracle SAVE_CONFIG_ON_STOP_LISTENER = ON

重啟監聽服務:

lsnrctl stop
lsnrctl start   lsnrctl reload

6、編輯網絡服務名配置文件tnsnames.ora:

vi $ORACLE_HOME/network/admin/tnsnames.ora
orcldg = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.11)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) orclpr = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )

tnsping測試:

[oracle@oracle11g dbs]$ tnsping orclpr TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 11-4 -2019 14:30:09 Copyright (c) 1997, 2013, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))) OK (10 msec) [oracle@oracle11g dbs]$ tnsping orcldg TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 11-4 -2019 14:30:11 Copyright (c) 1997, 2013, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.11)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))) OK (0 msec) [oracle@oracle11g dbs]$

四、備庫配置

1、將主庫中的密碼文件、pfile文件、監聽文件復制到備庫中:

cd /data/oracle/app/oracle/product/11.2.0/dbhome_1/dbs scp orapworcl 172.16.8.11:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/ scp /tmp/initorcl.ora 172.16.8.11:/tmp/ cd /data/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin scp listener.ora 172.16.8.11:/data/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/ scp tnsnames.ora 172.16.8.11:/data/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/

2、配置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=’orcldg’
*.fal_client=’orcldg’
*.fal_server=’orclpr’
*.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=orclpr LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orclpr’
*.log_archive_dest_state_1=’ENABLE’
*.log_archive_dest_state_2=’ENABLE’

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='orcldg' *.fal_client='orcldg' *.fal_server='orclpr' *.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=orclpr LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orclpr' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE'

復制pfile文件到spfile:

create spfile from pfile='/tmp/initorcl.ora'; shutdown immediate; startup nomount;

3、修改監聽文件:

vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = /data/oracle/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = orcl) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.11)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /data/oracle/app/oracle

重啟監聽:

lsnrctl stop
lsnrctl start

4、tnsping測試:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM