暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ADG + Far Sync HA

原创 liketoochao 2024-04-28
391

环境描述

角色 IP地址 hostsname DB_unique_name 实例名 监听服务 控制文件
主库 192.168.10.91 primary-database orcl orcl Listener /u01/app/oracle/oradata/orcl/control01.ctl,/u01/app/oracle/fast_recovery_area/orcl/control02.ctl
备库 192.168.10.94 standby-dtabase orcl orcl Listener
far_sync_01 192.168.10.92 far-snyc-01 orcl orcl Listener
far_sync_02 192.168.10.93 far-sync-02 orcl orcl Listener

本次实验的构架:

在 Oracle DG 中,从主库到备库的日志传输有sync和async两种方式,sync的方式能够实现数据实时传输,但如果遇到网络中断等原因,就可能导致数据丢失。因此,在Oracle 12c中提出了 Far Sync instance 的解决方案,事实上是一种零数据丢失的同步机制。

部署 ADG

FAR SYNC的两台服务器的话直接克隆的备库主机,克隆后删除数据文件即可;重新搭建的话只需要ORACLE软件,不需要建立数据库
http://bytesystem.online/doc/2564/

部署 far sysnc

主库创建控制文件

step 1.创建控制文件

SYS@primary> alter database create far sync instance controlfile as '/home/oracle/fs01.ctl';

Database altered.

SYS@primary>

step 2.创建 pfile 文件

SYS@primary> create pfile='/home/oracle/initorcl.ora' from spfile;

File created.

SYS@primary>

拷贝文件

传输控制文件,pfile,密码文件文件到 Far Sync instance 节点

scp /u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapworcl oracle@192.168.10.93:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/
scp /u01/app/oracle/product/19.3.0/dbhome_1/dbs/initorcl.ora oracle@192.168.10.93:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/
scp /home/oracle/fs01.ctl oracle@192.168.10.93:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/

主库部署

step 1.编辑 tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = primary-database)(PORT = 1521))

PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

FARSYNC01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
  
FARSYNC02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

step 2.配置 DB_UNIQUE_NAME

alter system set db_unique_name='primary';

step 3.配置 FAL_SERVER

alter system set fal_server='standby';

alter system set fal_client='primary';

fal_server的值写的是tnsname中的服务名,这里主库上设置的fs的服务名是小写的就小写

step 4.配置 LOG_ARCHIVE_CONFIG

alter system set log_archive_config='dg_config=(primary,farsync01,farsync02,standby)';

dg_config是写db_unique_name的值。

step 5.配置 log_archive_dest
LOG_ARCHIVE_DEST_1 指向本地归档路径

alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(online_logfile,primary_role) DB_UNIQUE_NAME=orcl';

LOG_ARCHIVE_DEST_2 指向fs1机器,使用sync

# farsync01
alter system set log_archive_dest_2='service=FARSYNC01 lgwr SYNC affirm max_failure=1 alternate=log_archive_dest_2 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=farsync01';

LOG_ARCHIVE_DEST_3 指向fs2机器,使用sync

# farsync02
alter system set log_archive_dest_3='service=FARSYNC02 lgwr ASYNC  alternate=log_archive_dest_3 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=farsync02';

配置 Far Sync 1 实例

FarSync 实例添加 standby log,该配置已经在DG环境中添加。无需重复操作。

step 1.配置 FarSync 实例的 tnsnames

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-01)(PORT = 1521))


PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

FARSYNC01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
  
FARSYNC02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

step 2.创建相应的文件目录

mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area/orcl
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/oradata/orcl

step 3.启动到 nomount

SQL> startup nomount

step 4.配置 DB_UNIQUE_NAME

alter system set db_unique_name='farsync01';

step 5.配置 FAL_SERVER

alter system set fal_server='primary,standby';

alter system set fal_client='farsync01';

step 6.配置log_archive_config

alter system set log_archive_config='dg_config=(primary,farsync01,farsync02,standby)';

step 7.配置 log_archive_dest_n
log_archive_dest_1,写归档到本地归档路径

alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl';

