已索引

不论是否使用 broker,该文章均适用。

环境:主(RAC)+ 灾备(RAC,双节点或单节点)

背景

做 FailOver 切换测试时,reinstate database cybankdb 命令失败。
cybankdb 查询 gv$database.open_mode 发现只有一条记录,显示第一个节点为 mounted。
cybankdb 查询第二个节点发现实例被终止了。

本来计划将 cybankdb 第二节点手动启动到 mounted 模式,但是 startup 命令忘记加 mount 选项了,直接成功启动到了 open 阶段,查询 open_mode 为 READ WRITE。也就是说,现在主、备库均被 READ WRITE 的模式启动了。

至此,决定重新同步 ADG。

准备工作

因为现在主备都是可读写状态,首先将备库业务网线拔掉,防止产生意外影响。

然后将主、备的broker均停掉(如果有的话):
SQL> alter system set dg_broker_start=FALSE sid='*';

将主库两个节点手动起来后,将主库集群进行重启,确保主库集群功能正常。

备份备库的参数文件:
SQL> create pfile='/home/xoracle/pfile.cy' from spfile;

配置参数

在主库上配置参数:
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=cybankdbstd LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cybankdbstd' sid='*';
SQL> alter system set FAL_SERVER='cybankdbstd' sid='*';

在备库上配置参数:
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=cybankdb LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cybankdb' sid='*';
SQL> alter system set FAL_SERVER=cybankdb sid='*';

清理备库文件

停止备库数据库:
srvctl stop database -d cybankdbstd

清理备库磁盘组中的文件:
将 +DATADG 和 +FRADG 两个磁盘组中的如下目录下的文件,如果文件删除后目录被自动删除,则创建之:
CONTROLFILE、DATAFILE、DATAGUARDCONFIG、ONLINELOG、ARCHIVELOG、TEMPFILE

配置临时 Oracle 网络

在备库上静态注册一个与 DB_UNIQUE_NAME 不同的临时服务名,然后重启监听,示例如下:
注意:现有的 *_DGMGRL 内容不用删除也不用注释。

[xgrid]$ vim $ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (GLOBAL_DBNAME=cybankdbstdxw)
         (SID_NAME=cybankdbstd)
         (ORACLE_HOME=/opt/database/oracle/product/db_1)
      )
   )
   
[xgrid]$ lsnrctl reload
[xgrid]$ lsnrctl status

然后配置可同时访问主备库的 tnsnames。
只需要在主库第一节点配置 tnsnames 文件即可,然后将 tnsnames 复制到备库第一节点。
*_DGMGRL 相关内容不用删除也不用注释,将原 cybankdb 和 cybankdbstd 的内容注释掉。
这儿的 IP 地址使用的是 【VIP】 或者 PUBLIC IP。

tnsnames 示例如下:

[xoracle]$ vim $ORACLE_HOME/network/admin/tnsnames.ora

cybankdb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.3.119)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cybankdb)
    )
  )

cybankdbstd =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.21.3.119)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cybankdbstdxw)
    )
  )

复制数据库

禁用主、备库归档日志删除任务(如果有的话)。

启动备库第一节点实例启动到 nomount 状态:

[xoracle]$ sqlplus / as sysdba
SQL> startup nomount

在主库第一节点上执行如下命令:

$ rman target / auxiliary sys/xxxx@cybankdbstd nocatalog
-- 直接执行下面的命令就可以,新库没有啥数据
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE;

复制完成后,实例会自动启动到 mounted 状态。

恢复 Oracle 网络

删除备库的 listener.ora 文件中刚才添加的内容,然后重启监听,删除内容示例如下:

[xgrid]$ vim $ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (GLOBAL_DBNAME=cybankdbstdxw)
         (SID_NAME=cybankdbstd)
         (ORACLE_HOME=/opt/database/oracle/product/db_1)
      )
   )
   
$ lsnrctl stop
$ lsnrctl start

主库第一节点 tnsnames,删除刚才新加的内容,取消添加的注释,主、备库均使用 SCAN,同步 tnsnames.ora 备库第一节点。

$ vim $ORACLE_HOME/network/admin/tnsnames.ora

至此,备库会自动到主库上去取缺失的日志文件并进行recover,当备库 alert 日志文件不再变化后,即可打开备库。

打开备库数据库

SQL> alter database open;

启用实时同步

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

检查实时同步

set lines 200;
select open_mode,database_role,switchover_status from v$database;


OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
-------------------- ---------------- --------------------
READ ONLY WITH APPLY PHYSICAL STANDBY NOT ALLOWED

SQL> select name,value from V$DATAGUARD_STATS;

NAME                             VALUE
-------------------------------- ----------------------------------------------------------------
transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time
estimated startup time           32

在主库创建一个测试表,检查备库上是否生成。

重启主库归档路径状态

如果不能同步,则把归档路径1和2分别禁用再启用一下。

重启集群测试

SQL> shutdown immediate;
[xoracle]$ srvctl start database -d cybankdbstd    ---> 第一次重启集群数据库不会随集群自动启动
[root]# /opt/cluster/product/grid/bin/crsctl stop cluster
[root]# /opt/cluster/product/grid/bin/crsctl start cluster

