配置物理Data Guard的步骤有很多种方法。方法不同,配置Data Guard的步骤也不同,比如有些方法要求生产主机关闭,有些方法要求创建AUXILIARY数据库。本节主要讲解配置物理Data Guard的最佳实践流程。
1.配置Data Guard简要流程
- (1)检查主备主机的操作系统是否支持配置Data Guard。
- (2)检查主备数据库之间的网络带宽是否满足要求,生产库产生的归档量越大,带宽要求越高。
- (3)检查备份端的存储空间和性能是否满足要求,生产库产生的归档量越大,存储的空间和性能要求越高。
- (4)检查生产库是否处于归档模式,并打开FORCE LOGGING模式。如果数据库不处于FORCE LOGGING模式,虽然备库应用日志时不会出错,但在备库中无法查询NOLOGGING操作的表。
- (5)在备份端要安装和生产库一样的数据库软件版本,并且建议安装相同的PSU补丁。
- (6)复制生产库的密码文件至备份端相应的目录中(如果是RAC,则要求所有节点的密码文件相同),配置生产端和备份端中的监听配置文件(主、备实例之间要能够使用sysdba权限互相连接,如果不能互连,则主、备之间的切换不能成功),这一步非常重要。
- (7)配置生产端和备份端数据库的Data Guard相关参数
- (8)根据数据库参数文件在备份端创建相关目录,如STANDBY CONTROLFILE的存放路径、跟踪文件存放路径、数据文件存放路径、闪回日志存放路径(如果备份端不开启闪回或者数据库版本为Oracle 9i,则不需要配置)等。
- (9)在生产端创建STANDBY CONTROLFILE文件,并传输至备份端备库数据库参数CONTROL_FILES所指定的位置,建议配置两个以上的STANDBY CONTROLFILE。
- (10)启动备份库至MOUNT状态,添加STANDBY LOGFILE。其添加原则是STANDBY LOGFILE的大小至少要和生产库日志文件的大小保持一致,且日志组数在两组以上(如果生产库为RAC,则每个THREAD添加两组以上日志组)。这一步完成之后,生产库产生的日志应该能够自动传输到备份端了。如果日志传输失败,则查看生产端和备份端的警告日志,查询视图V$ARCHIVE_DEST查看日志传输失败的原因。
- (11)同步生产数据库至备份端。笔者常用的方法是将生产数据库置于热备份模式之后,将数据文件用FTP工具传输到备份端,传输完成之后将生产数据库置回END BAKCUP。如果生产数据文件放在ASM中,那么可以通过RMAN将其镜像复制出来。
- (12)在备份端手动应用归档日志(即执行RECOVER STANDBY DATABASE),当STANDBY控制文件和数据文件的SCN值一致时,就可以启用MRP进程自动应用归档日志了。如果数据库版本在Oracle 10g以上,可以在备库开启数据库级别闪回。Oracle 11g企业版推出了Active Data Guard功能,备库的MRP进程可以在READ ONLY状态下应用归档日志,利用这个特性可以将一些只读业务从生产库迁移至备份库中来运行,从而减轻生产库的压力。
- (13)配置完Data Guard之后,就可以进行主、备数据库的角色切换了。角色切换有SWITCHOVER、GRACEFUL FAILOVER和FORCED FAILOVER 3种方式。在进行SWITCHOVER和GRACEFUL FAILOVER切换时要求备库应用完生产库的所有日志,所以这两种方式不会丢失数据,而FORCED FAILOVER相当于将备库通过RESETLOGS选项强制打开,存在丢失数据的风险。
注意 由于配置Data Guard前需要将主库设置为FORCE LOGGING,如果主库中NOLOGGING操作比较多,那么设置FORCE LOGGING之后会影响数据库性能。
2.配置Data Guard相关参数
2.1.日志传输和归档日志存放路径参数
从Oracle 11g开始,生产库和备份库产生的归档日志存放路径都在LOG_ARCHIVE_DEST_N参数指定的路径中,一般将LOG_ARCHIVE_DEST_1参数设置为生产数据库归档日志存放路径,如下所示:
*.log_archive_dest_1='location=/arch/orcl'
在Oracle 10g之前,数据库参数STANDBY_ARCHIVE_DEST主要用于数据库处于备库角色时存放归档日志,如下所示
*.standby_archive_dest='/arch/orcl'
关于生产库日志传输到备份端的参数,可以根据不同的保护模式配置不同的参数。一般情况下,将LOG_ARCHIVE_DEST_2参数设置为在线日志或者归档日志传输参数,如下所示
*.log_archive_dest_2='service=rzorcl lgwr async noaffirm'
数据库参数STANDBY_FILE_MANAGEMENT表示备份库检测到生产库增加数据文件后是否自动增加数据文件,AUTO表示备份端自动增加数据文件,如下所示:
*.standby_file_management='AUTO'
当将数据库参数STANDBY_FILE_MANAGEMENT设置为AUTO时,备库中的以下操作会受到限制:
❑ALTER DATABASE RENAME
❑ALTER DATABASE ADD/DROP LOGFILE
❑ALTER DATABASE ADD/DROP STANDBY LOGFILE MEMBER
❑ALTER DATABASE CREATE DATAFILE AS
2.2.数据文件和日志文件路径转换参数
如果生产库和备份库的数据文件和日志文件使用的是相同的路径,则可以不设置路径转换参数。路径转换参数只在数据库处于备份角色时生效。
对于数据文件路径转换参数,**第一个路径表示生产数据库中数据文件的存放位置,第二个路径表示备份数据库中数据文件的存放位置。**以下示例为路径之间一对一映射,当多对多映射时,应将所有对应路径一一写出来,如下所示:
*.db_file_name_convert='/Tbackup/orcl/oradata','/u01/app/oracle/oradata/orcl'
对于在线日志路径转换参数,**第一个路径表示生产数据库在线日志文件的存放位置,第二个路径表示备份数据库在线日志文件的存放位置。**以下示例为路径之间一对一映射,当多对多映射时,应将所有对应路径一一写出来,如下所示:
*.log_file_name_convert='/Tbackup/orcl/oradata','/u01/app/oracle/oradata/orcl'
除以上参数外,Oracle官方文档还要求配置数据库参数FAL_SERVER、FAL_CLIENT用于检测备库归档日志是否连续,但实践表明,该类参数通常可以不进行配置。
3.配置物理Data Guard示例
环境:
| 主库操作系统 | 备库操作系统 | 数据库版本 |
|---|---|---|
| windows server 2012 | windows server 2012 | oracle 11.2.0.1 |
采用方法:采用主库备份来配置DG,如果主库已经开启了归档,则主库不用关机。
3.1.主库开启强制日志
alter database force logging;
3.2.主备都配置tnsnames.ora文件
orcl = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = **)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) orcladg= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = **)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcladg) ) )
3.3.备库配置静态监听 listener.ora
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = C:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = meddocadg) (Oracle_HOME = C:\oracle\product\10.2.0\db_1) (SID_NAME = orcladg) ) )
测试:
tnsping orcl
tnsping orcladg
3.4.主库生成pfile文件和standby controlfile文件
create pfile='D:\temp\pfile.ora' from spfile;
alter database create standby controlfile as 'D:\temp\control01.ctl';
把主库生成的pfile文件、standby controlfile文件、密码文件传输到备库。
3.5.主库修改参数
alter system set log_archive_config='DG_CONFIG=(orcl,orcladg)' scope=both;
alter system set LOG_ARCHIVE_DEST_1='LOCATION=C:\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl' scope=both;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcladg ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcladg' scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_2=DEFER scope=both;
alter system set FAL_SERVER=orcladg scope=both;
alter system set DB_FILE_NAME_CONVERT='C:\oracle\product\10.2.0\oradata\orcldg','C:\oracle\product\10.2.0\oradata\orcl' scope=both;
alter system set LOG_FILE_NAME_CONVERT='C:\oracle\product\10.2.0\oradata\orcldg','C:\oracle\product\10.2.0\oradata\orcl' scope=both;
3.6.备库pfile.ora修改
在pfile文件中添加如下内容:
DB_UNIQUE_NAME=orcladg LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcladg,orcl)' LOG_ARCHIVE_DEST_1= 'LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcladg' LOG_ARCHIVE_DEST_2= 'SERVICE=orcl ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' LOG_ARCHIVE_DEST_STATE_1=ENABLE LOG_ARCHIVE_DEST_STATE_2=ENABLE DB_FILE_NAME_CONVERT='C:\oracle\product\10.2.0\oradata\orcl','C:\oracle\product\10.2.0\oradata\orcladg' LOG_FILE_NAME_CONVERT='C:\oracle\product\10.2.0\oradata\orcl','C:\oracle\product\10.2.0\oradata\orcladg' STANDBY_FILE_MANAGEMENT=AUTO
根据pfile文件创建相应的目录。
3.7.备份主库
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
sql 'alter system archive log current';
backup database format 'C:\archivelog\backup\single_backup_%U';
release channel c1;
release channel c2;
release channel c3;
}
主库备份完成之后传输备份文件到备库。
3.8.启动备库到mount阶段
Oradim -new -sid orcladg
sqlplus / as sysdba
startup nomount pfile='C:\archivelog\pfile.ora';
--拷贝控制文件到pfile中指定的位置
alter database mount;
3.9.restore备库
rman target /
catalog start with 'C:\backup\';
crosscheck backup
delete expired backup;
restore database;
recover managed standby database disconnect from session;
3.10.创建standby redo log
alter database add standby logfile;
alter database add standby logfile;
alter database add standby logfile;
alter database add standby logfile;
---------------------------------
set lines 200 pages 9999 LONG 5000
col member for a80
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$standby_log a,v$logfile b where a.group#=b.group#;
3.11.开启实时应用
sqlplus / as sysdba
recover managed standby database cancel;
alter database open;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION NODELAY;




