已索引
不论是否使用 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
说明:
- FailOver 后,主库数据可能不一致,这时需要将原主库重建为备库,主库开启闪回后,可以让新备库自动地与新主库同步。
- 因为备库切换身份后就是主库,所以在备库上也开启闪回。
在主备库上设置 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';