log_archive_dest_2,写归档到备库,用async的方式,因为主到fs是sync,fs到备库是async。

  • 当主库归档写到 fs1 ,fs1 传送到备库; fs1 故障不可用时,归档写入到fs2
alter system set log_archive_dest_2='service=STANDBY async valid_for=(standby_logfiles,standby_role) db_unique_name=standby';
  • 当备库归档写到 fs1 ,fs1 传送到备库; fs1 故障不可用时,归档写入到fs2
alter system set log_archive_dest_3='service=PRIMARY async valid_for=(standby_logfiles,standby_role) db_unique_name=primary';

step 8.恢复控制文件

[oracle@far-sync-01 dbs]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Apr 28 11:37:24 2024
Version 19.3.0.0.0

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

connected to target database: ORCL (not mounted)

RMAN> restore controlfile from '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/fs01.ctl';

Starting restore at 2024-04-28 11:38:17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=261 device type=DISK

channel ORA_DISK_1: copied control file copy
output file name=/u01/app/oracle/oradata/ORCL/control01.ctl
output file name=/u01/app/oracle/oradata/ORCL/control02.ctl
Finished restore at 2024-04-28 11:38:21

RMAN>

step 9.在 Far Sync 实例服务器创建监听器(过程略)。
step 10.启动到 mount

SQL> alter database mount;

恢复后再后续的启动中就只需要启动到 mount 状态即可
step 11.创建standby redo log
在Far Sync实例创建standby redo log,standby redo log大小等于主库online redo log大小:

alter database drop standby logfile group 4;
alter database drop standby logfile group 5;
alter database drop standby logfile group 6;
alter database drop standby logfile group 7;

alter database add standby logfile group 8 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO08.LOG' size 200M;
alter database add standby logfile group 9 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO09.LOG' size 200M;
alter database add standby logfile group 10 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO10.LOG' size 200M;
alter database add standby logfile group 11 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO11.LOG' size 200M;

配置 Far Sync 2 实例

FarSync 实例添加 standby log,该配置已经在DG环境中添加。无需重复操作。

step 1.配置 FarSync 实例的 tnsnames

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-01)(PORT = 1521))


PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

FARSYNC01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
  
FARSYNC02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

step 2.创建相应的文件目录

mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area/orcl
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/oradata/orcl

step 3.启动到 nomount

SQL> startup nomount

step 4.配置 DB_UNIQUE_NAME

alter system set db_unique_name='farsync02';

step 5.配置 FAL_SERVER

alter system set fal_server='primary,standby';

alter system set fal_client='farsync02';

step 6.配置log_archive_config

alter system set log_archive_config='dg_config=(primary,farsync01,farsync02,standby)';

step 7.配置 log_archive_dest_n
log_archive_dest_1,写归档到本地归档路径

alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl';

log_archive_dest_2,写归档到备库,用async的方式,因为主到fs是sync,fs到备库是async。

  • 当主库归档写到 fs2 ,fs2 传送到备库; fs2 故障不可用时,归档写入到fs1
alter system set log_archive_dest_2='service=STANDBY async  valid_for=(standby_logfiles,standby_role) db_unique_name=standby';
  • 当备库归档写到 fs1 ,fs1 传送到备库; fs1 故障不可用时,归档写入到fs2
alter system set log_archive_dest_3='service=PRIMARY async valid_for=(standby_logfiles,standby_role) db_unique_name=primary';

step 8.恢复控制文件

[oracle@far-sync-01 dbs]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Apr 28 11:37:24 2024
Version 19.3.0.0.0

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

connected to target database: ORCL (not mounted)

RMAN> restore controlfile from '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/fs01.ctl';

Starting restore at 2024-04-28 11:38:17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=261 device type=DISK

channel ORA_DISK_1: copied control file copy
output file name=/u01/app/oracle/oradata/ORCL/control01.ctl
output file name=/u01/app/oracle/oradata/ORCL/control02.ctl
Finished restore at 2024-04-28 11:38:21

RMAN>

step 9.在 Far Sync 实例服务器创建监听器(过程略)。
step 10.启动到 mount

SQL> alter database mount;

恢复后再后续的启动中就只需要启动到 mount 状态即可
step 11.创建standby redo log
在Far Sync实例创建standby redo log,standby redo log大小等于主库online redo log大小:

