基于多种场景DataGuard切换方案

来源:这里教程网 时间:2026-03-03 16:38:50 作者:

 

描述

架构说明

为了简单明了的描述生产库、本地容灾、异地容灾三者之间的架构关系以及搭建步骤,现分别用以A 机、B 机、C 机来表示。 本地主库服务器:A 本地备库服务器:B 异地备库服务器:C

硬件环境

以下为方案编写时采用的测试环境,DataGuard 搭建需要在同平台同版本前提下实现,且更多是数据库层面的参数设置,对使用何种操作系统关系不大。 A 机规划:

主机名

IP

型号

操作系统版本

数据库版本

oracledb01

192.168.200.71

X86

RHEL6.4

11.2.0.4

 B 机规划:

主机名

IP

型号

操作系统版本

数据库版本

oracledb02

192.168.200.75

X86

RHEL6.4

11.2.0.4

 C 机规划:

主机名

IP

型号

操作系统版本

数据库版本

oracledb03

192.168.200.67

X86

RHEL6.4

11.2.0.4

 

1.3 DataGuard 切换说明

在异常情况下,本地主库异常宕机,若主库重启之后,能正常使用,只需确保DataGuard 环境保持同步即可;若本地主库,在异常情况下,不可用或暂不可用,为保证业务的连续性,采用DataGuard 切换方案。 本文档针对异常情况发生,主库不可用或暂不可用的场景下,给出的各种切换方案以及主库正常后回切方案。  

同时搭建本地& 异地备库

搭建步骤

步骤

内容

Step 1

主库参数配置

Step 2

本地备库参数文件配置

Step 3

本地备库数据同步

Step 4

异地备库参数文件配置

Step 5

异地备库数据同步

 

主库参数配置

主库参数配置包括确认归档是否打开,force_logging 是否打开,修改主库参数文件,添加网络连接串等等一系列的主库配置信息。

归档开启

确认归档是否开启:

[root@oracledb01 ~]# su - oracle [oracle@oracledb01 ~]$ sqlplus "/ as   sysdba"SQL*Plus: Release 11.2.0.4.0 Production   on Wed Aug 5 10:56:20 2015Copyright (c) 1982, 2013, Oracle.  All rights reserved.Connected to:Oracle Database 11g Enterprise Edition   Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, Real Application   Clusters, Automatic Storage Management, OLAP,Data Mining and Real Application Testing   options SQL> archive log listDatabase log mode              Archive Mode Automatic archival             Enabled Archive destination            /oradata/test/archOldest online log sequence     82Next log sequence to archive   0Current log sequence           83SQL>

  以上说明归档已经开启,如果没有开启请参照一下方法开启归档:

[root@oracledb01 ~]# su - oracle[oracle@oracledb01 ~]$ sqlplus "/ as   sysdba"SQL> alter system set   log_archive_dest_1='location=/oradata/test/arch' scope =both sid='*'; 关闭数据库:SQL>shutdown immediate; 实例启动:SQL>startup mount;SQL> alter database archivelog ;Database altered.SQL> alter database open;Database altered

 

打开数据库force_logging

检查是否打开了force_logging SQL> SELECT FORCE_LOGGING FROM   V$DATABASE;FOR--- YES// 如果状态为YES ,则已经打开,如果状态为NO ,则参考下面步骤:SQL> ALTER DATABASE FORCE LOGGING;

 

添加网络连接串

网络连接串用于连接主备两端数据库,传输归档等作用,具体需要配置如下几个:主库连接串,本地备库连接串,异地备库连接串,详细配置信息如下:

su – oraclecd $ORACLE_HOME/network/admin vi tnsnames.ora 添加如下信息:(如果已经存在以下连接串,酌情考虑添加删除)###################A 机连接串#########################test =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.71)(PORT = 1521))      (CONNECT_DATA =        (SERVER = DEDICATED)        (SERVICE_NAME = test)      )  ) ###################B 机连接串#########################local =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.75)(PORT = 1521))      (CONNECT_DATA =        (SERVER = DEDICATED)        (SERVICE_NAME = test)      )  ) ###################C 机连接串######################### remote =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.67)(PORT = 1521))      (CONNECT_DATA =        (SERVER = DEDICATED)        (SERVICE_NAME = test)      )    ) 

  

修改主库参数文件

备份参数文件:(方便修改参数出现问题及时回退)

[root@oracledb01 ~]# su - oracle[oracle@oracledb01 ~]$ sqlplus "/ as   sysdba" SQL> create pfile='/tmp/inittest20170809.ora' from   spfile;File created.

  主库需要修改的参数如下:

