RAC+DG高可用数据容灾方案

 

一、       方案背景

目前主库运行环境是单实例oracle 11.2.0.1,该版本比较低,BUG较多,无数据库容灾环境;另外存在一套2节点的RAC数据库服务器,数据库版本是11.2.0.4,该版本稳定可靠,并且硬件配置满足数据库运行需求。为了提高数据库的稳定性,计划将单实例数据库迁移升级到RAC集群数据库,DB版本由11.2.0.1升级至11.2.0.4,并且为了不影响业务的正常运作,减少停机时间,计划用goldengate进行在线迁移(本案暂不做介绍),待迁移完成后,重新部署RAC+DG高可用容灾环境,下面主要介绍RAC+DG高可用容灾方案的实施

 

二、       方案架构

       

 

三、       方案实施

1)     环境介绍:

OS :  Linux部署 

主库数据库版本:11.2.0.3.0 

两个节点的RAC 

节点一:192.168.15.26 

节点二:192.168.15.27

 

standby 数据库版本:  11.2.0.3.0      IP 192.168.15.9

备库只需安装了数据库软件  无须建库

注意:由于目前没有实际环境的具体IP,路径等信息,固该方案以示例形式展示,IP,路径等信息虚构。

 

2)     实施步骤:

2.1  192.168.15.9 这台服务器上安装11.2.0.3数据库软件,不多介绍。

2.2  修改RAC主库参数

参数11g官方手册 book list --DAT--Data Guard Concepts and Administration--3.1 Preparing the Primary Database for Standby Database Creation--3.1.4  中的例子中看到要在主库参数文件里面应该有的的参数(如果没有要添加),如下所示:

DB_NAME=chicago                        #主库的数据库名  
DB_UNIQUE_NAME=chicago                #
主库的数据库名备库 也有属于自己的唯一数据库名
LOG_ARCHIVE_CONFIG='DG_CONFIG=(chicago,boston)'        #
注意括号里主备库的位置  
CONTROL_FILES='/arch1/chicago/control1.ctl', '/arch2/chicago/control2.ctl'     

#这个参数主库不需要改,备库要改成自己存在的路径 

LOG_ARCHIVE_DEST_1=              #这个参数是制定本地(主库)归档日志文件的位置
 'LOCATION=/arch1/chicago/ 
 VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
 DB_UNIQUE_NAME=chicago'      #
这里是备库的数据库唯一名 
LOG_ARCHIVE_DEST_2=            #
这个参数是说是作为主库的这一方要传递联机在线日志到数据库唯一名为boston的备库。
 'SERVICE=boston ASYNC          #
异步传输
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) 
  DB_UNIQUE_NAME=boston'        #
此处填写备库数据库名,
LOG_ARCHIVE_DEST_STATE_1=ENABLE    #
开启传输日志的服务  
LOG_ARCHIVE_DEST_STATE_2=ENABLE    
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE  #
远程登录口令文件用于验证管理用户或重做传输会话时,必须设置成exclusiveshared
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc      #
设置归档日志文件的格式

FAL_SERVER=boston                    #此处是填写备库的数据库名,该参数只是作为standby数据库时才有用

DB_FILE_NAME_CONVERT= '/backup/','+data/jlprojct/datafile/'    #该参数是个静态参数,其作用是在主库执行duplicate时的recovere过程根据主库的数据文件位置转换成这里指定的备库合适的位置,经测试是根据备库的这个参数转变,和主库没有关系,也就是说在主库执行duplicate会根据备库的这个参数指定的位置在备库产生数据文件。如果你在主库添加一个新的数据文件,你必须在备库相应位置建立相应的数据文件。
LOG_FILE_NAME_CONVERT=  #
类似于上一个参数,注意修改这个参数时,如果你的主库的日志文件有若干个不同路径,你都要写进来,
 '/arch1/boston/','/arch1/chicago/','/arch2/boston/','/arch2/chicago/' 

