概述
Oracle Data Guard 是針對企業數據庫的最有效和最全面的數據可用性、數據保護和災難恢復解決方案。它提供管理、監視和自動化軟件基礎架構來創建和維護一個或多個同步備用數據庫,從而保護數據不受故障、災難、錯誤和損壞的影響。一台主數據庫最多可以配備9個備數據庫。
原理
一、創建DG的大致流程
a、主庫啟用歸檔與強制日志模式
b、主庫配置redo傳輸服務(即相關參數配置)
c、主庫及備庫配置監聽
d、為備庫創建目錄
e、配置備庫密碼文件及參數文件
f、復制數據文件,日志文件,備份控制文件到備庫
g、啟動備庫並校驗結果
二、演示創建物理備庫
1. 演示環境
主庫和備庫的系統版本和數據庫的版本是相同的
[oracle@Master orcl]$ cat /etc/issue Oracle Linux Server release 6.6 Kernel \r on an \m [oracle@oracle orcl]$ sqlplus -v SQL*Plus: Release 11.2.0.1.0 Production
2.開啟主庫啟用歸檔與強制日志模式
SQL> select name,log_mode from v$database; NAME LOG_MODE --------- ------------ ORCL ARCHIVELOG
SQL> select destination from v$archive_dest where destination is not null;
DESTINATION
--------------------------------------------------------------------------------
/u01/ARCHLOG/
SQL> alter database force logging; 數據庫已更改。
SQL> select FORCE_LOGGING from v$database;
FOR
---
YES
SQL> select database_role from v$database; DATABASE_ROLE ---------------- PRIMARY
3.為主庫添加standby redo log
-為主庫添加standby redo log,簡要描述一下standby redo log的作用
--實際上就是與主庫接收到的重做日志相對應,也就是說備庫調用RFS進程將從主庫接收到的重做日志按順序寫入到standby logfile
--在主庫創建standby logfile是便於發生角色轉換后備用
--sandby redo log創建原則:
--a)、確保standby redo log的大小與主庫online redo log的大小一致
--b)、如主庫為單實例數據庫:standby redo log組數=主庫日志組總數+1
--c)、如果主庫是RAC數據庫:standby redo log組數=(每線程的日志組數+1)*最大線程數
--d)、不建議復用standby redo log,避免增加額外的I/O以及延緩重做傳輸
這里主庫是3個重做日志組,所以建立4個standby redo log組
alter database add standby logfile group 11 ('/u01/orcl/onlinelog/redo11.log') size 50M, group 12 ('/u01/orcl/onlinelog/redo12.log') size 50M, group 13 ('/u01/orcl/onlinelog/redo13.log') size 50M, group 14 ('/u01/orcl/onlinelog/redo14.log') size 50M;
--- 刪除也同樣簡單: SQL> alter database drop standby logfile group 11;
4. 修改主機參數文件
--Add below item when DB acts as primary role alter system set db_unique_name='orcl' scope=spfile; alter system set log_archive_config='DG_CONFIG=(orcl,standby)'; alter system set log_archive_dest_1='LOCATION=/u01/ARCHLOG db_unique_name=orcl valid_for=(ALL_LOGFILES,ALL_ROLES)'; alter system set log_archive_dest_2='SERVICE=standby ASYNC db_unique_name=standby valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'; alter system set log_archive_dest_state_1=enable; alter system set log_archive_dest_state_2=enable; alter system set log_archive_max_processes=4; alter system set remote_login_passwordfile='EXCLUSIVE' scope=spfile; --Add below item when DB turn to standby role alter system set db_file_name_convert='standby','orcl' scope=spfile; alter system set log_file_name_convert='standby','orcl' scope=spfile; alter system set standby_file_management='AUTO'; alter system set fal_server='standby'; alter system set fal_client='orcl';
保存成pfile
SQL> create pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora' from spfile;
查看
orcl.__db_cache_size=201326592 orcl.__java_pool_size=4194304 orcl.__large_pool_size=4194304 orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=281018368 orcl.__sga_target=528482304 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=306184192 orcl.__streams_pool_size=0 *._allow_resetlogs_corruption=TRUE *.audit_file_dest='/u01/app/oracle/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/flash_recovery_area/orcl/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_file_name_convert='standby','orcl' *.db_name='orcl' *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area' *.db_recovery_file_dest_size=4070572032 *.db_unique_name='orcl' *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.fal_client='orcl' *.fal_server='standby' *.log_archive_config='DG_CONFIG=(orcl,standby)' *.log_archive_dest_1='LOCATION=/u01/ARCHLOG db_unique_name=orcl valid_for=(ALL_LOGFILES,ALL_ROLES)' *.log_archive_dest_2='SERVICE=standby ASYNC db_unique_name=standby valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)' *.log_archive_dest_3=' ' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.log_archive_max_processes=4 *.log_archive_min_succeed_dest=1 *.log_file_name_convert='standby','orcl' *.memory_target=806354944 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.standby_file_management='AUTO' *.undo_tablespace='UNDOTBS1'
5.備份控制文件
SQL> alter database create standby controlfile as '/u03/backup/control01.ctl';
6.配置主庫監聽
- -為主庫和備庫配置監聽,整個DG的redo傳輸服務,都依賴於Oracle Net,因此需要為主備庫配置監聽
- --配置方法多種多樣,可用netmgr,netca,以及直接編輯listener.ora 與tnsnames.ora文件
- --下面是配置之后的listener.ora 與tnsnames.ora文件內容
tnsnames.ora
ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.81)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) standby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.82)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = standby) ) )
listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER= (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME= orcl) (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1) (SID_NAME=orcl) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = Master)(PORT = 1521)) ) )
7.關閉服務
SQL> shutdown immediate;
8.pfile,口令文件, 控制文件到 standby
--由於要求主庫與備庫sys使用相同的密碼,在此處,我們直接復制了主庫的密碼文件到備庫
[oracle@Master dbs]$ scp /u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl oracle@192.168.0.82:/u01/app/oracle/product/11.2.0/db_1/dbs/orapwstandby [oracle@Master dbs]$ scp /u03/backup/control01.ctl oracle@192.168.0.82:/u01/app/oracle/oradata/standby/
[oracle@Master dbs]$ scp /u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora oracle@192.168.0.82:/u01/app/oracle/product/11.2.0/db_1/dbs/initstandby.ora
9.傳輸數據文件和重做日志文件
--對於從主庫克隆standby有多種方法,而且Oracle 11g支持從ative database直接克隆數據庫
--此次操作直接使用冷備方式將數據及日志文件復制到備庫目錄
[oracle@Master orcl]$ scp /u01/app/oracle/oradata/orcl/*dbf oracle@192.168.0.82:/u01/app/oracle/oradata/standby/ [oracle@Master orcl]$ scp /u01/orcl/onlinelog/redo* oracle@192.168.0.82:/u01/standby/onlinelog/ [oracle@Master orcl]$ scp /u02/orcl/onlinelog/redo* oracle@192.168.0.82:/u02/standby/onlinelog/ [oracle@Master orcl]$ scp /u03/orcl/onlinelog/redo* oracle@192.168.0.82:/u03/standby/onlinelog/
standby的配置
1、修改oracle環境變量
export ORACLE_BASE=/u01/app/oracle export ORACLE_SID=standby export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1 export PATH=$PATH:$ORACLE_HOME/bin #export LANG="zh_CN.UTF-8" #export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" #export NLS_LANG="american_america.AL32UTF8" export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'
2.備用服務器相關目錄的創建
[oracle@Salve ~]$ mkdir -p /u01/app/oracle/admin/standby/adump [oracle@Salve ~]$mkdir -p /u01/app/oracle/flash_recovery_area/standby
3.修改初始化參數文件
standby.__large_pool_size=4194304 standby.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment standby.__pga_aggregate_target=281018368 standby.__sga_target=528482304 standby.__shared_io_pool_size=0 standby.__shared_pool_size=306184192 standby.__streams_pool_size=0 *._allow_resetlogs_corruption=TRUE *.audit_file_dest='/u01/app/oracle/admin/standby/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/u01/app/oracle/oradata/standby/control01.ctl','/u01/app/oracle/flash_recovery_area/standby/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_file_name_convert='orcl','standby' *.db_name='orcl' *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area' *.db_recovery_file_dest_size=4070572032 *.db_unique_name='standby' *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.fal_client='standby' *.fal_server='orcl' *.log_archive_config='DG_CONFIG=(orcl,standby)' *.log_archive_dest_1='LOCATION=/u01/ARCHLOG db_unique_name=standby valid_for=(ALL_LOGFILES,ALL_ROLES)' *.log_archive_dest_2='SERVICE=orcl ASYNC db_unique_name=orcl valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)' *.log_archive_dest_3=' ' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.log_archive_max_processes=4 *.log_archive_min_succeed_dest=1 *.log_file_name_convert='orcl','standby' *.memory_target=806354944 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.standby_file_management='AUTO' *.undo_tablespace='UNDOTBS1'
4.修改備用服務器tns.ora listen.ora信息
vim /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
orcl = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.81)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) standby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.82)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = standby) ) ) EXTPROC_CONNECTION_DATA= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL =TPC)(KEY = EXTPROCO)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) )
vi /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME= standby)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
(SID_NAME=standby)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = Salve)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
5.重啟監聽
[oracle@Salve ~]$ lsnrctl stop [oracle@Salve ~]$ lsnrctl start
6.測試監聽是否正常
[oracle@Master admin]$ sqlplus sys/oracle@standby as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 22:05:49 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. 已連接到空閑例程。 SQL> exit 已斷開連接 [oracle@Master admin]$ sqlplus sys/oracle@orcl as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 22:05:57 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. 已連接到空閑例程。
7.用創建的備份服務器參數啟動數據庫到mount
SQL> startup mount pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initstandby.ora' ORACLE 例程已經啟動。 Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 595593528 bytes Database Buffers 201326592 bytes Redo Buffers 6737920 bytes 數據庫裝載完畢。
8.創建spfile文件
SQL> create spfile from pfile; 文件已創建。 SQL> show parameter instance_name NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ instance_name string standby
9.在備庫端啟動redo apply
SQL> alter database recover managed standby database disconnect from session; 數據庫已更改。
10.判斷配置是否成功,主要通過查看主數據庫歸檔日志的sequence是否一致
在主庫上執行
SQL> alter system switch logfile; 系統已更改。 SQL> select max(sequence#) from v$archived_log; MAX(SEQUENCE#) -------------- 59 SQL> select switchover_status from v$database; ###查看主庫DG狀態 SWITCHOVER_STATUS -------------------- TO STANDBY
查詢歸檔日志是否應用(應用需要點時間),確定應用后在從庫上查詢
SQL> select sequence#,applied from v$archived_log where applied='YES' order by sequence#; SEQUENCE# APPLIED ---------- --------- 59 YES
在從庫上執行
SQL> select max(sequence#) from v$archived_log; MAX(SEQUENCE#) -------------- 59
11.日志測試
在主庫上執行
SQL> conn scott/tiger 已連接。 SQL> create table standby(test int); 表已創建。 SQL> insert into standby values(1); 已創建 1 行。 SQL> commit; 提交完成。 SQL> conn / as sysdba; 已連接。 SQL> alter system switch logfile; 系統已更改。
測試庫上測試數據是否同步過來
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 數據庫已更改。 SQL> alter database open read only; 數據庫已更改。 SQL> conn scott/tiger 已連接。 SQL> select * from standby; TEST ---------- 1
可以看出數據同步成功,大功告成。
參數配置詳解:
DB_NAME:
該參數用於定義DG中所有有效的DB_UNIQUE_NAME名字的列表,最多可以指定9個,為DG提供安全性檢查。建議始終配置該參數。 主庫與備庫端采用相同設置。
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary ,ora11g_standby)'
LOG_ARCHIVE_DEST_n:
指定本地歸檔的路徑,主庫和配庫的配置不相同,location表示本地路徑,service表示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_STATE_n:
它對應於LOG_ARCHIVE_DEST_n,有4個參數:
ENABLE:默認值,表示允許傳輸服務
DEFER: 指定對應的log_archive_dest_n參數有效,但暫不使用
ALTERNATE:禁止傳輸,但是如果其他相關的目的地的連接通通失敗,則它將變成enable
RESET:功能與DEFER類似,不過如果傳輸目的地之前有過錯誤,它會清除所有錯誤信息
遠程登錄設置獨享模式,主備庫配置相同
remote_login_passwordfile='EXCLUSIVE'
LOG_ARCHIVE_FORMAT
歸檔日志的格式:
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_SERVER
FAL_SERVER(Fetch Archive Log) = Oracle_Net_service_name,主庫和備庫設置是不一樣的
該參數定義為存在於備用服務器的TNS名稱列表(指向主數據庫和任意備用數據庫)。該參數僅物理備用數據庫有效。
主要是用於輪詢查找丟失的重做日志間隔,並處理應用進程發布的任意未定間隔請求。
當物理備用數據庫遇到重做間隔時無法連接到主庫,也可從其它備庫提取日志。
主庫:FAL_SERVER=ora11g_standby (主庫進行設置,是為了在切換后主備角色互換)
備庫:FAL_SERVER=ora11g_primary
FAL_CLIENT
日志間隔請求着客戶端名稱,為TNSNAMES名稱。FAL_SERVER上的歸檔進程可以反向連接請求者。該參數僅物理備用數據庫有效。
該參數的值必須在主庫的TNSNAMES文件中定義。
主庫:*.FAL_CLIENT=ora11g_primary (主庫進行設置,是為了在切換后主備角色互換)
備庫:*.FAL_CLIENT=ora11g_standby
STANDBY_FILE_MANAGEMENT = {AUTO | MANUAL}
該參數僅適用於物理備用數據庫。建議將其值設置為AUTO,這樣當主庫添加或刪除數據文件時,會自動在備庫上完成相應的更改。
主庫:*.STANDBY_FILE_MANAGEMENT=AUTO (主庫進行設置,是為了在切換后主備角色互換)
備庫:*.STANDBY_FILE_MANAGEMENT=AUTO