Oracle Data Guard是由Oracle公司提供的一套高可用性數據庫解決方案。Data Guard能夠確保企業數據的高可用性,並實現數據保護和災難恢復。Data Guard提供了一套綜合建立、維護、管理和監視一個或多個備用數據庫的服務,使得用戶可以輕鬆地應對Oracle生產數據庫的災難發生和數據損壞。Data Guard將維護的備用數據庫保持爲和主數據庫(生產數據庫)的數據和事物的一致性,當主數據庫意外當機或者不可用時,Data Guard能夠將任何一臺備用數據庫切換爲主數據庫,從而最大限度的減小數據庫服務器當機的時間。java
Data Guard原理
sql
利用重作日誌實現從生產庫(主)到備用數據庫的實時備份(備庫經過應用主庫上的數據變化來保持數據的同步),主備服務器能夠互相切換(即將其中一臺提高爲主服務器)。數據庫
Data Guard架構bash
Primary Database(主數據庫): 即一個生產數據庫,在Data Guard中其主要角色的做用,是大多數應用程序訪問的數據庫。服務器
Standby Database(備數據庫): Standby數據庫是主數據的備份副本,備用數據庫能夠是物理備用數據庫或邏輯備用數據庫,即如下兩種類型session
- Physical standby database: 物理備用數據庫(使用Redo Apply技術),主要用於災難恢復。
- Logical standby database: 邏輯備用數據庫(使用SQL Apply技術),除了用於災難恢復外,還能夠提供數據查詢、分析等服務架構
Data Guard數據保護模式
oracle
Data Guard能夠運行以三種不一樣的模式運行。
Maximum protection(最大保護): 確保主數據庫發生故障時不會發生數據丟失。在全部重作數據寫入到本地在線重作日誌和至少一個備用數據庫的備用重作日誌以前,不容許事務的提交。若是因爲故障不能將主數據庫的重作日誌寫入到至少一個備用數據庫的備用重作日誌,則主數據庫將關閉。
Maximum availability(最高可用性): 提供最高級別的數據保護,而不會影響主數據庫的可用性。與最大保護模式同樣,在恢復事物所需的重作日誌寫入本地聯機重作日誌和至少一個備用數據庫的備用重作日誌以前,事務不會提交。最大保護模式不一樣的是,在主數據庫發生故障時不會將其重作日誌寫入備用數據庫的重作日誌。相反,主數據庫以最大的性能模式下運行。
Maximum performance(最高性能): 默認模式。提供最高級別的數據保護,但不影響主數據庫的性能。app
環境準備
在個人測試環境中,我準備了兩臺CentOS7.4虛擬機,並同時都安裝了Oracle11gR2的11.2.0.4.0企業版的數據庫軟件,其中只有主服務器建立一個數據庫實例,備用服務器僅安裝Oracle數據庫軟件。
主數據庫:
OS: CentOS7.4
Hostname: hmdb11dg-db1
Oracle Version: 11.2.0.4.0
Oracle SID: HMDG(使用DBCA工具建立的一個數據庫)
備數據庫:
OS: CentOS7.4
Hostname: hmdb11dg-db2
Oracle Version: 11.2.0.4.0
Oracle SID: HMDG2
注意: 在開始以前,備用服務上尚未將要與主服務器同步備份的數據庫實例dom
主數據庫的設置
1. 啓用歸檔日誌
檢查主數據是否處於歸檔日誌模式
SQL> SELECT log_mode FROM v$database; LOG_MODE ------------ ARCHIVELOG
若是是NOARCHIVELOG模式,則將其修改成ARCHIVELOG模式
SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; SQL> ALTER DATABASE ARCHIVELOG; SQL> ALTER DATABASE OPEN;
2. 啓用強制日誌
SQL> ALTER DATABASE FORCE LOGGING; SQL> SELECT name,force_logging FROM v$database; NAME FOR --------- --- HMDG YES
3. 建立密碼文件
若是密碼文件不存在,則建立一個密碼文件,備用服務器使用主服務器的密碼文件。Data Guard配置中的每一個數據庫的全部用戶密碼必須徹底相同。
$ orapwd file=/tmp/orapwHMDG password=hm_201802 entries=20
4. 建立備用重作日誌
備用重作日誌文件的大小要與當前主數據庫的在線重作日誌文件大小徹底匹配。
肯定備用重作日誌文件組的數量,建議的數量:(每一個線程最大的日誌數 + 1) * 最大線程數
SQL> SELECT * FROM v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC ---------- ---------- ---------- ---------- ---------- ---------- --- STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME ---------------- ------------- --------- ------------ --------- 1 1 40 104857600 512 1 YES INACTIVE 769491 06-FEB-18 813871 07-FEB-18 2 1 41 104857600 512 1 NO CURRENT 813871 07-FEB-18 2.8147E+14 3 1 39 104857600 512 1 YES INACTIVE 742672 06-FEB-18 769491 06-FEB-18 #下面建立8組備用重作日誌 SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/oradata/HMDG/redo04.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '/u01/app/oracle/oradata/HMDG/redo05.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/u01/app/oracle/oradata/HMDG/redo06.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 '/u01/app/oracle/oradata/HMDG/redo07.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 '/u01/app/oracle/oradata/HMDG/redo08.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 9 '/u01/app/oracle/oradata/HMDG/redo09.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 '/u01/app/oracle/oradata/HMDG/redo10.log' SIZE 500M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 '/u01/app/oracle/oradata/HMDG/redo11.log' SIZE 500M; #驗證 SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG; GROUP# THREAD# SEQUENCE# ARC STATUS ---------- ---------- ---------- --- ---------- 4 0 0 YES UNASSIGNED 5 0 0 YES UNASSIGNED 6 0 0 YES UNASSIGNED 7 0 0 YES UNASSIGNED 8 0 0 YES UNASSIGNED 9 0 0 YES UNASSIGNED 10 0 0 YES UNASSIGNED 11 0 0 YES UNASSIGNED 8 rows selected.
5. 開啓閃回日誌
SQL> alter database flashback on; SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES
6. Oracle監聽配置
主備數據庫必須配置註冊靜態監聽服務(listener.ora配置)
#主數據庫 $ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db1)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = HMDG.DB) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = HMDG) ) ) ADR_BASE_LISTENER = /u01/app/oracle #備數據庫 $ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db2)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = HMDG2.DB) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = HMDG2) ) ) ADR_BASE_LISTENER = /u01/app/oracle
7. 主備數據庫TNS別名鏈接信息配置
修改兩臺服務器上的$ORACLE_HOME/network/admin/tnsnames.ora配置文件,主備使用相同的配置
HMDG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = HMDG.DB) ) ) HMDG2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = HMDG2.DB) ) )
8. 測試使用TNS別名鏈接數據庫
[oracle@hmdb11dg-db1 ~]$ sqlplus system/hm_123456@HMDG SQL*Plus: Release 11.2.0.4.0 Production on Wed Feb 7 16:07:54 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL>
9. 主數據庫初始化參數設置
檢查DB_NAME和DB_UNIQUE_NAME參數設置,在個人例子中,主數據庫的DB_NAME和DB_UNIQUE_NAME值都爲HMDG。DB_NAME是主備全部節點都使用相同的值,即便用主的DB_NAME值,DB_UNIQUE_NAME必須是全局惟一的值,即每個節點值都不一樣
SQL> SHOW PARAMETER DB_NAME NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_name string HMDG SQL> SHOW PARAMETER DB_UNIQUE_NAME NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_unique_name string HMDG #設置DB_UNIQUE_NAME參數值 SQL> ALTER SYSTEM SET DB_UNIQUE_NAME=HMDG SCOPE=SPFILE;
肯定備庫的DB_UNIQUE_NAME以後,接下來首先咱們設置LOG_ARCHIVE_CONFIG參數
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(HMDG,HMDG2)' SCOPE=SPFILE;
配置主數據庫本地歸檔日誌的位置和遠程備用數據重作日誌的位置,注意LOG_ARCHIVE_DEST_1爲本地的參數設置,LOG_ARCHIVE_DEST_2爲遠程節點的設置
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/HMDG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=HMDG' SCOPE=SPFILE; SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=HMDG2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=HMDG2' SCOPE=SPFILE;
設置LOG_ARCHIVE_DEST_STATE_1和LOG_ARCHIVE_DEST_STATE_2的值爲ENABLE
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE SCOPE=SPFILE; SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=SPFILE;
設置LOG_ARCHIVE_FORMAT和LOG_ARCHIVE_MAX_PROCESSES參數爲合適的值,而且REMOTE_LOGIN_PASSWORDFILE必須設置爲'EXCLUSIVE'
SQL> ALTER SYSTEM SET LOG_ARCHIVE_FORMAT = '%t_%s_%r.arc' SCOPE = SPFILE; SQL> ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES = 30 SCOPE = SPFILE; SQL> ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE;
接下來設置與備用數據庫相關的參數值,確保主數據庫已經準備好切換爲備數據庫
SQL> ALTER SYSTEM SET FAL_SERVER=HMDG2 SCOPE = SPFILE; SQL> ALTER SYSTEM SET FAL_CLIENT=HMDG SCOPE = SPFILE; SQL> ALTER SYSTEM SET DB_FILE_NAME_CONVERT='HMDG2','HMDG' SCOPE = SPFILE; SQL> ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/HMDG2/','/u01/app/oracle/oradata/HMDG/' SCOPE = SPFILE; SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE = SPFILE;
設置完主數據庫初始化參數後,須要從新啓動數據庫配置才生效
SQL> shutdown immediate SQL> startup SQL> show parameter standby_file_management NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ standby_file_management string AUTO
10. 生成一個PFILE參數文件
在設置了主數據庫初始化參數以後,咱們能夠手動生成一個主服務器的PFILE參數文件
SQL> CREATE PFILE FROM SPFILE;
查看$ORACLE_HOME/dbs/目錄下生成的initHMDG.ora文件
$ cat initHMDG.ora HMDG.__db_cache_size=234881024 HMDG.__java_pool_size=33554432 HMDG.__large_pool_size=1962934272 HMDG.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment HMDG.__pga_aggregate_target=150994944 HMDG.__sga_target=3137339392 HMDG.__shared_io_pool_size=0 HMDG.__shared_pool_size=872415232 HMDG.__streams_pool_size=0 *.audit_file_dest='/u01/app/oracle/admin/HMDG/adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='/u01/app/oracle/oradata/HMDG/control01.ctl','/u01/app/oracle/fast_recovery_area/HMDG/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_file_name_convert='HMDG2','HMDG' *.db_name='HMDG' *.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' *.db_recovery_file_dest_size=10737418240 *.db_unique_name='HMDG' *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=HMDGXDB)' *.fal_client='HMDG' *.fal_server='HMDG2' *.log_archive_config='DG_CONFIG=(HMDG,HMDG2)' *.log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/HMDG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=HMDG' *.log_archive_dest_2='SERVICE=HMDG2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=HMDG2' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.log_archive_format='%t_%s_%r.arc' *.log_archive_max_processes=30 *.log_file_name_convert='/u01/app/oracle/oradata/HMDG2/','/u01/app/oracle/oradata/HMDG/' *.memory_target=3277848576 *.open_cursors=300 *.processes=5000 *.remote_login_passwordfile='EXCLUSIVE' *.sessions=5505 *.standby_file_management='AUTO' *.undo_tablespace='UNDOTBS1'
11. 備份主數據庫
爲經過手動同步主數據庫的原始數據文件建立備份,若是你使用的是RMAN 的DUPLICATE來恢復備用數據庫,則不須要執行次步驟。
[oracle@hmdb11dg-db1 ~]$ rman target = / RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
12. 建立備用數據庫的控制文件和PFILE文件
建立備用數據庫控制文件
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/HMDG2.ctl';
建立備用數據庫的PFILE文件
SQL> CREATE PFILE='/tmp/initHMDG2.ora' FROM SPFILE;
備用數據庫服務器設置
1. 備用數據庫上建立必要的目錄
$ mkdir /u01/app/oracle/admin $ mkdir /u01/app/oracle/admin/HMDG2 $ mkdir /u01/app/oracle/admin/HMDG2/{adump,dpdump,pfile,scripts} $ mkdir -p /u01/app/oracle/oradata/HMDG2 $ mkdir -p /u01/app/oracle/fast_recovery_area/HMDG2
2. 將控制文件、參數文件和密碼文件從主服務器上覆制到備用服務器上
#控制文件 $ scp oracle@hmdb11dg-db1:/tmp/HMDG2.ctl /u01/app/oracle/oradata/HMDG2/control01.ctl $ cp /u01/app/oracle/oradata/HMDG2/control01.ctl /u01/app/oracle/fast_recovery_area/HMDG2/control02.ctl #密碼文件 $ scp oracle@hmdb11dg-db1:/tmp/orapwHMDG /u01/app/oracle/product/11.2.0/db_1/dbs/orapwHMDG2 #參數文件 $ scp oracle@hmdb11dg-db1:/tmp/initHMDG2.ora /u01/app/oracle/product/11.2.0/db_1/dbs/ initHMDG2.ora
3. 修改備用數據庫初始化參數
修改備用服務器的PFILE文件$ORACLE_HOME/dbs/initHMDG.ora
... *.audit_file_dest='/u01/app/oracle/admin/HMDG2/adump' *.control_files='/u01/app/oracle/oradata/HMDG2/control01.ctl','/u01/app/oracle/fast_recovery_area/HMDG2/control02.ctl *.db_name='HMDG' *.db_unique_name='HMDG2' *.db_file_name_convert='HMDG','HMDG2' *.log_archive_config='DG_CONFIG=(HMDG,HMDG2)' *.log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/HMDG2 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=HMDG2' *.log_archive_dest_2='SERVICE=HMDG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=HMDG' *.fal_client='HMDG' *.fal_server='HMDG2 *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.log_archive_format='%t_%s_%r.arc' *.log_archive_max_processes=30 *.log_file_name_convert='/u01/app/oracle/oradata/HMDG/','/u01/app/oracle/oradata/HMDG2/' ...
建立備用數據庫(DUPLICATE)
使用備庫的PFILE文件以NOMOUNT模式啓動備用數據庫實例
$ sqlplus / as sysdba SQL> STARTUP NOMOUNT PFILE='/u01/app/oracle/product/11.2.0/db_1/dbs/initHMDG2.ora';
建立SPFILE文件
SQL> CREATE SPFILE FROM PFILE;
使用RMAN將主數據庫複製到備用數據庫,以sys用戶鏈接,並使用DUPLICATE複製主庫到備庫
$ rman TARGET sys/hm_123456@HMDG AUXILIARY sys/hm_123456@HMDG2
使用如下DUPLICATE語句複製主庫
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE;
在RMAN複製過程當中若是沒有產生任何錯誤,接下來就能夠當即開啓日誌重作應用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE; SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; 或者 SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
取消申請恢復命令
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
在主上強制主數據庫上的日誌切換器將當前的重作日誌組歸檔
SQL> ALTER SYSTEM SWITCH LOGFILE;
在備上查詢日誌應用狀況
SQL> select sequence#, first_time, applied from v$archived_log order by sequence#; SEQUENCE# FIRST_TIM APPLIED ---------- --------- --------- 100 08-FEB-18 YES 101 08-FEB-18 YES 102 08-FEB-18 IN-MEMORY
在主上執行日誌切換
ALTER SYSTEM SWITCH LOGFILE;
再查看備上日誌應用
SQL> select sequence#, first_time, applied from v$archived_log order by sequence#; SEQUENCE# FIRST_TIM APPLIED ---------- --------- --------- 100 08-FEB-18 YES 101 08-FEB-18 YES 102 08-FEB-18 YES 103 08-FEB-18 IN-MEMORY
主備切換
1. 主數據庫
在當前主數據庫中查詢主備狀態
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS -------------------- TO STANDBY
當主數據庫的狀態爲TO STANDBY時,表示能夠切換到備用數據庫
主上執行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN; SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; -- 在備切換爲主時,將舊的主啓動爲備用數據庫 SQL> STARTUP NOMOUNT; SQL> ALTER DATABASE MOUNT STANDBY DATABASE; SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
2. 備數據庫
在備上肯定當前切換狀態
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS ----------------- TO_PRIMARY 1 row selected
備上執行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; -- 確認打開數據庫 SQL> ALTER DATABASE OPEN; -- 或者 SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;