(一)DataGuard概要
DataGuard中文稱為”數據衛士“,提供了數據庫高可用性、數據保護和災難恢復的功能。DataGuard通過建立primary數據庫和standby數據庫來確立參照關系,DataGuard將主庫(primary)的redo日志傳遞給備庫(standby),然后在備庫中應用redo進行同步。
備庫又分為2種類型:物理備庫和邏輯備庫
- 物理standby是通過塊拷貝方式同步,通過接受並應用primary數據庫的redo log,以介質恢復的方式同步。在物理備庫中,數據是完全相同的,包括schema、表、索引都是一樣的。
- 邏輯standby是通過應用SQL語句進行同步,通過接收primary數據庫的redo log並轉換成sql語句。
物理備庫在實際生產中使用較多,這里記錄物理備庫的搭建過程。
(二)DataGuard環境規划
主庫 | 備庫 | |
操作系統 | redhat 6.7 x86-64(64位) | redhat 6.7 x86-64(64位) |
服務器名稱 | primarynode | standbynode |
IP地址規划 | 192.168.10.51 | 192.168.10.52 |
--------------- | ----------------------- | ---------------- |
數據庫版本 | 11.2.0.4 | 11.2.0.4 |
db_name | adgdb | adgdb |
db_unique_name | adgdb | adgdbstandby |
instance_name | adgdb | adgdbstandby |
service_name | adgdb | adgdb |
數據庫安裝 | 安裝數據庫軟件+創建監聽+安裝數據庫 | 安裝數據庫軟件+創建監聽 |
常規配置:
( 1 )主庫和備庫hosts文件配置
[root@primarynode ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
::1 localhost localhost.localdomain localhost6 192.168.10.51 primarynode 192.168.10.52 standbynode
(2)主庫oracle用戶環境配置
[oracle@primarynode ~]$ more .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin ORACLE_SID=adgdb; export ORACLE_SID ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin; export PATH export TEMP=/tmp export TMPDIR=/tmp umask 022 export PATH
(3)備庫環境變量配置
[oracle@standbynode ~]$ more .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin ORACLE_SID=adgdbstandby; export ORACLE_SID ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin; export PATH export TEMP=/tmp export TMPDIR=/tmp umask 022 export PATH
(三)DataGuard主庫配置
( 1 )主庫啟用強制記錄日志功能
查詢是否啟用強制記錄日志
select force_logging from v$database;
如果未啟用,則使用下面語句來開啟強制記錄日志
alter database force logging; --強制記錄日志
( 2 )啟用歸檔
查詢是否啟用歸檔
archive log list --或者 select log_mode from v$database;
如果未啟用歸檔,可以按照如下步驟開啟歸檔
----Oracle 11g數據庫歸檔模式開啟 --STEP1:以sysdba角色登陸數據庫 sqlplus / as sysdba --STEP2:干凈的關閉數據庫 shutdown immediate --STEP3:將數據庫啟動到mount狀態 startup mount --STEP4:開啟歸檔 alter database archivelog; --STEP5:打開數據庫 alter database open
( 3 )主庫參數配置
(3.1)db_unique_name
SQL> alter system set db_unique_name = 'adgdb' scope=spfile;
(3.2)log_archive_config
SQL> alter system set log_archive_config='DG_CONFIG=(adgdb,adgdbstandby)' scope=spfile;
(3.3)log_archive_dest_1
SQL> alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/product/11.2.0/db_1/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=adgdb' scope=both;
(3.4)log_archive_dest_2
SQL> alter system set log_archive_dest_2='SERVICE=tnsadgdbstandby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=adgdbstandby' scope=spfile;
(3.5)log_archive_dest_state_1
alter system set log_archive_dest_state_1 = ENABLE;
(3.6)log_archive_dest_state_2
alter system set log_archive_dest_state_2 = ENABLE;
(3.7)db_file_name_convert
查看數據文件的位置:
SQL> select name from v$datafile; NAME -------------------------------------------------- /u01/app/oracle/oradata/adgdb/system01.dbf /u01/app/oracle/oradata/adgdb/sysaux01.dbf /u01/app/oracle/oradata/adgdb/undotbs01.dbf /u01/app/oracle/oradata/adgdb/users01.dbf /u01/app/oracle/oradata/adgdb/example01.dbf
如果主庫與備庫數據文件位置不相同,則需要使用db_file_name_convert來轉換。
SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/adgdbstandby','/u01/app/oracle/oradata/adgdb' scope=spfile;
(3.8)log_file_name_convert
查看在線日志文件的位置:
SQL> select member from v$logfile; MEMBER -------------------------------------------------- /u01/app/oracle/oradata/adgdb/redo03.log /u01/app/oracle/oradata/adgdb/redo02.log /u01/app/oracle/oradata/adgdb/redo01.log
如果主庫與備庫在線日志文件位置不相同,則需要使用log_file_name_convert來轉換。
SQL> alter system set log_file_name_convert='/u01/app/oracle/oradata/adgdbstandby','/u01/app/oracle/oradata/adgdb' scope=spfile;
(3.9)standby_file_management
SQL> alter system set standby_file_management=auto scope=spfile;
(3.10)fal_client
SQL> alter system set fal_client='tnsadgdb' scope=both;
(3.11)fal_server
SQL> alter system set fal_server='tnsadgdbstandby' scope=both;
( 4 )主庫靜態監聽配置
[oracle@primarynode admin]$ vim listener.ora
# listener.ora Network Configuration File: /u01/oracle/product/11.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = primarynode)(PORT = 1521)) ) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME=adgdb) (SID_NAME = adgdb) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) ) ) ADR_BASE_LISTENER = /u01/oracle
查看監聽:
[oracle@primarynode admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 06-APR-2019 13:48:15 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=primarynode)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 06-APR-2019 13:42:48 Uptime 0 days 0 hr. 5 min. 27 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora Listener Log File /u01/app/oracle/product/11.2.0/db_1/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=primarynode)(PORT=1521))) Services Summary... Service "adgdb" has 2 instance(s). Instance "adgdb", status UNKNOWN, has 1 handler(s) for this service... Instance "adgdb", status READY, has 1 handler(s) for this service... Service "adgdbXDB" has 1 instance(s). Instance "adgdb", status READY, has 1 handler(s) for this service... The command completed successfully
( 5 )主庫tnsnames.ora文件配置
[oracle@primarynode admin]$ vim tnsnames.ora
tnsadgdb = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.51)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = adgdb) ) ) tnsadgdbstandby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.52)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = adgdb) ) )
(四)DataGuard備庫配置
( 1 )密碼文件
在dataguard中,主庫與備庫sys密碼需一致。可以將主庫的密碼文件拷貝到備庫中
--登陸到主庫,將密碼文件復制到備庫 [oracle@primarynode ~]$ cd $ORACLE_HOME/dbs [oracle@primarynode dbs]$ scp orapwadgdb 192.168.10.52:/u01/app/oracle/product/11.2.0/db_1/dbs oracle@192.168.10.52's password: orapwadgdb 100% 1536 1.5KB/s 00:00 --登陸到備庫,修改密碼文件的名稱 [oracle@standbynode dbs]$ mv orapwadgdb orapwadgdbstandby
或者不拷貝密碼文件,直接使用orapwd生成一個新的密碼文件,密碼需與主庫一致:
orapwd file=orapwadgdbstandby password='oracle';
( 2 )初始化參數文件
(2.1)在主庫生成初始化參數文件
SQL> create pfile from spfile; File created.
(2.2)拷貝主庫的參數文件到備庫並重命名
--在主庫上執行復制操作 [oracle@primarynode dbs]$ scp initadgdb.ora 192.168.10.52:/u01/app/oracle/product/11.2.0/db_1/dbs oracle@192.168.10.52's password: initadgdb.ora 100% 1524 1.5KB/s 00:00 --在備庫上執行重命名操作 [oracle@standbynode dbs]$ mv initadgdb.ora initadgdbstandby.ora
(2.3)修改備庫的參數文件內容
--將初始化參數中的這些參數做修改,其他參數不用動 db_name='adgdb' db_unique_name='adgdbstandby' audit_file_dest='/u01/app/oracle/admin/adgdbstandby/adump' compatible='11.2.0.4.0' control_files='/u01/app/oracle/oradata/adgdbstandby/control01.ctl','/u01/app/oracle/oradata/adbdbstandby/control02.ctl' log_archive_config='DG_CONFIG=(adgdb,adgdbstandby)' log_archive_dest_1='LOCATION=/u01/app/oracle/product/11.2.0/db_1/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=adgdbstandby' log_archive_dest_2='SERVICE=tnsadgdb LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NMAE=adgdb' db_file_name_convert='/u01/app/oracle/oradata/adgdb','/u01/app/oracle/oradata/adgdbstandby' log_file_name_convert='/u01/app/oracle/oradata/adgdb','/u01/app/oracle/oradata/adgdbstandby' fal_client='tnsadgdbstandby' fal_server='tnsadgdb' standby_file_management='AUTO'
注意:里面涉及到路徑的需要手動創建
mkdir -p /u01/app/oracle/admin/adgdbstandby/adump
(2.4)使用pfile文件創建spfile文件
--登陸到idle數據庫 sqlplus / as sysdba --創建spfile,可在$ORACLE_HOME/dbs下查看 create spfile from pfile --啟動數據庫到nomount狀態 startup nomount
( 3 )配置靜態監聽
[oracle@standbynode trace]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin/ [oracle@standbynode admin]$ touch listener.ora [oracle@standbynode admin]$ vim listener.ora # listener.ora Network Configuration File: /u01/oracle/product/11.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = standbynode)(PORT = 1521)) ) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME=adgdb) (SID_NAME = adgdbstandby) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) ) ) ADR_BASE_LISTENER = /u01/oracle
備注:備庫為什么一定需要使用靜態監聽
nomount狀態下必須使用靜態監聽才能連接到實例。
( 4 )配置tnsnames.ora文件,直接把主庫的拷貝過來即可
[oracle@standbynode trace]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin/ [oracle@standbynode admin]$ vim tnsnames.ora tnsadgdb = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.51)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = adgdb) ) ) tnsadgdbstandby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.52)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = adgdb) ) )
( 5 )測試網絡連通性
在主庫與備庫上均執行,確保可以正常訪問:
tnsping tnsadgdb
tnsping tnsadgdbstandby
在主庫:
sqlplus sys/oracle@tnsadgdb as sysdba
sqlpus sys/oracle@tnsadgdbstandby as sysdba
( 6 )參數檢查
由於參數配置的較多,需要認真檢查參數配置是否正確,主要檢查這些參數
1.db_unique_name :2個節點需要不一樣
2.compatible :主庫與備庫兼容性需一致
3.log_archive_config : 配置主庫與備庫的db_unique_name
4.log_archive_dest_1,2 :歸檔日志的路徑
5.log_archive_dest_state_2 :
enable -- 啟用log_archive_dest_2
defer --禁用log_archive_dest_2
6.db_file_name_convert :數據文件轉換路徑
7.log_file_name_convert :日志文件轉換路徑
8.standby_file_management :設置為auto
9.log_archive_format :日志文件格式,兩邊需一致
( 7 )使用duplicate創建物理standby
(7.1)連接到主庫和備庫
## 一定要加nocatalog,否則在執行duplicate時會報錯
[oracle@primarynode ~]$ rman target sys/oracle@tnsadgdb auxiliary sys/oracle@tnsadgdbstandby nocatalog
(7.2)使用duplicate復制數據庫
RMAN> duplicate target database for standby from active database nofilenamecheck;
執行過程見:

