Oracle Data Guard 为企业数据库提供了最有效和最全面的数据可用性、数据保护和灾难恢复解决方案。它集成管理、监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数据不受故障、灾难、错误和损坏的影响。本文主要描述了在同一主机下如何配置Oracle Data Guard。
有关DG的相关概念,可参考:Oracle DataGuard的原理与基本配置
有关配置DG的参数描述,可参考:Oracle Data Guard 重要配置参数
1、创建DG的大致流程
a、主库启用归档与强制日志模式
b、主库配置redo传输服务(即相关参数配置)
c、主库及备库配置监听
d、为备库创建目录
e、配置备库密码文件及参数文件
f、复制数据文件,日志文件,备份控制文件到备库
g、启动备库并校验结果
2、演示创建物理备库
--演示环境
[oracle@linux3 ~]$ cat /etc/issue
Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
Kernel r on an m
[oracle@linux3 ~]$ sqlplus -v
SQL*Plus: Release 11.2.0.1.0 Production
--主库:dataguard1
--备库: dataguard5
--配置物理standby,使用最佳性能模式
a、主库前期准备
--查看主库的归档模式,如果为非归档模式应先切换到归档模式
--关于如何切换到归档模式可以参考:Oracle 归档日志 http://blog.csdn.net/robinson_0612/article/details/5784713
oracle@dataguard1> select name,log_mode from v$database;
NAME LOG_MODE
--------- ------------
dataguard1 ARCHIVELOG
--为备库准备pfile文件
oracle@dataguard1> create pfile=/u01/oracle/db_1/dbs/initdataguard5.ora from spfile;
--使主库处于强制日志模式
oracle@dataguard1> alter database force logging;
oracle@dataguard1> select database_role from v$database;
DATABASE_ROLE
----------------
PRIMARY
--为主库添加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以及延缓重做传输
oracle@dataguard1> alter database add standby logfile ('/u01/database/dataguard1/redo/standby_redo01.log') size 50m;
oracle@dataguard1> alter database add standby logfile ('/u01/database/dataguard1/redo/standby_redo02.log') size 50m;
oracle@dataguard1> alter database add standby logfile ('/u01/database/dataguard1/redo/standby_redo03.log') size 50m;
oracle@dataguard1> alter database add standby logfile ('/u01/database/dataguard1/redo/standby_redo04.log') size 50m;
b、修改主库参数文件
--使用下面的命令修改主库参数(此时主库应当使用spfile启动参数)
[oracle@linux3 ~]$ more ch_sp_dataguard1.sql
--Add below item when DB acts as primary role
alter system set db_unique_name='dataguard1' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(dataguard1,dataguard5)';
alter system set log_archive_dest_1='LOCATION=/u01/database/dataguard1/arch db_unique_name=dataguard1 valid_for=(ALL_LOGFILES,ALL_ROLES)';
alter system set log_archive_dest_2='SERVICE=dataguard5 ASYNC db_unique_name=dataguard5 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='dataguard5','dataguard1' scope=spfile;
alter system set log_file_name_convert='dataguard5','dataguard1' scope=spfile;
alter system set standby_file_management='AUTO';
alter system set fal_server='dataguard5';
alter system set fal_client='dataguard1';
oracle@dataguard1> @ch_sp_dataguard1
oracle@dataguard1> shutdown immediate;
c、配置主备库监听
--为主库和备库配置监听,整个DG的redo传输服务,都依赖于Oracle Net,因此需要为主备库配置监听
--配置方法多种多样,可用netmgr,netca,以及直接编辑listener.ora 与tnsnames.ora文件
--下面是配置之后的listener.ora 与tnsnames.ora文件内容
[oracle@linux3 ~]$ more /u01/oracle/db_1/network/admin/listener.ora
# listener.ora Network Configuration File: /u01/oracle/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER_dataguard5 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = dataguard5.orasrv.com)
(ORACLE_HOME = /u01/oracle/db_1)
(SID_NAME = dataguard5)
)
)
SID_LIST_LISTENER_dataguard1 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = dataguard1.orasrv.com)
(ORACLE_HOME = /u01/oracle/db_1)
(SID_NAME = dataguard1)
)
)
LISTENER_dataguard5 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = linux3.orasrv.com)(PORT = 1532))
)
ADR_BASE_LISTENER_dataguard5 = /u01/oracle
LISTENER_dataguard1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = linux3.orasrv.com)(PORT = 1531))
)
ADR_BASE_LISTENER_dataguard1 = /u01/oracle
[oracle@linux3 ~]$ more /u01/oracle/db_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/oracle/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
dataguard5 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.25)(PORT = 1532))
)
(CONNECT_DATA =
(SERVICE_NAME = dataguard5.ORASRV.COM)
)
)
dataguard1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.25)(PORT = 1531))
)
(CONNECT_DATA =
(SERVICE_NAME = dataguard1.ORASRV.COM)
)
)
--启动监听器并测试
[oracle@linux3 ~]$ lsnrctl start LISTENER_dataguard1
[oracle@linux3 ~]$ lsnrctl start LISTENER_dataguard5
[oracle@linux3 ~]$ tnsping dataguard1
[oracle@linux3 ~]$ tnsping dataguard5
d、为备库创建目录
--为备库创建相应的文件夹
[oracle@linux3 database]$ more dataguard5.sh
#!/bin/sh
mkdir -p /u01/database
mkdir -p /u01/database/dataguard5/adump
mkdir -p /u01/database/dataguard5/controlf
mkdir -p /u01/database/dataguard5/fra
mkdir -p /u01/database/dataguard5/oradata
mkdir -p /u01/database/dataguard5/redo
mkdir -p /u01/database/dataguard5/dpdump
mkdir -p /u01/database/dataguard5/pfile
mkdir -p /u01/database/dataguard5/arch
[oracle@linux3 database]$ ./dataguard5.sh
e、配置备库密码文件及参数文件
--由于要求主库与备库sys使用相同的密码,在此处,我们直接复制了主库的密码文件到备库
[Oracle@linux3 ~]$ cp $ORACLE_HOME/dbs/orapwdataguard1 $ORACLE_HOME/dbs/orapwdataguard5
[oracle@linux3 ~]$ sed -i 's/dataguard1/dataguard5/g' $ORACLE_HOME/dbs/initdataguard5.ora
---注意db_name的设置还是使用原来的dataguard1,即修改回db_name='dataguard1',同一DG中应设置相同的db_name
--下面是配置之后的备库参数文件,仅列出修改部分,如果原来pfile文件中有相同的条目,可以将其之前的注释或删除
[oracle@linux3 ~]$ tail -20 $ORACLE_HOME/dbs/initdataguard5.ora
db_unique_name=dataguard5
log_archive_config='DG_CONFIG=(dataguard1,dataguard5)'
log_archive_dest_1='LOCATION=/u01/database/dataguard5/arch db_unique_name=dataguard5 valid_for=(ALL_LOGFILES,ALL_ROLES)'
log_archive_dest_2='SERVICE=dataguard1 ASYNC db_unique_name=dataguard1 valid_for=(ONLINE_LOGFILES,PRIMARY_ROLES)'
log_archive_dest_state_1=enable
log_archive_dest_state_2=enable
db_file_name_convert='dataguard1','dataguard5'
log_file_name_convert='dataguard1','dataguard5'
standby_file_management='AUTO'
fal_server='dataguard1'
fal_client='dataguard5'
log_archive_max_processes=4
remote_login_passwordfile='EXCLUSIVE'
f、复制数据文件,日志文件,备份控制文件到备库
--对于从主库克隆standby有多种方法,而且Oracle 11g支持从ative database直接克隆数据库
--由于在同一主机,因此此次操作直接使用冷备方式将数据及日志文件复制到备库目录
[oracle@linux3 ~]$ cp /u01/database/dataguard1/oradata/* /u01/database/dataguard5/oradata/
[oracle@linux3 ~]$ cp /u01/database/dataguard1/redo/* /u01/database/dataguard5/redo/
--启动主库到mount状态
oracle@dataguard1> startup mount;
--为主库生成控制文件,注,对于配置standby,不能直接使用copy方式复制控制文件到备库
oracle@dataguard1> alter database create standby controlfile as '/u01/database/dataguard5/controlf/control01.ctl';
oracle@dataguard1> ho cp /u01/database/dataguard5/controlf/control01.ctl /u01/database/dataguard5/controlf/control02.ctl
--打开主库
oracle@dataguard1> alter database open;
g、启动备库到mount状态并校验结果
[oracle@linux3 ~]$ export ORACLE_SID=dataguard5
[oracle@linux3 ~]$ sqlplus / as sysdba
oracle@dataguard5> startup mount pfile=/u01/oracle/db_1/dbs/initdataguard5.ora
--为备库生成spfile文件
oracle@dataguard5> create spfile from pfile;
oracle@dataguard5> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string dataguard5
oracle@dataguard5> select name,open_mode,database_role,protection_mode from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
dataguard1 MOUNTED PHYSICAL STANDBY MAXIMUM PERFORMANCE
--在主库端进行日志切换
oracle@dataguard1> ALTER SYSTEM SWITCH LOGFILE;
oracle@dataguard1> ALTER SYSTEM SWITCH LOGFILE;
--在备库端启动redo apply
oracle@dataguard5> alter database recover managed standby database disconnect from session;
--查看日志被apply的结果
oracle@dataguard5> select sequence#, first_time, next_time,applied from v$archived_log order by sequence#;
SEQUENCE# FIRST_TIM NEXT_TIME APPLIED
---------- --------- --------- ---------
113 12-AUG-13 12-AUG-13 YES
114 12-AUG-13 12-AUG-13 YES
115 12-AUG-13 12-AUG-13 YES
116 12-AUG-13 12-AUG-13 YES
117 12-AUG-13 12-AUG-13 YES
--查看主库端
oracle@dataguard1> select * from (
2 select sequence#, first_time, next_time,applied from v$archived_log order by sequence# desc)
3 where rownum<5;
SEQUENCE# FIRST_TIM NEXT_TIME APPLIED
---------- --------- --------- ---------
117 12-AUG-13 13-AUG-13 YES
116 12-AUG-13 12-AUG-13 YES
115 12-AUG-13 12-AUG-13 YES
114 12-AUG-13 12-AUG-13 YES