alter database drop standby logfile group 4;
alter database drop standby logfile group 5;
alter database drop standby logfile group 6;
alter database drop standby logfile group 7;

alter database add standby logfile group 8 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO08.LOG' size 200M;
alter database add standby logfile group 9 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO09.LOG' size 200M;
alter database add standby logfile group 10 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO10.LOG' size 200M;
alter database add standby logfile group 11 '/u01/app/oracle/oradata/ORCL/STANDBY_REDO11.LOG' size 200M;

备库配置

step 1.编辑 tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = standby-database)(PORT = 1521))


PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby-database)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

FARSYNC01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

FARSYNC02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = far-sync-02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

step 2.配置 DB_UNIQUE_NAME

alter system set db_unique_name='standby';

step 3.配置 FAL_SERVER

alter system set fal_server='primary';

alter system set fal_client='standby';

step 4.配置LOG_ARCHIVE_CONFIG

alter system set log_archive_config='dg_config=(primary,farsync01,farsync02,standby)';

dg_config是写db_unique_name的值。

step 5.配置 log_archive_dest
LOG_ARCHIVE_DEST_1 指向本地归档路径

alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(online_logfile,primary_role) DB_UNIQUE_NAME=orcl';

LOG_ARCHIVE_DEST_2 指向fs1机器,使用sync

# farsync01
alter system set log_archive_dest_2='service=FARSYNC01 lgwr SYNC affirm max_failure=1 alternate=log_archive_dest_2 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=farsync01';

LOG_ARCHIVE_DEST_3 指向fs2机器,使用sync

# farsync02
alter system set log_archive_dest_3='service=FARSYNC02 lgwr ASYNC  alternate=log_archive_dest_3 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=farsync02';

检查配置情况

# 查看dataguard_config
select * from  V$DATAGUARD_CONFIG;

# 查看同步情况
select * FROM V$DATAGUARD_STATS;

select dest_id,status,error from v$archive_dest;

启动

step 1.关闭所有 FAR 服务的数据库
step 2.重启主库

SQL> shutdown immediate
SQL> startup

step 3.重启备库

SQL> shutdown immediate
SQL> startup
SQL> alter database recover managed standby database using current logfile disconnect from session;

step 4.启动FAR Sync 节点一

SQL> startup mount

step 5.启动FAR Sync 节点二

SQL> startup mount

主库查看保护级别

SQL> select open_mode,protection_mode,protection_level,switchover_status from v$database;

OPEN_MODE         PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS
-------------------- -------------------- -------------------- --------------------
READ WRITE         MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  TO STANDBY

发现并不是最大可用模式,我们进行调整,语法:

SQL> alter database set standby database to maximize availability;

Database altered.

SQL> select open_mode,protection_mode,protection_level,switchover_status from v$database;

OPEN_MODE         PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS
-------------------- -------------------- -------------------- --------------------
READ WRITE         MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY TO STANDBY

一个 Far Sync 实例,如果出现问题,虽然能够保证 redo 直接传输到 standby 库,但是 primary 库保护模式从最大可用模式(MaximumAvailability)降为最大性能模式(Maximum Performance)。 因此我们可以在距离主库较近的地点设置 2 个 FarSync 实例保证高可用性。当一个 Far Sync实例不可用, primary 库自动使用备用 FarSync 库,并且 primary 库保护模式保持最大可用模式(Maximum Availability) 不变,零数据丢失。

节点启动状态

主库查看命令:

set linesize 160
select * from v$dataguard_config;

理论上是未应用的那个unknown !! 状态的话主库认识到状态未FAR就会发送日志过去

查看Far Sync实例状态

select protection_mode,database_role,protection_level,open_mode from v$database;

查看日志有没有问题

手工切换日志,可在下方命令查询后切换此命令,再次查询,看是否由改变

alter system archive log current;

主库:

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
       279


far sync:

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
       279

备库:

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
       279

FARsync2:

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
       276   ---这个日志没有与他们一样是因为没有应用,FAR1 宕机后就会通过这个来应用

测试FarSync

数据同步测试

测试备用链路切换

主备切换测试

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论