参数

阀值

定义

standby_file_management

AUTO

primary 数据库数据文件发生修改(如新建,重命名等)则按照本参数的设置在standby   中做相应修改。

log_archive_dest_2  

'SERVICE=local   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

归档文件的生成路径,location代表本地机上,service指明在另一台机器上

log_archive_dest_3  

'SERVICE=remote   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

归档文件的生成路径,location代表本地机上,service指明在另一台机器上

fal_server

local,remote  

备库端的参数,给出Oracle网络服务名,通常为指向主库的连接串

fal_client

test

备库端的参数,给出Oracle网络服务名,通常为指向备库的连接串

db_file_name_convert

'/oradata/test/',   '/oradata/test/'

数据库和备用数据库的数据文件转换目录对映

log_file_name_convert

'/oradata/test/', '/oradata/test/'

指明主数据库和备用数据库的log文件转换目录对映

LOG_ARCHIVE_DEST_STATE_1

ENABLE

激活或者不激活定义的归档日志目录,允许redo 传输服务传输redo数据到指定的路径

LOG_ARCHIVE_DEST_STATE_2

ENABLE

激活或者不激活定义的归档日志目录,允许redo 传输服务传输redo数据到指定的路径

LOG_ARCHIVE_DEST_STATE_3

ENABLE

激活或者不激活定义的归档日志目录,允许redo 传输服务传输redo数据到指定的路径

   具体设置如下:

SQL>alter   system set standby_file_management=auto scope=both sid='*';

SQL>alter   system set log_archive_dest_2='SERVICE=local arch ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' scope=both   sid='*';

SQL>alter   system set log_archive_dest_3='SERVICE=remote arch ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' scope=both   sid='*';

SQL>alter   system set db_file_name_convert ='/oradata/test/','/oradata/test/'   scope=spfile sid='*';

SQL>alter   system set log_file_name_convert='/oradata/test/','/oradata/test/'   scope=spfile sid='*';

SQL>ALTER   SYSTEM set LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=both sid='*';

SQL>ALTER   SYSTEM set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both sid='*';

SQL>ALTER   SYSTEM set LOG_ARCHIVE_DEST_STATE_3=ENABLE scope=both sid='*';

 

创建standby redo log 文件

standby redo log 作用在备库,用于接收从主库传过来的日志信息,在主库部署主要是为了方便日后的主备切换

创建适当数量的 Standby Redo Log 组数

  公式如下

1. 如果主库是单实例数据库 :Standby Redo Log 组数 = 主库日志组总数 +1

2.    如果主库是RAC数据库:Standby Redo Log组数=(所有节点中日志组数最大值 + 1) * RAC节点数

3.    大小和生产库redo日志组大小一致

alter database add standby logfile   ('/oradata/test/std_redo01.log') size 500m; alter database add standby logfile   ('/oradata/test/std_redo02.log') size 500m; alter database add standby logfile   ('/oradata/test/std_redo03.log') size 500m; alter database add standby logfile ('/oradata/test/std_redo04.log')   size 500m;

 

主库收集相关文件

1. 创建备库所需参数文件#mkdir –p /backup#chown oracle:oinstall /backup#chmod 775 /backup

sqlplus "/ as sysdba"SQL> create   pfile='/backup/inittest.ora' from spfile;

 2. 创建standby 控制文件:

sqlplus "/as sysdba"SQL> alter database create standby   controlfile as '/backup/control01.ctl';

 3. 拷贝tnsnames.ora 文件:

su – oraclecd $ORACLE_HOME/network/admincp tnsnames.ora /backup

 

4.        拷贝密码文件:

su – oraclecd $ORACLE_HOME/dbscp orapwtest /backup

 

主库相关文件拷贝至备库( 包括本地和异地)

# su – oracle$ cd /backup$ scp * oracle@192.168.200.75:/backup$ scp * oracle@192.168.200.63:/backup

   

备库( 包括本地与异地) 参数配置

环境确认

备库需要确认如下信息:

1.        数据库软件已经正常安装,版本和生产保持一致

2.        监听已经启动

3.        2.2 章节中备份出来的/backup 下面的文件拷贝到备库指定位置

修改备库参数文件

将从生产库拷贝过来的参数文件进行编辑,在保证主库中3.2.4 修改主库参数文件章节中的参数已经确认生效的情况下,修改以下参数 本地备库 需要调整的参数如下:

参数

阀值

定义

log_archive_dest_2  

'SERVICE=remote   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

