在之前的博客,我们看了Oracle 18c Data Guard 环境的搭建, 这里我们看下其他几个与DG相关的内容。
Oracle 18c Data Guard 搭建手册
https://www.cndba.cn/dave/article/2995
1 查看DG是否正常
搭建好DG后腰验证DG是否同步正常,可以直接在主库创建测试表,看数据能否同步过去,另外就是查看相关配置是否正常,然后切换下日志,看备库是否正常应用。
#主库查看对应的archive_dest 是否正常,这里正常可以保证归档数据可以传送到备库:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select DEST_NAME,STATUS,ERROR from v$archive_dest where DEST_ID=2;
DEST_NAME STATUS ERROR
------------------------- ------------------ --------------------------------------
LOG_ARCHIVE_DEST_2 VALID
#备库检查MRP进程是否启动:
SQL> select process,status,sequence# from v$managed_standby;
PROCESS STATUS SEQUENCE#
------------------ ------------------------ ----------
ARCH CONNECTED 0
DGRD ALLOCATED 0
DGRD ALLOCATED 0
ARCH CLOSING 17
ARCH CONNECTED 0
ARCH CLOSING 18
MRP0 APPLYING_LOG 19
RFS IDLE 0
RFS IDLE 19
RFS IDLE 0
10 rows selected.v
#如果没有启动,手工启动MRP:
SQL> alter database recover managed standby database disconnect;
Database altered.
#备库检查日志是否apply,因为可能日志传过来,但并没有入库,在主备库同时查询,2边一致,DG就是同步的。
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select sequence#,applied from v$archived_log;
SEQUENCE# APPLIED
---------- ------------------
9 YES
10 YES
11 YES
12 YES
13 YES
14 YES
15 YES
16 YES
17 YES
18 YES
10 rows selected.
2 启用Real-Time Apply
在Oracle 12c 之前的Data Guard 环境中,默认情况下备库apply redo 是从备库的归档文件中读数据的。在Oracle 12c 中,默认的策略改成直接从standby redo log file中读取,采用real-time apply的方式进行。
对于物理standby,如果配置了standby redo日志并且处于ARCHIVELOG模式,在执行alter database recover managed standby database语句启动MRP时默认就是Real-Time Apply。
如果想取消MRP,执行以下语句:
SQL> alter database recover managed standby database cancel;
关于该特性的详细说明,可以参考我的博客:
Oracle 12c 新特性 — DG 默认使用 Real-Time Apply
https://www.cndba.cn/cndba/dave/article/213
3 DG保护模式切换
Oracle DG有三种不同的保护模式供选择:最大可用(Maximum Availability),最大性能(Maximum Performance),最大保护(Maximum Protection)。关于他们的区别这里不再描述,可以参考官方手册的说明。 Oracle 默认采用的是最大性能。
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------------------------- -------------------------------- ------------------------
MAXIMUM PERFORMANCE PRIMARY MAXIMUM PERFORMANCE
三种模式之前切换的时候,有2个必要条件:
- 配置了standby redo log
- Log_archve_dest_2 参数需要配置sync, affirm的方式, 这个我们在安装的时候已经配置过。
alter system set log_archive_dest_2='service=cndba_s lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=cndba_s' scope=both ;
SQL> select member from v$logfile;
MEMBER
----------------------------------------------------------------------------------------
/u01/app/oracle/oradata/cndba/redo01.log
/u01/app/oracle/oradata/cndba/redo02.log
/u01/app/oracle/oradata/cndba/redo03.log
/u01/app/oracle/oradata/cndba/stdredo01.log
/u01/app/oracle/oradata/cndba/stdredo02.log
/u01/app/oracle/oradata/cndba/stdredo03.log
/u01/app/oracle/oradata/cndba/stdredo04.log
SQL> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
log_archive_dest_2 string service=cndba_s lgwr affirm sync valid_for=(online_logfiles, primary_role) db_unique_name=cndba_s
所以三种模式之间可以随意切换。
3.1 最大性能切换到最大可用
#主库:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------------------------- -------------------------------- ---------------------------
MAXIMUM PERFORMANCE PRIMARY MAXIMUM PERFORMANCE
#在主库进行切换:
SQL> alter database set standby database to maximize availability;
Database altered.
#主库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------------------------- -------------------------------- --------------------------
MAXIMUM AVAILABILITY PRIMARY MAXIMUM AVAILABILITY
#备库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------------------------- -------------------------------- -------------------------
MAXIMUM AVAILABILITY PHYSICAL STANDBY MAXIMUM AVAILABILITY
3.2 最大可用切换到最大保护
#主库:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------------------------------------------- ----------------------------------------
MAXIMUM AVAILABILITY PRIMARY MAXIMUM AVAILABILITY
#在主库进行切换:
SQL> alter database set standby database to maximize protection;
Database altered.
#主库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
------------------------------------------------------- ----------------------------------------
MAXIMUM PROTECTION PRIMARY MAXIMUM PROTECTION
#备库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
------------------------------------------------------- ----------------------------------------
MAXIMUM PROTECTION PHYSICAL STANDBY MAXIMUM PROTECTION
3.3 最大保护切换到最大可用
#主库:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------- -------------------------------- ----------------------------------------
MAXIMUM PROTECTION PRIMARY MAXIMUM PROTECTION
#在主库进行切换:
SQL> alter database set standby database to maximize availability;
Database altered.
#主库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
-------------------------- -------------------------------- ----------------------------------------
MAXIMUM AVAILABILITY PRIMARY MAXIMUM AVAILABILITY
#备库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
------------------------- -------------------------------- ----------------------------------------
MAXIMUM AVAILABILITY PHYSICAL STANDBY MAXIMUM AVAILABILITY
3.4 最大可用切换到最大性能
#主库:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
---------------------------- -------------------------------- ----------------------------------------
MAXIMUM AVAILABILITY PRIMARY MAXIMUM AVAILABILITY
#在主库进行切换:
SQL> alter database set standby database to maximize performance;
Database altered.
#主库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
------------------------- -------------------------------- ----------------------------------------
MAXIMUM PERFORMANCE PRIMARY MAXIMUM PERFORMANCE
#备库验证:
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
-------------------------- -------------------------------- ----------------------------------------
MAXIMUM PERFORMANCE PHYSICAL STANDBY MAXIMUM PERFORMANCE
3.5 最大性能切换到最大保护
#主库:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select protection_mode,database_role,protection_level from v$database;
PROTECTION_MODE DATABASE_ROLE PROTECTION_LEVEL
------------------------ -------------------------------- ----------------------------------------
MAXIMUM PERFORMANCE PHYSICAL STANDBY MAXIMUM PERFORMANCE
#在主库进行切换:
SQL> alter database set standby database to maximize protection;
alter database set standby database to maximize protection
*
ERROR at line 1:
ORA-01126: database must be mounted in this instance and not open in any instance
这里切换失败,需要主库在MOUNT状态下切换,也可以采用曲线救国的方式,先切换到最大可用,在切换到最大保护。这里和上面相同,不再操作。
4 Switchover 切换示例
1)验证数据库是否可以进行switchover
12c以后的switchover语句多了VERIFY选项,可以检查切换所需的许多条件。比如备库的数据库版本,MRP是否启动,数据是否同步等。
#MRP 没有启动的情况:
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> alter database switchover to cndba_s verify;
alter database switchover to cndba_s verify
*
ERROR at line 1:
ORA-16470: Redo Apply is not running on switchover target
#正常情况:
SQL> alter database switchover to cndba_s verify;
Database altered.
2)在主数据库上进行switchover
SQL> alter database switchover to cndba_s;
Database altered.
3)在新主库上打开数据库
[dave@www.cndba.cn dbs]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:30:14 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL> select open_mode from v$database;
OPEN_MODE
----------------------------------------
MOUNTED
SQL> alter database open;
Database altered.
4)启动新备库
[dave@www.cndba.cn ~]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 30 15:31:04 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1191181104 bytes
Fixed Size 8895280 bytes
Variable Size 889192448 bytes
Database Buffers 285212672 bytes
Redo Buffers 7880704 bytes
Database mounted.
Database opened.
#启用MRP 进程:
SQL> alter database recover managed standby database disconnect;
Database altered.
#查看新备库状态,切换完成,当然可以需要验证一下主备库同步情况,可以参考第一节:
SQL> select database_role ,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
-------------------------------- ----------------------------------------
PHYSICAL STANDBY READ ONLY WITH APPLY
5 Failover切换示例
1) 推送日志
Failover是不可逆的操作,一般仅当主库不能打开时使用,如果DG的保护模式不是最大保护,那么在激活备库之前,还是需要尽可能将未发送到备库的日志推动到备库。 只要主库能启动到mount状态就可以进行该操作。
SQL> startup mount
SQL> alter system flush redo to cndba_p;
如果不能执行该操作,那么只能手工将未传过去的日志文件传到备库,然后手工注册:
SQL> alter database register physical logfile 'filespec1';
也可以通过以下语句查询GAP信息:
SQL> select thread#, low_sequence#, high_sequence# from v$archive_gap;
2)正常的Failover 操作
#备库关闭mrp
SQL> alter database recover managed standby database cancel;
Database altered.
#在备库上执行failvoer
SQL> alter database failover to cndba_p;
Database altered.
如果操作正常,那么备库就已经激活。 如果报错,且alert log 日志里显示与far sync instance相关的错误,可以直接加force 选项:
SQL> alter database failvover to pdbcndba_p force;
3)强制failover
如果正常的Failover 无法成功执行,可以采用这里的强制的激活failover,该操作可能会丢数据:
SQL> alter database activate physical standby database;
Database altered.
4) 启动新主库
SQL> alter database open;
Database altered.
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
---------------------------------------- --------------------------------
READ WRITE PRIMARY
然后重新搭建DG 环境,做好备份。
版权声明:本文为博主原创文章,未经博主允许不得转载。



