Oracle 11.2 DataGuard RAC To RAC搭建

Oracle 11.2 DataGuard RAC To RAC搭建

备库相关命名统一命名:dg

1. 主库准备

1.1 主库归档与force loggin

# 检查是否处于归档模式,如果未处于归档,开启归档,开启归档方法不赘述
SQL> archive log list;
# 开启force logging
SQL> alter database force loggin;

1.2 主库参数修改

# 下面参数为动态参数,可以动态修改memory与spfile
SQL > alter system set log_archive_config='DG_CONFIG=(primary,primarydg)' scope=both sid='*';
SQL > alter system set log_archive_dest_2='SERVICE=primarydg ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primarydg' scope=both sid='*';
SQL > alter system set FAL_CLIENT='primary' scope=both sid='*';
SQL > alter system set FAL_SERVER='primarydg' scope=both sid='*';
SQL > alter system set standby_file_management=auto scope=both sid='*';
# 静态参数,如果路径相同,可以不做转换,需要重启主库生效
# 语法为:转换前,转换后,两个一对
SQL > alter system set db_file_name_convert='convert_before','convert_after' scope=spfile sid='*';
SQL > alter system set log_file_name_convert='convert_before','convert_after' scope=spfile sid='*';

1.3 主库添加standby log

# 可以不指定thread,默认为public thread,大小与现有必须一致,组数Oracle建议比online redo log多一组
# 添加standby log,后续恢复备库,备库就无需再添加standby log,standby log是为了可以real-time apply
# thread 1
SQL> alter database add standby logfile thread 1 group N '+DATA' size 4G;
...
# thread 2
SQL> alter database add standby logfile thread 2 group N '+DATA' size 4G;
...
# 查询
SQL> select inst_id,thread#,group#,status,bytes/1024/1024 MB from gv$standby_log order by 1,2,3;

2. 主备库配置tns与备库静态监听注册

2.1 主备库tnsnames.ora文件配置

# 为了以后使用方便,为主备库各配置三个tns alias
# primary database
PRIMARY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node1_vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node2_vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = honor)
    )
  )
PRIMARY1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node1_vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = honor)
    )
  )
PRIMARY2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node2_vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = honor)
    )
  )
# standby database
PRIMARYDG =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = std_node1_vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = std_node2_vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = honor)
    )
  )
PRIMARYDG1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = std_node1_vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = honor)
    )
  )
PRIMARYDG2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = std_node2_vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = honor)
    )
  )

2.2 备库静态监听注册 (optional)

其实配置静态监听是为了备库启动在nomount状态时,可以远程连接使用rman duplicate方式搭建备库,如果使用备份搭建备库,或者在主库tnsnames.ora中增加(UR = A)也可以不使用静态监听,根据需求以及习惯选择即可。

# 由于nomount状态备库注册到监听中为blocked不能提供远程连接,所以可以配置静态监听方式,静态注册unknown状态的实例供远程连接使用duplicate搭建备库。
# 备库一节点
$ vi $GRID_HOME/network/admin/listener.ora
SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (GLOBAL_DBNAME=primarydg)
         (SID_NAME=primarydg1)
         (ORACLE_HOME=/u01/app/11.2/grid)
       )
      )
# 备库二节点
$ vi $GRID_HOME/network/admin/listener.ora
SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (GLOBAL_DBNAME=primarydg)
         (SID_NAME=primarydg2)
         (ORACLE_HOME=/u01/app/11.2/grid)
       )
      )
# 重启监听     
$ srvctl stop listener -l LISTENER -n std_node1/2
$ srvctl start listener -l LISTENER -n std_node1/2

3. 生成备库pfile与拷贝主库密码文件

3.1 备库pfile与参数修改

# 主库spfile生成pfile,修改相应参数生成备库pfile
# 主库
SQL> create pfile='/tmp/a.txt' from spfile;
# pfile拷贝到备库,并修改以下相关参数
# 备库
*.control_files='+DATA','+FRA'   # 如果备库为磁盘组或使用OMF,则写到磁盘组或路径即可,Oracle会在恢复时自动修改该参数实际恢复值
*.db_create_file_dest='+DATA'
*.db_unique_name='primarydg'
*.audit_file_dest='/u01/app/oracle/admin/primary/adump'
*.db_file_name_convert=''
*.log_file_name_convert=''
# 其他可选是否修改参数
1. 内存相关参数,如果备库内存与主库不同,根据实际情况,修改备库pfile相应内存参数。
2. 一些路径,如果备库ADR目录、FRA目录与主库不同,根据备库实际进行修改。
3. local_listener/remote_listener,根据实际备库进行修改。
# 主库拷贝pfile到备库任意节点
$ scp /tmp/a.txt std_node1:/tmp/a.txt

3.2 拷贝主库密码文件

# 拷贝主库密码文件到备库2个节点
# 主库 login as oracle
$ scp $ORACLE_HOME/dbs/orapwprimary1 std_node1:$ORACLE_HOME/dbs/orapwdprimarydg1
$ scp $ORACLE_HOME/dbs/orapwprimary1 std_node1:$ORACLE_HOME/dbs/orapwdprimarydg2

4. 主库duplicate搭建备库

4.1 备库准备

# 备库任意节点
$ export ORACLE_SID=primarydg1
SQL > startup nomount pfile='/tmp/a.txt';
# 主备库测试所有tns条目连接
$ sqlplus sys/password@tns as sysdba

4.2 主库duplicate

