本文为墨天轮数据库管理服务团队第149期技术分享,内容原创,作者为技术顾问达世德,如需转载请联系小墨(VX:modb666)并注明来源。如需查看更多文章可关注【墨天轮】公众号。


当ADG发生故障时的切换,我们称之为高烈度切换。因为这个和你的生产系统是息息相关的。

模拟故障前建立保障(强制)还原点

查看主库状态

select database_role,protection_mode,open_mode from v$database;

查看数据库的归档模式及是否启用flashback database

archive log list;
select flashback_on from v$database;

创建保障(强制)还原点

create restore point orcl_rest_01 guarantee flashback database;

如果创建还原点有以下报错的话:

SQL> create restore point orcl_rest_01 guarantee flashback database;
create restore point orcl_rest_01 guarantee flashback database
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'ORCL_REST_01'.
ORA-38786: Recovery area is not enabled.

你需要创建一个数据库恢复文件目录:

创建数据库文件恢复目录

mkdir -p /u01/app/oracle/oradata/ORCL/dfa

指定数据库文件恢复目录的大小(最大空间使用量)

alter system set DB_RECOVERY_FILE_DEST_SIZE=5G scope=both;

在数据库中指定数据库文件恢复目录的位置(用我们刚才创建出来的那个目录)

alter system set db_recovery_file_dest='/u01/app/oracle/oradata/ORCL/dfa' scope=both;

再次查看一下状态:

select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY

检查备库状态

select database_role,protection_mode,open_mode from v$database;

从这里开始试验:

在主库中我们直接使用shutdown abort来创造主库意外崩溃:

shutdown abort

主库执行如下操作,先保证主库可已经入到mount:

startup mount

从oracle 11g开始有一个新特性叫flush redo,就是说如果主库挂了,只要能mount,就可以将没传到备库的online redo log信息刷到备库去,

这样就不会有数据丢失。

alter system flush redo to 'orclsd';   --这里的是数据库唯一名称 

在备库查看备库是否有gap

所谓的GAP就是当redo data 传送发生中断时就会产生redo gap。当redo传送恢复正常以后,redo transport service 会自动检测redo gap并发送缺失的redo 到destination。解决redo gap的时间与gap 的数量和网络有一定的关系。 Gap越少,网络越好,解决gap就会越快。

select thread#, low_sequence#, high_sequence# from v$archive_gap;
#######################################################

如果有GAP就需要把查询出来的归档日志给发送到备库上。

比如说:

select thread#, low_sequence#, high_sequence# from v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1 8 11

主库查询确认一下

SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 11;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/arch/arcr_1_8.arc
/u01/app/oracle/oradata/ORCL/arch/arcr_1_9.arc
/u01/app/oracle/oradata/ORCL/arch/arcr_1_10.arc

THREAD根据SELECT * FROM V$ARCHIVE\_GAP;这条语句定义

  • DEST\_ID=1 你定义的第一个归档目录本地的那个
  • BETWEEN后的值尽量用SELECT * FROM V$ARCHIVE\_GAP;得到的LOW\_SEQUENCE#的值-1
  • AND后的值就是SELECT * FROM V$ARCHIVE\_GAP;得到的HIGH\_SEQUENCE#的值

然后把找到的归档发送到备库,并使用ALTER DATABASE REGISTER LOGFILE应用这些归档:

SQL> ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/oradata/ORCL/arch/arcr_1_8.arc';
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/oradata/ORCL/arch/arcr_1_9.arc';
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/oradata/ORCL/arch/arcr_1_10.arc';
###########################################################

备库切换成主库

在备库上发生的:

取消和停止日志应用

alter database recover managed standby database cancel;
alter database recover managed standby database finish;

注意:如果主库和备库之间的网络中断了,那么备库的RFS(remote file server)进程就会等待网络的连接,直到TCP超时。此时需要加上force关键字 

alter database recover managed standby database finish force;(网络没有问题就不用执行了)

查看可切换状态

select open_mode, switchover_status from v$database;
OPEN_MODE        SWITCHOVER_STATUS
-------------------- --------------------
READ ONLY        TO PRIMARY

切换成主库

alter database commit to switchover to primary with session shutdown;
select open_mode, switchover_status from v$database;
OPEN_MODE        SWITCHOVER_STATUS
-------------------- --------------------
MOUNTED          NOT ALLOWED

尝试关闭数据库

shutdown immediate;

重新启动数据库

startup

检查可切换状态

select open_mode, switchover_status from v$database;
OPEN_MODE        SWITCHOVER_STATUS
-------------------- --------------------
READ WRITE       FAILED DESTINATION

恢复主库

关闭主库

shutdown immediate

重新开启主库到mount状态

startup mount;

查看还原点信息

select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY

使用还原点闪回还原数据库

flashback database to restore point orcl_rest_01;

还原成功后可以删除该还原点,但是建议保留一会

drop restore point orcl_rest_01;

切换到物理备库

alter database convert to physical standby;

关闭数据库

shutdown immediate;

重新打开数据库

startup

开启实时日志应用

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

如果上一步你删除了还原点这里可以检查是否删除干净,没有的话以后再说

select flashback_on from v$database;
FLASHBACK_ON
------------------
NO

检查主库状态

select database_role,protection_mode,open_mode from v$database;
DATABASE_ROLE    PROTECTION_MODE      OPEN_MODE
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE  READ ONLY WITH APPLY

最后别忘记再检查一下备库状态

select database_role,protection_mode,open_mode from v$database;

墨天轮从乐知乐享的数据库技术社区蓄势出发,全面升级,提供多类型数据库管理服务。墨天轮数据库管理服务旨在为用户构建信赖可托付的数据库环境,并为数据库厂商提供中立的生态支持。
墨天轮数据库服务官网:https://www.modb.pro/service


墨天轮
44 声望22 粉丝