STANDBY_FILE_MANAGEMENT=AUTO    #这个参数是说当你设置成auto后,你在主库添加或删除数据文件,会自动在备库做相应的操作,要注意不要覆写已经存在的数据文件。别起一样的名。

 
如果要求主数据库不能停机(也就是不能重启的话),那么你可以通过以下这些命令修改主库的参数。修改完之后create pfile.ora    ='/backup/pfile.ora from spfile='/Oracle/product/11.2.3/dbs/initJLPROJCT1.ora';

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='location=+arch/jlprojct/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JLPROJCT';

 
System altered.

 

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=JLPROJCT3  ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JLPROJCT3';

 
System altered.

 
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=spfile;

 
System altered.

 
SQL>  ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=spfile;

 
System altered.

 
SQL>  ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE scope=spfile;

 
System altered.

 
SQL> ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' scope=spfile;
    #静态参数,不重启,不起作用 ,所以不让重启可以不改它。 

 
System altered.

 
SQL> ALTER SYSTEM SET FAL_CLIENT = JLPROJCT SCOPE=SPFILE;       # fal_client也是设置本身,fal_server是对方 
 
System altered.

 
SQL> ALTER SYSTEM SET FAL_SERVER = JLPROJCT3 SCOPE=SPFILE;

 
System altered.

 
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=SPFILE;       


System altered.

 

SQL> ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/backup/'+data/jlprojct/datafile/' scope =spfile;    #静态参数,不重启,不起作用 ,所以不让重启可以不改它。 


System altered.

 

SQL> ALTER SYSTEM SET  LOG_FILE_NAME_CONVERT='+DATA/jlprojct/onlinelog/','/backup/','+ARCH/jlprojct/onlinelog/','/backup/'scope =spfile;                          #静态参数,不重启,不起作用 ,所以不让重启可以不改它。 

 
System altered.

 

2.3  修改主库的监听和tnsname.ora 文件

1,主库监听listener.ora文件 添加 (如果有就不修改)

SID_LIST_LISTENER=

  (SID_LIST=

    (SID_DESC=

      (GLOBAL_DBNAME=JLPROJCT)

      (ORACLE_HOME=/oracle/product/11.2.3)

      (SID_NAME=JLPROJCT1)))

 

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.26)(PORT = 1521))           

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  ) 
 
2.
主库tnsname.ora 添加备库的相关信息。

JLPROJCT3 =      #备库的相关信息

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.9)(PORT = 1521))

    (CONNECT_DATA = 

      (SERVER = DEDICATED)

      (SERVICE_NAME = JLPROJCT3)

  (INSTANCE_NAME = JLPROJCT3)

    )

  )


db26 =                  #
主库相关信息  执行duplicate之前 rman 同时连接主库和备库,连接主库时,会用到这个连接字符串。

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.26)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = JLPROJCT)

 

2.4  传输参数,监听等文件

在主库用scp listener.ora  tnsname.ora initJLPROJCT1.orapfile.ora  传给备库 然后进行相应的修改(参数文件不需要修改内容,但是要改名 和备库实例名相对应 [oracle@java3 dbs]$ mv orapwJLPROJCT orapwJLPROJCT3 

 

 [oracle@rac1 ~]$ scp listener.ora tnsnames.ora initJLPROJCT1.ora  oracle@192.168.15.:`pwd`;      #冒号后面的pwd 意思是说要把文件传到备库的当前路径下(也就是此时在主机上 pwd 显示的路径)

把监听的信息改成备库的,tnaname.ora添加主库的相关信息。

 

1.备库监听listener.ora 内容如下:

SID_LIST_LISTENER=

  (SID_LIST=

    (SID_DESC=

      (GLOBAL_DBNAME=JLPROJCT3)

      (ORACLE_HOME=/opt/oracle/product/11.2.0/dbhome_1)

      (SID_NAME=JLPROJCT3)))

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.9)(PORT = 1521))              #主机IP

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

ADR_BASE_LISTENER = /opt/oracle

 

2.备库tnsname.ora 内容:

JLPROJCT =                  #主库相关信息  这里的连接字符串和主库tnsname.ora 里面的不一样,不影响,随便起的名字 

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.26)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = JLPROJCT)


JLPROJCT3 =      #
备库的相关信息      如果仅仅是做standby 数据库,不填他自己这个也行。       

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.9)(PORT = 1521))

    (CONNECT_DATA = 

      (SERVER = DEDICATED)

      (SERVICE_NAME = JLPROJCT3)

  (INSTANCE_NAME = JLPROJCT3)

    )

  )

3.备库参数文件修改    

DB_NAME=JLPROJCT                    #因为就一个数据库  所以此处不变

DB_UNIQUE_NAME=JLPROJCT3    #这里要写成了备库数据库唯一名,便于区分主备库,即使转换角色也不改名。