RMAN> duplicate target database for standby from active database nofilenamecheck; Starting Duplicate Db at 06-APR-19 allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: SID=248 device type=DISK contents of Memory Script: { backup as copy reuse targetfile '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwadgdb' auxiliary format '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwadgdbstandby' ; } executing Memory Script Starting backup at 06-APR-19 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=23 device type=DISK Finished backup at 06-APR-19 contents of Memory Script: { ctl'; restore clone controlfile to '/u01/app/oracle/oradata/adgdbstandby/control02.ctl' from '/u01/app/oracle/oradata/adgdbstandby/control01.ctl'; } executing Memory Script Starting backup at 06-APR-19 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy copying standby control file 183 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 06-APR-19 Starting restore at 06-APR-19 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: copied control file copy Finished restore at 06-APR-19 contents of Memory Script: { sql clone 'alter database mount standby database'; } executing Memory Script sql statement: alter database mount standby database contents of Memory Script: { set newname for tempfile 1 to "/u01/app/oracle/oradata/adgdbstandby/temp01.dbf"; switch clone tempfile all; set newname for datafile 1 to "/u01/app/oracle/oradata/adgdbstandby/system01.dbf"; set newname for datafile 2 to "/u01/app/oracle/oradata/adgdbstandby/sysaux01.dbf"; set newname for datafile 3 to "/u01/app/oracle/oradata/adgdbstandby/undotbs01.dbf"; set newname for datafile 4 to "/u01/app/oracle/oradata/adgdbstandby/users01.dbf"; set newname for datafile 5 to "/u01/app/oracle/oradata/adgdbstandby/example01.dbf"; backup as copy reuse datafile 1 auxiliary format "/u01/app/oracle/oradata/adgdbstandby/system01.dbf" datafile 2 auxiliary format "/u01/app/oracle/oradata/adgdbstandby/sysaux01.dbf" datafile 3 auxiliary format "/u01/app/oracle/oradata/adgdbstandby/undotbs01.dbf" datafile 4 auxiliary format "/u01/app/oracle/oradata/adgdbstandby/users01.dbf" datafile 5 auxiliary format "/u01/app/oracle/oradata/adgdbstandby/example01.dbf" ; sql 'alter system archive log current'; } executing Memory Script executing command: SET NEWNAME renamed tempfile 1 to /u01/app/oracle/oradata/adgdbstandby/temp01.dbf in control file executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting backup at 06-APR-19 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy input datafile file number=00001 name=/u01/app/oracle/oradata/adgdb/system01.dbf output file name=/u01/app/oracle/oradata/adgdbstandby/system01.dbf tag=TAG20190406T160954 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:45 channel ORA_DISK_1: starting datafile copy input datafile file number=00002 name=/u01/app/oracle/oradata/adgdb/sysaux01.dbf output file name=/u01/app/oracle/oradata/adgdbstandby/sysaux01.dbf tag=TAG20190406T160954 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:36 channel ORA_DISK_1: starting datafile copy input datafile file number=00005 name=/u01/app/oracle/oradata/adgdb/example01.dbf output file name=/u01/app/oracle/oradata/adgdbstandby/example01.dbf tag=TAG20190406T160954 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25 channel ORA_DISK_1: starting datafile copy input datafile file number=00003 name=/u01/app/oracle/oradata/adgdb/undotbs01.dbf output file name=/u01/app/oracle/oradata/adgdbstandby/undotbs01.dbf tag=TAG20190406T160954 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07 channel ORA_DISK_1: starting datafile copy input datafile file number=00004 name=/u01/app/oracle/oradata/adgdb/users01.dbf output file name=/u01/app/oracle/oradata/adgdbstandby/users01.dbf tag=TAG20190406T160954 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 06-APR-19 sql statement: alter system archive log current contents of Memory Script: { switch clone datafile all; } executing Memory Script datafile 1 switched to datafile copy input datafile copy RECID=9 STAMP=1004890308 file name=/u01/app/oracle/oradata/adgdbstandby/system01.dbf datafile 2 switched to datafile copy input datafile copy RECID=10 STAMP=1004890308 file name=/u01/app/oracle/oradata/adgdbstandby/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=11 STAMP=1004890308 file name=/u01/app/oracle/oradata/adgdbstandby/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=12 STAMP=1004890308 file name=/u01/app/oracle/oradata/adgdbstandby/users01.dbf datafile 5 switched to datafile copy input datafile copy RECID=13 STAMP=1004890308 file name=/u01/app/oracle/oradata/adgdbstandby/example01.dbf Finished Duplicate Db at 06-APR-19
( 8 )添加主庫和備庫的standby日志組
(8.1)添加standby日志組需要注意的事項
- standby日志組個數:配置為redo日志組個數+1
- 在主庫與備庫都添加standby日志組。主庫可以不添加,但是如果后期發生主備切換,還是要添加,所以最好一次性添加。
- 只查詢standby日志組: select * from v$standby_log ;
(8.2)添加主庫的standby日志組
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/adgdb/stredo04.log') size 50M; alter database add standby logfile group 5 ('/u01/app/oracle/oradata/adgdb/stredo05.log') size 50M; alter database add standby logfile group 6 ('/u01/app/oracle/oradata/adgdb/stredo06.log') size 50M; alter database add standby logfile group 7 ('/u01/app/oracle/oradata/adgdb/stredo07.log') size 50M;
(8.3)添加備庫的standby日志組
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/adgdbstandby/stredo04.log') size 50M; alter database add standby logfile group 5 ('/u01/app/oracle/oradata/adgdbstandby/stredo05.log') size 50M; alter database add standby logfile group 6 ('/u01/app/oracle/oradata/adgdbstandby/stredo06.log') size 50M; alter database add standby logfile group 7 ('/u01/app/oracle/oradata/adgdbstandby/stredo07.log') size 50M;
( 9 )開始同步數據庫,在備庫上執行
alter database open; --方式一:開啟實時同步 alter database recover managed standby database using current logfile disconnect from session; --或簡寫為: alter database recover managed standby database using current logfile disconnect; --方式二:開啟同步(日志切換時才同步) alter database recover managed standby database disconnect from session;
至此配置完成。
(五)DataGuard狀態查看
( 1 )主庫狀態查看
SQL> select open_mode, --數據庫打開模式,如果實時同步,則為:read only with apply,取消同步則為:read only database_role, --數據庫角色,是主庫還是備庫 protection_mode, --保護模式 protection_level --保護級別 from v$database; OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL -------------------- ---------------- -------------------- -------------------- READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
( 2 )備庫狀態查看
SQL> select open_mode, database_role, protection_mode, protection_level from v$database;
OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL -------------------- ---------------- -------------------- -------------------- READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
(六)DataGuard測試
在主庫上創建表lijiaman.test01,並插入數據
SQL> create table test01(id number,name varchar2(50)); Table created. SQL> insert into test01 values(1,'lijiaman'); 1 row created. SQL> insert into test01 values(2,'gegeman'); 1 row created. SQL> commit;
在standby數據庫上查詢lijiaman.test01表,數據一致
SQL> select db_unique_name from v$database; DB_UNIQUE_NAME ------------------------------ adgdbstandby SQL> select * from lijiaman.test01; ID NAME ---------- -------------------- 1 lijiaman 2 gegeman
【完】