修改备库控制文件快照位置

RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DATADG/snapcf_cybankdbstd.f';
RMAN> show all;

配置归档保护策略

主库:
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;

备库:
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO 'SBT_TAPE' APPLIED ON ALL STANDBY;

恢复日志删除计划

恢复日志删除计划

########################## 下面的步骤是重新配置 broker ##########################

确认主备库状态

SQL> select protection_mode from v$database;

默认就是最大性能,(需要高可用或者高性能状态才能配置??),后面我们使用 broker 将其修改为最大可用模式。

在备库上停用日志实时应用

alter database recover managed standby database using current logfile disconnect from session;
set lines 200;
select name,value from V$DATAGUARD_STATS;

alter database recover managed standby database cancel;

备库开启 flashback database

注意:即使主库打开了闪回后再复制的数据库,备库的闪回也没有打开。

SQL> select flashback_on from gv$database;
$ srvctl stop database -d cybankdb
SQL> startup mount;
SQL> alter database flashback on;
SQL> alter system set db_flashback_retention_target=60 sid='*';
SQL> shutdown immediate;
$ srvctl start database -d cybankdb

说明:

  1. FailOver 后,主库数据可能不一致,这时需要将原主库重建为备库,主库开启闪回后,可以让新备库自动地与新主库同步。
  2. 因为备库切换身份后就是主库,所以在备库上也开启闪回。

在主备库上设置 dg_broker 参数

在主库上设置:

SQL> alter system set dg_broker_config_file1='+DATA/CYBANKDB/dr1cybankdb.dat' sid='*';
SQL> alter system set dg_broker_config_file2='+FRA/CYBANKDB/dr2cybankdb.dat' sid='*';
SQL> alter system set dg_broker_start=TRUE sid='*';

在备库上设置:

SQL> alter system set dg_broker_config_file1='+DATADG/CYBANKDBSTD/dr1cybankdbstd.dat' sid='*';
SQL> alter system set dg_broker_config_file2='+FRADG/CYBANKDBSTD/dr2cybankdbstd.dat' sid='*';
SQL> alter system set dg_broker_start=TRUE sid='*';

生成 broker 配置文件

如果是19c,在备库上执行如下两条命令:

SQL> alter system set log_archive_dest_2='' sid='*';
SQL> alter system reset log_archive_dest_2 sid='*';

不执行的话,19C会报错:

DGMGRL> add database cybankdb as connect identifier is cybankdb_DGMGRL;
Error: ORA-16698: member has a LOG_ARCHIVE_DEST_n parameter with SERVICE attribute set

Failed.

在备库上执行如下命令:

$ dgmgrl
DGMGRL> connect sys@cybankdb_DGMGRL
DGMGRL> create configuration 'cybankdb' as primary database is cybankdb connect identifier is cybankdb_DGMGRL;
DGMGRL> add database cybankdbstd as connect identifier is cybankdbstd_DGMGRL;
DGMGRL> enable configuration;
DGMGRL> show configuration; (稍等一会儿)

说明:启用 broker 后,会启用一个名为 dmon 的进程(Data Guard monitor process)。

设置日志传输模式

DGMGRL> edit database cybankdb set property 'LogXptMode'='SYNC';
DGMGRL> edit database cybankdbstd set property 'LogXptMode'='SYNC';

注意:如果 log_archive_dest_2 看到 仍然是 ASYNC,做一下主备切换就好了。

设置保护模式

DGMGRL> edit configuration set protection mode as maxavailability;    //maxperformance

查看配置

DGMGRL> show configuration [verbose];   -- 多等一会儿
DGMGRL> show database [verbose] "cybankdb";
DGMGRL> show database verbose "cybankdbstd";

实时同步数据

Broker 配置完成后,默认就开起了日志实时同步,如果 v$database.open_mode 显示的是 read only,等一段时间就对了。

还可以通过 dgmgrl 查看备库的信息来查看:

DGMGRL> show database verbose "cybankdbstd";

Database - cybankdbstd

  Role:            PHYSICAL STANDBY
  Intended State:  APPLY-ON
  Transport Lag:   0 seconds (computed 0 seconds ago)
  Apply Lag:       0 seconds (computed 0 seconds ago)
  Apply Rate:      567.00 KByte/s
  Real Time Query: OFF
  Instance(s):
    cybankdbSTD

  Log file locations:
    Alert log               : /opt/database/oracle/diag/rdbms/cybankdbstd/cybankdbstd/trace/alert_cybankdbstd.log
    Data Guard Broker log   : /opt/database/oracle/diag/rdbms/cybankdbstd/cybankdbstd/trace/drccybankdbstd.log

这儿看到 APPLY-ON 表示启用了日志实时应用。

关闭实时同步数据

如果要关闭实时数据同步:

DGMGRL> edit database "cybankdbSTD" set state='APPLY-OFF';
-- By 许望(RHCA、OCM、VCP)
最后修改:2024 年 09 月 11 日 05 : 40 PM
如果觉得我的文章对你有用,请随意赞赏