归档文件的生成路径,location代表本地机上,service指明在另一台机器上

log_archive_dest_3  

'SERVICE=test   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

归档文件的生成路径,location代表本地机上,service指明在另一台机器上

db_file_name_convert

'/oradata/test/',   '/oradata/test/'

数据库和备用数据库的数据文件转换目录对映

log_file_name_convert

'/oradata/test/', '/oradata/test/'

指明主数据库和备用数据库的log文件转换目录对映

control_files

'/oradata/test/control01.ctl'

控制文件指向最新的路径

  本地备库 初始化参数修改

*.audit_file_dest='/oracle/app/admin/test/adump'*.audit_trail='db'*.compatible='11.2.0.4.0' *.control_files='/oradata/test/control01.ctl'*.db_block_size=8192*.db_domain='' *.db_file_name_convert='/oradata/test/','/oradata/test/'*.db_name='test'*.diagnostic_dest='/oracle/app'*.dispatchers='(PROTOCOL=TCP)   (SERVICE=testXDB)'*.log_archive_dest_1='location=/oradata/test/arch' *.log_archive_dest_2='SERVICE=remote ARCH ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' *.log_archive_dest_3='SERVICE=test ARCH ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'*.log_archive_dest_state_2='ENABLE'*.log_archive_dest_state_3='ENABLE' *.log_file_name_convert='/oradata/test/','/oradata/test/'*.open_cursors=300*.pga_aggregate_target=825229312*.processes=150*.remote_login_passwordfile='exclusive'*.sga_target=2475687936 *.standby_file_management='AUTO'*.undo_tablespace='UNDOTBS1'

   异地备库 需要调整的参数如下:

参数

阀值

定义

log_archive_dest_2  

'SERVICE=test arch   ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

归档文件的生成路径,location代表本地机上,service指明在另一台机器上

db_file_name_convert

'/oradata/test/',   '/oradata/test/'

数据库和备用数据库的数据文件转换目录对映

log_file_name_convert

'/oradata/test/', '/oradata/test/'

指明主数据库和备用数据库的log文件转换目录对映

control_files

'/oradata/test/control01.ctl'

控制文件指向最新的路径

  异地备库 初始化参数修改

*.audit_file_dest='/oracle/app/admin/test/adump'*.audit_trail='db'*.compatible='11.2.0.4.0' *.control_files='/oradata/test/control01.ctl'*.db_block_size=8192*.db_domain='' *.db_file_name_convert='/oradata/test/','/oradata/test/'*.db_name='test'*.diagnostic_dest='/oracle/app'*.dispatchers='(PROTOCOL=TCP)   (SERVICE=testXDB)'*.log_archive_dest_1='location=/oradata/test/arch' *.log_archive_dest_2='SERVICE=test ARCH ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'*.log_archive_dest_state_2='ENABLE' *.log_file_name_convert='/oradata/test/','/oradata/test/'*.open_cursors=300*.pga_aggregate_target=825229312*.processes=150*.remote_login_passwordfile='exclusive'*.sga_target=2475687936 *.standby_file_management='AUTO'*.undo_tablespace='UNDOTBS1'

 

拷贝文件到备库指定位置

将之前从生产库/backup 指定文件拷贝到指定路径下面: 参数文件: 拷贝到$ORACLE_HOME/dbs 控制文件: 拷贝到/oradata/test 下面tnsnames.ora: 拷贝到$ORACLE_HOME/network/admin/ 密码文件:拷贝到$ORACLE_HOME/dbs

启动数据库

启动备端数据库到mount 状态:

su – oracleSQL>create spfile from pfile;SQL>startup mount;

 

主库开启日志传输

主库激活RFS

su - oraclesqlplus "/ as sysdba"SQL>alter system set   log_archive_dest_state_2=defer;SQL>alter system set   log_archive_dest_state_2=enable;SQL>alter system set   log_archive_dest_state_3=defer;SQL>alter system set   log_archive_dest_state_3=enable;

  检查日志传输是否报错:

su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=2 or dest_id=3; 检查是否存在报错,如果有报错,检查报错原因

 

备库全量同步

主库rman 全库备份

su -   oracle

$ rman   target /

RMAN>   backup database format '/backup/fulldb_test_%U.bak';

  将主库/backup/ 中的fulldb_test* 文件拷贝到备库服务器/backup  备库全量还原

$ rman target /RMAN>catalog backuppiece   '/backup/fulldb_test_09sbfbg8_1_1.bak';RMAN>catalog backuppiece   '/backup/fulldb_test_0asbfbhl_1_1.bak';RMAN>restore database;

 