# 准备脚本
$ vi rman_duplicate.sh
#!/bin/sh
# script start
export ORACLE_SID=
export ORACLE_HOME=
rman target sys/password@primary auxiliary sys/password@primarydg >/tmp/rman_duplicate.log << EOF
run{
allocate channel c1 type disk;
...
allocate auxiliary channel ca1 type disk;
...
duplicate target database for standby from active database nofilenamecheck noredo;
release channel c1;
...
release channel ca1;
...
}
#script end
# 主库执行脚本
$ chmod +x rman_duplicate.sh
$ nohup ./rman_duplicate.sh &
# 说明
# from active database子句指定使用主库数据文件进行duplicate,如果没有该子句,则使用rman备份方式,需要有可读的rman备份可用。
# noredo,duplicate之后不使用归档进行恢复,可以不指定
# 如果duplicate失败,无法创建文件,检查oracle/grid用户$ORACLE_HOME/bin/oracle文件是否权限一致或oracle用户下该文件是否有asmadmin权限
# login as oracle
$ chown oracle:asmadmin $ORACLE_HOME/bin/oracle
$ chmod 6751 $ORACLE_HOME/bin/oracle

5. 备库后续工作

5.1 pfile位置

# spfile放置到ASM磁盘组
# 备库
SQL> create spfile='+DATA' from spfile;
# 备库任意节点确定spfile生成位置以及名称
# login as grid
$ asmcmd --进入之后,查看spfile具体位置以及名称
# 备库俩节点
# login as oracle
$ cd $ORACLE_HOME/dbs
$ vi initprimarydg1.ora
spfile='PATH'  --填入上一步确定的路径以及文件
# 重启数据库,确定spfile位置正确

5.2 备库数据库加入集群

# login as oracle
$ srvctl add database -d  -n  -o  -p  -r physical_standby
$ srvctl add instance -d primarydg -i primarydg1 -n std_node1
$ srvctl add instance -d primarydg -i primarydg2 -n std_node2

5.3 备库打开数据库开启应用

# 两节点打开数据库
# login as oracle
$ srvctl start database -d primarydg
# 如果数据库无法打开二节点,则根据日志排查相关,如有必要,在一节点修改spfile中与实例相关参数,如参数正确根据报错排查即可
# 相关参数以及命令参考示例
SQL> alter system set cluster_database=true scope=spfile sid='*';
SQL> alter system set cluster_database_instances=2 scope=spfile sid='*';
SQL> alter system set instance_number=1 scope=spfile scope=spfile sid='primarydg1';
SQL> alter system set instance_number=2 scope=spfile scope=spfile sid='primarydg2';
SQL> alter system set thread=1 scope=spfile sid='primarydg1';
SQL> alter system set thread=2 scope=spfile sid='primarydg2';
SQL> alter database enable thread 2;
# 在其中一个节点开启redo apply
SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> select open_node from v$database;

6. Switchover

6.1 转换前检查

在做角色转换前请检查如下项:

  1. 确认主数据库和备用数据库的初始化参数都支持双重角色,特别关注参数log_archive_des_n 和valid_for属性
  2. 确认主数据库和备用数据库主机都有TNS别名配置,并且正确
  3. 为了快速高效的实现角色转换,应该断开所有用户连接(停止业务和数据库的连接)
  4. 确认原standby 库的临时表空间是重建好的
  5. 确认备库redo log位置转换正确

6.2 转换

# 第一步:在oracle rac 执行角色切换时,必须关闭除用于角色转换用的实例以外的其他全部实例
$ srvctl stop instance -d db_name -i instnace_name
# 第二步:开始角色转换前,需要检查主数据库是否可以进行转换,查询视图 V$DATABASE中SWITCHOVER_STATUS字段
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS 
 ----------------- 
 TO STANDBY 
# 如果查询结果返回TO STANDBY,说明可以转换。如果查询为SESSIONS ACTIVE,在切换时应加上WITH SESSION SHUTDOWN子句,如果为其他值则可能存在某种配置问题,无法执行角色转换。
# 第三步:执行主库执行角色转换
# 如果第二步返回TO STANDBY,执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY
# 如果第二步返回的是SESSIONS ACTIVE,执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
# 第四步:为了完成主数据库到物理备用数据库的转换,必须关闭并装载原来的主数据库
SQL> SHUTDOWN ABORT;
SQL> STARTUP MOUNT;
# 第五步:关闭standby数据库除了执行角色转换命令的实例外的其他实例
$ srvctl stop instance -d db_name -i instnace_name
# 第六步:查询standby数据库是否可以转换为主库
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS 
----------------- 
TO_PRIMARY 
# 如果返回值是TO_PRIMARY,说明可以执行转换为主库,如果返回为SESSIONS ACTIVE,在执行时应加上WITH SESSION SHUTDOWN子句。
# 第七步:执行角色切换,把备库切换成主库
# 如果第六步返回TO_PRIMARY 执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
# 如果第六步返回SESSIONS ACTIVE执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
# 第八步:修改集群的配置,修改后打开数据库
# 在新的主库上执行:
$ srvctl modify database -d db_unique_name -n db_name -r primary 
$ srvctl start database -d db_unique_name
# 在新的备库上执行:
$ srvctl modify database -d db_unique_name -n db_name -r physical_standby 
$ srvctl start database -d db_unique_name
# 第九步:为新的备库启动恢复管理模式
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
请使用浏览器的分享功能分享到微信等