基于多种场景DataGuard切换方案

 

描述

1.1 架构说明

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

本地主库服务器:A

本地备库服务器:B

异地备库服务器:C

1.2 硬件环境

以下为方案编写时采用的测试环境,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 切换方案。 本文档针对异常情况发生,主库不可用或暂不可用的场景下,给出的各种切换方案以及主库正常后回切方案。


 

同时搭建本地& 异地备库

2.1 搭建步骤

步骤

内容

Step 1

主库参数配置

Step 2

本地备库参数文件配置

Step 3

本地备库数据同步

Step 4

异地备库参数文件配置

Step 5

异地备库数据同步

 

2.2 主库参数配置

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

2.2.1 归档开启

确认归档是否开启:

[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 2015

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, Real Application   Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Testing   options

SQL> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /oradata/test/arch

Oldest online log sequence     82

Next log sequence to archive   0

Current log sequence           83

SQL>

 

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

[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

 

2.2.2 打开数据库force_logging

检查是否打开了force_logging

SQL> SELECT FORCE_LOGGING FROM   V$DATABASE;

FOR

---

YES

// 如果状态为YES ,则已经打开,如果状态为NO ,则参考下面步骤:

SQL> ALTER DATABASE FORCE LOGGING;

 

2.2.3 添加网络连接串

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

su – oracle

cd $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)

      )

    ) 

 

 

2.2.4 修改主库参数文件

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

[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='*';

 

2.2.5 创建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;

 

2.2.6 主库收集相关文件

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 – oracle

cd $ORACLE_HOME/network/admin

cp tnsnames.ora /backup

 

4.        拷贝密码文件:

su – oracle

cd $ORACLE_HOME/dbs

cp orapwtest /backup

 

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

# su – oracle

$ cd /backup

$ scp * oracle@192.168.200.75:/backup

$ scp * oracle@192.168.200.63:/backup

 


 

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

2.3.1 环境确认

备库需要确认如下信息:

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

2.        监听已经启动

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

2.3.2 修改备库参数文件

将从生产库拷贝过来的参数文件进行编辑,在保证主库中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'

 

2.3.3 拷贝文件到备库指定位置

将之前从生产库/backup 指定文件拷贝到指定路径下面:

参数文件: 拷贝到$ORACLE_HOME/dbs

控制文件: 拷贝到/oradata/test 下面

tnsnames.ora: 拷贝到$ORACLE_HOME/network/admin/

密码文件:拷贝到$ORACLE_HOME/dbs

2.3.3 启动数据库

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

su – oracle

SQL>create spfile from pfile;

SQL>startup mount;

 

2.4 主库开启日志传输

主库激活RFS

su - oracle

sqlplus "/ 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 - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2 or dest_id=3;

检查是否存在报错,如果有报错,检查报错原因

 

2.5 备库全量同步

主库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;

 

2.6 备库增量同步

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

su - oracle

sqlplus "/ 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 - oracle

sqlplus "/ 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

 


 

本地备库切换成主库

3.1 本地备库强制切换成主库

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

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;

 

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

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

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set   log_archive_dest_state_2=defer;

SQL>alter system set   log_archive_dest_state_2=enable;

 

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

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2;

检查是否存在报错,如果有报错,检查报错原因

 

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

su - oracle

sqlplus "/ 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

 

 

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

A 机修复后,继续以下操作。

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

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set   log_archive_dest_state_3=defer;

SQL>alter system set   log_archive_dest_state_3=enable;

 

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

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=3;

检查是否存在报错,如果有报错,检查报错原因

 

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

su - oracle

sqlplus "/ 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

 

 

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

B 机主库切换成physical 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> 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 - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2;

检查是否存在报错,如果有报错,检查报错原因

 

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

su - oracle

sqlplus "/ 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

 

 

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

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

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set log_archive_dest_state_3=defer;

SQL>alter system set   log_archive_dest_state_3=enable;

 

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

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=3;

检查是否存在报错,如果有报错,检查报错原因

 

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

su - oracle

sqlplus "/ 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

 

 


 

异地备库切换成主库

4.1 异地备库强制切换成主库

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

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;

 

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

此过程可参照步骤二

 

4.3 C 机主库与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 - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=3;

检查是否存在报错,如果有报错,检查报错原因

 

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

su - oracle

sqlplus "/ 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

 

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

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

su - oracle

sqlplus "/ 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 - oracle

sqlplus "/ 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

 


请使用浏览器的分享功能分享到微信等