备库增量同步

备库开启MRP 进程,进行增量同步

su - oraclesqlplus "/ as sysdba"SQL>alter database recover managed   standby database disconnect from session 或者SQL> alter database recover   managed standby database using  current logfile  disconnect from   session; 

  备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

  备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

   

本地备库切换成主库

本地备库强制切换成主库

在异常情况下,主库不可用,需要将本地备库强制切换成主库

su - oracle$ sqlplus "/ as sysdba"SQL> recover managed standby database   cancel;SQL> recover managed standby database   finish;SQL> select   name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to   switchover to primary;SQL> shutdown immediate;SQL> startup;

 

机主库与C 机备库数据同步

B 机主库激活RFS ,进行日志传输

su - oraclesqlplus "/ as sysdba"SQL>alter system set   log_archive_dest_state_2=defer;SQL>alter system set   log_archive_dest_state_2=enable;

 B 机主库检查日志传输是否报错:

su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=2; 检查是否存在报错,如果有报错,检查报错原因

 C 机备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 C 机备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

  

机主库与A 机备库数据同步

A 机修复后,继续以下操作。B 机主库激活RFS ,进行日志传输

su - oraclesqlplus "/ as sysdba"SQL>alter system set   log_archive_dest_state_3=defer;SQL>alter system set   log_archive_dest_state_3=enable;

 B 机主库检查日志传输是否报错:

su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=3; 检查是否存在报错,如果有报错,检查报错原因

 A 机备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 A 机备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

  

机主库与A 机备库进行主备切换

B 机主库切换成physical standby 角色

su - oraclesqlplus "/ as sysdba"SQL> select   name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to   switchover to physical standby;SQL> shutdown immediate;SQL> startup mount;SQL> recover managed standby database   disconnect from session;

 A 机备库切换成primary 角色

su - oraclesqlplus "/ as sysdba"SQL> select name,open_mode,database_role,switchover_status   from v$database;SQL> alter database commit to   switchover to primary;SQL> shutdown immediate;SQL> startup;

  此时 A 机是主库, B 机是备库 A 机主库检查日志传输是否报错:

su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=2; 检查是否存在报错,如果有报错,检查报错原因

 B 机备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 B 机备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

  

机主库与C 机备库数据同步

A 机主库激活RFS ,进行日志传输

su - oraclesqlplus "/ as sysdba"SQL>alter system set log_archive_dest_state_3=defer;SQL>alter system set   log_archive_dest_state_3=enable;

 A 机主库检查日志传输是否报错:

su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=3; 检查是否存在报错,如果有报错,检查报错原因

 C 机备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 C 机备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

    

异地备库切换成主库

异地备库强制切换成主库

在异常情况下,主库、本地备库均不可用,需要将异地备库强制切换成主库

su - oracle$ sqlplus "/ as sysdba"SQL> recover managed standby database   cancel;SQL> recover managed standby database   finish;SQL> select   name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to   switchover to primary;

 

机主库部署A 机及B 机数据同步

此过程可参照步骤二 

机主库与A 机备库进行主备切换

C 机主库切换成standby 角色

su - oracle$ sqlplus "/ as sysdba"SQL> select name,open_mode,database_role,switchover_status   from v$database;SQL> alter database commit to   switchover to physical standby;SQL> shutdown immediate;SQL> startup mount;SQL> recover managed standby database   disconnect from session;

 A 机备库切换成primary 角色

su - oracle$ sqlplus "/ as sysdba"SQL> recover managed standby database   cancel;SQL> select   name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to   switchover to primary;SQL> shutdown immediate;SQL> startup;

  此时 A 机是主库, C 机是备库。A 机主库检查日志传输是否报错:

su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=3; 检查是否存在报错,如果有报错,检查报错原因

 C 机备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 C 机备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

机主库与B 机备库数据同步

A 机主库激活RFS ,进行日志传输

su - oraclesqlplus "/ as sysdba"SQL>alter system set   log_archive_dest_state_2=defer;SQL>alter system set   log_archive_dest_state_2=enable;

 A 机主库检查日志传输是否报错:

sqlplus "/ as sysdba"SQL> select dest_name,status,error   from v$archive_dest where dest_id=2; 检查是否存在报错,如果有报错,检查报错原因

 B 机备库确认日志传输和应用是否正常

su - oraclesqlplus "/ as sysdba"SQL>select process,status from   v$managed_standby;SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 B 机备库检查alert 日志输出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

相关推荐