LOG_ARCHIVE_CONFIG='DG_CONFIG=(JLPROJCT3,JLPROJCT)'      #括号里面和主库括号里面的前后位置改变。 

LOG_ARCHIVE_DEST_1=

 'location=/opt/oracle                          #填上备库有的目录,保证有空闲空间 ,以及有权限读写,     

  VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

  DB_UNIQUE_NAME=JLPROJCT3'          #备库名字

LOG_ARCHIVE_DEST_2=

 'SERVICE=JLPROJCT ASYNC                  #主库的名字

  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

  DB_UNIQUE_NAME=JLPROJCT'            #主库名字

LOG_ARCHIVE_DEST_STATE_1=ENABLE

LOG_ARCHIVE_DEST_STATE_2=ENABLE

REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

LOG_ARCHIVE_FORMAT=%t_%s_%r.arc

FAL_SERVER=JLPROJCT                      #主库名字

DB_FILE_NAME_CONVERT='+data/jlprojct/datafile/','/backup/'            #等号后的两个路径换位置

LOG_FILE_NAME_CONVERT=

'+DATA/jlprojct/onlinelog/','/backup/','+ARCH/jlprojct/onlinelog/','/backup/'          #等号后的两个路径换位置

STANDBY_FILE_MANAGEMENT=AUTO 

 

2.5  在备库上 把修改过后的pfile 创建成spfile,然后 改名 ,并把备库实例启动到nomount状态

SYS@JLPROJCT3> create  pfile from spfile;        
File created.     

 

2.6  在主库上添加standby 日志组

添加的个数为:(主库原来有的个数n+1*线程数 ,这里所说的线程数可以理解为实例的个数,假设这里有10个日志组,所以要添加(10+1*2=22组。大小和路径最好和原来的保持一致, 
DG
有两种传递日志的方式,一种是常见的archivr log,由ARCH的后台进程控制传递到standby数据库,还有一种是和redo log一样的传递方式,由产生redo log的后台进程LGWR控制,后者就需要standby log 
在最大可用和最大保护模式,因为是采用LGWR SYNC进行redo的传送,一定要用standby logfile,但是建议在最大性能模式也添加standby logfile,据说在失败切换时可以恢复更多的数据

添加命令如下:
alter database add standby logfile group 15 ('+DATA/jlprojct/onlinelog/group_15') size 2000M;

 

2.7  在主库进行测试  成功后继续进行  ,打开主备库的监听,关闭防火墙,

[oracle@rac1 ~]$ tnsping JLPROJCT3

 TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 05-MAR-2015 17:45:23

 Copyright (c) 1997, 2011, Oracle.  All rights reserved.

 Used parameter files:


 Used TNSNAMES adapter to resolve the alias
 Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.9)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = JLPROJCT3) (INSTANCE_NAME = JLPROJCT3)))
 OK (0 msec)

[oracle@rac1 ~]$ tnsping db26

 TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 05-MAR-2015 17:46:43

 Copyright (c) 1997, 2011, Oracle.  All rights reserved.

 Used parameter files:


 Used TNSNAMES adapter to resolve the alias
 Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.26)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = JLPROJCT)))
 OK (10 msec) 


在主库用rman 同时连接主备库。 
[oracle@rac1 ~]$  rman target sys/xxxxx@db26 auxiliary sys/xxxxx@JLPROJCT3

 Recovery Manager: Release 11.2.0.3.0 - Production on Thu Mar 5 17:51:23 2015

 Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 connected to target database: JLPROJCT (DBID=2115662724)
 connected to auxiliary database: JLPROJCT (not mounted )

 

2.8  在主库执行duplicate命令,最关键的一步,备份主库的控制文件,数据文件,日志文件,然后传给备库,并在备库recover ,如果没有报错的话,备库就会Open了。

RMAN> duplicate target database for standby from active database  nofilenamecheck;  --重点操作

 

2.9  read only  的方式,打开备库数据库实例。

SYS@JLPROJCT3> alter database open read only;

 Database altered.

 

2.10         在备库打开MRP进程 ,应用日志,重演变化。注意:一定要保证备库实例是在 read only 的方式下打开的否则不能同步。

SYS@JLPROJCT3> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

 Database altered.      –启动同步进程

 

2.11         测试结果:在主库随便建立一个用户,并在这个用户下建立一个表,发现备库也会有,证明DG搭建成功。