由于主库切换归档路径导致的 Oracle DG 无法同步问题的解决过程

由于主库切换归档路径导致的 Oracle DG 无法同步问题的解决过程

在上一篇文章中,由于 Oracle 数据库的归档日志空间耗尽导致客户端无法连接数据库。在解决的过程中临时修改了归档路径。后来通过修改参数db_recovery_file_dest_size的值解决了问题。

但该操作导致DG无法与主库同步。本文给出了该问题的解决思路与方法。

使用如下两条命令开启数据库同步:

sql 复制代码
alter database recover managed standby database cancel;  -- 停止同步
alter database recover managed standby database using current logfile disconnect from session;  -- 开启同步

查看主库的进程:

sql 复制代码
SQL> select process, status, sequence# from v$managed_standby;

PROCESS   STATUS	SEQUENCE#
--------- ------------ ----------
ARCH	  CLOSING	   116083
ARCH	  OPENING	   116057
ARCH	  CLOSING	   116085
ARCH	  CLOSING	   116053
LNS	  WRITING	   116086

查看备库的进程:

sql 复制代码
SQL> select process, status, sequence# from v$managed_standby;

PROCESS   STATUS	SEQUENCE#
--------- ------------ ----------
ARCH	  CLOSING	   116085
ARCH	  CLOSING	   325777
ARCH	  CONNECTED		0
ARCH	  CLOSING	   325778
MRP0	  APPLYING_LOG	   325395
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE		   116086
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE		   325779

12 rows selected.

发现主库的进行和备库的进程大都是正常的,但是 MRP0SEQUENCE#RFSSEQUENCE#差异较大。在主库中写入数据,发现不能同步。比如在主库的表中添加数据,才从库中查询不到。在主库上多次执行alter system switch logfile;命令切换日志,问题仍然不能解决。

由于时间太晚,操作暂停。

==========================================================================================

第二天(7月27日)上午十点,远程连接服务器查看备库的进程。

==========================================================================================

发现了下列异常(MRP0进程的状态变成了WAIT_FOR_GAP):

sql 复制代码
SQL> select process, status, sequence# from v$managed_standby;

PROCESS   STATUS	SEQUENCE#
--------- ------------ ----------
ARCH	  CLOSING	   325842
ARCH	  CLOSING	   325843
ARCH	  CONNECTED		0
ARCH	  CLOSING	   116143
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE		   116144
RFS	  IDLE			0
MRP0	  WAIT_FOR_GAP	   116056
RFS	  IDLE			0
RFS	  IDLE		   325844

13 rows selected.

查询 GAP 信息如下:缺少两个归档文件(对应的SEQUENCE#分别为 116056-116057

sql 复制代码
SQL> SELECT * FROM V$ARCHIVE_GAP;

   THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
	 2	  116056	 116057

基本可以确定昨晚备库无法同步的原因:

因为昨天修改了归档的地址,导致修改归档地址之后生成的归档文件没有被传送到备库中,备库无法接收到这些归档文件,导致备库的数据确实,备库和主库不一致,导致无法同步。

解决方法如下:

步骤1:进入到主库中(节点1和节点2同时操作)修改后的归档地址,把归档日志文件复制到 DG备库的归档目录中。

结果如下:

shell 复制代码
[oracle@dghisdb:/archive/DGHISDB/archivelog]$ll
total 4056012
-rw-r----- 1 oracle oinstall  16284160 Jul 26 22:33 1_325744_1109379972.dbf
-rw-r----- 1 oracle oinstall  34625024 Jul 26 22:33 1_325745_1109379972.dbf
-rw-r----- 1 oracle oinstall 351205888 Jul 26 22:33 1_325746_1109379972.dbf
-rw-r----- 1 oracle oinstall 148878848 Jul 26 22:33 1_325747_1109379972.dbf
-rw-r----- 1 oracle oinstall 803595776 Jul 26 22:33 1_325748_1109379972.dbf
-rw-r----- 1 oracle oinstall 426488320 Jul 26 22:33 1_325749_1109379972.dbf
-rw-r----- 1 oracle oinstall     45056 Jul 26 22:33 1_325750_1109379972.dbf
-rw-r----- 1 oracle oinstall    115200 Jul 26 22:33 1_325751_1109379972.dbf
-rw-r----- 1 oracle oinstall  10448384 Jul 26 22:33 1_325752_1109379972.dbf
-rw-r----- 1 oracle oinstall   1524736 Jul 26 22:33 1_325753_1109379972.dbf
-rw-r----- 1 oracle oinstall   1793024 Jul 26 22:33 1_325754_1109379972.dbf
-rw-r----- 1 oracle oinstall     14848 Jul 26 22:33 1_325755_1109379972.dbf
-rw-r----- 1 oracle oinstall   1974784 Jul 26 22:33 1_325756_1109379972.dbf
-rw-r----- 1 oracle oinstall      5120 Jul 26 22:33 1_325757_1109379972.dbf
-rw-r----- 1 oracle oinstall  16760832 Jul 26 22:33 1_325758_1109379972.dbf
-rw-r----- 1 oracle oinstall 734867968 Jul 26 22:33 2_116052_1109379972.dbf
-rw-r----- 1 oracle oinstall 387082752 Jul 26 22:33 2_116054_1109379972.dbf
-rw-r----- 1 oracle oinstall      1024 Jul 26 22:33 2_116055_1109379972.dbf
-rw-r----- 1 oracle oinstall 803034112 Jul 26 22:35 2_116056_1109379972.dbf
-rw-r----- 1 oracle oinstall 260406272 Jul 26 22:35 2_116057_1109379972.dbf
-rw-r----- 1 oracle oinstall    107520 Jul 26 22:35 2_116058_1109379972.dbf
-rw-r----- 1 oracle oinstall 111630848 Jul 26 22:35 2_116059_1109379972.dbf
-rw-r----- 1 oracle oinstall   2964992 Jul 26 22:35 2_116060_1109379972.dbf
-rw-r----- 1 oracle oinstall  32430080 Jul 26 22:35 2_116061_1109379972.dbf
-rw-r----- 1 oracle oinstall    209408 Jul 26 22:35 2_116062_1109379972.dbf
-rw-r----- 1 oracle oinstall   6656512 Jul 26 22:35 2_116063_1109379972.dbf
.......

步骤2:在备库上注册archive log,对应的文件为:2_116056_1109379972.dbf2_116057_1109379972.dbf

sql 复制代码
-rw-r----- 1 oracle oinstall 803034112 Jul 26 22:35 2_116056_1109379972.dbf
-rw-r----- 1 oracle oinstall 260406272 Jul 26 22:35 2_116057_1109379972.dbf

执行如下命令注册archive log

sql 复制代码
alter database register logfile '/archive/DGHISDB/archivelog/2_116056_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116057_1109379972.dbf';

步骤3:执行注册日志的命令后重启数据库同步。

sql 复制代码
alter database recover managed standby database cancel;  -- 停止同步
alter database recover managed standby database using current logfile disconnect from session;  -- 开启同步

然后重新查看备库的进程:

sql 复制代码
SQL> select process, status, sequence# from v$managed_standby;

PROCESS   STATUS	SEQUENCE#
--------- ------------ ----------
ARCH	  CLOSING	   325842
ARCH	  CLOSING	   325843
ARCH	  CONNECTED		0
ARCH	  CLOSING	   116143
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE		   116144
RFS	  IDLE			0
MRP0	  WAIT_FOR_GAP	   116059
RFS	  IDLE			0
RFS	  IDLE		   325844

13 rows selected.

重新查询 GAP 信息如下:缺少 5 个归档文件(对应的SEQUENCE#分别为 116059-116063

sql 复制代码
SQL> SELECT * FROM V$ARCHIVE_GAP;

   THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
	 2	  116059	 116063

步骤4:在备库上注册archive log,对应的文件为:2_116059_1109379972.dbf2_116063_1109379972.dbf

sql 复制代码
-rw-r----- 1 oracle oinstall 111630848 Jul 26 22:35 2_116059_1109379972.dbf
-rw-r----- 1 oracle oinstall   2964992 Jul 26 22:35 2_116060_1109379972.dbf
-rw-r----- 1 oracle oinstall  32430080 Jul 26 22:35 2_116061_1109379972.dbf
-rw-r----- 1 oracle oinstall    209408 Jul 26 22:35 2_116062_1109379972.dbf
-rw-r----- 1 oracle oinstall   6656512 Jul 26 22:35 2_116063_1109379972.dbf

执行如下命令注册archive log

sql 复制代码
alter database register logfile '/archive/DGHISDB/archivelog/2_116059_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116060_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116061_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116062_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116063_1109379972.dbf';

步骤5:执行注册日志的命令后重启数据库同步。

sql 复制代码
alter database recover managed standby database cancel;  -- 停止同步
alter database recover managed standby database using current logfile disconnect from session;  -- 开启同步

然后重新查看备库的进程:

sql 复制代码
SQL> select process, status, sequence# from v$managed_standby;

PROCESS   STATUS	SEQUENCE#
--------- ------------ ----------
ARCH	  CLOSING	   325842
ARCH	  CLOSING	   325843
ARCH	  CONNECTED		0
ARCH	  CLOSING	   116143
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE		   116144
RFS	  IDLE			0
MRP0	  APPLYING_LOG	   325810
RFS	  IDLE			0
RFS	  IDLE		   325844

13 rows selected.

重新查询 GAP 信息如下:

sql 复制代码
SQL> SELECT * FROM V$ARCHIVE_GAP;

no rows selected

由于 GAP 信息为空,表示已没有缺少的归档日志。

步骤6:重启备库

sql 复制代码
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 2.7793E+10 bytes
Fixed Size		    2266504 bytes
Variable Size		 3288337016 bytes
Database Buffers	 2.4495E+10 bytes
Redo Buffers		    7307264 bytes
Database mounted.
Database opened.

启动数据库同步:

sql 复制代码
alter database recover managed standby database using current logfile disconnect

查看备库的进程信息:发现MRP0进程的状态已经变成APPLYING_LOG,并且MRP0进程的SEQUENCE#(325845)RFS进程的SEQUENCE#(325845)完全相同。

sql 复制代码
SQL> select process, status, sequence# from v$managed_standby;

PROCESS   STATUS	SEQUENCE#
--------- ------------ ----------
ARCH	  CLOSING	   325844
ARCH	  CONNECTED		0
ARCH	  CONNECTED		0
ARCH	  CLOSING	   116144
RFS	  IDLE			0
RFS	  IDLE			0
RFS	  IDLE		   325845
RFS	  IDLE		   116145
RFS	  IDLE			0
RFS	  IDLE			0
MRP0	  APPLYING_LOG	   325845

11 rows selected.

测试发现,在主库上修改数据,在备库上立即可以查询到最新信息。

问题得到解决。

相关推荐
java叶新东老师26 分钟前
git stash 命令详解
linux·运维·flink
写bug的羊羊2 小时前
CentOS 9 配置国内 YUM 源
linux·运维·centos
每天敲200行代码2 小时前
MySQL 事务管理
数据库·mysql·事务
巴里巴气2 小时前
MongoDB索引及其原理
数据库·mongodb
国科安芯3 小时前
抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
运维·网络·人工智能·单片机·自动化
程序员勋勋13 小时前
Redis的String数据类型底层实现
数据库·redis·缓存
gx23483 小时前
HCLP--MGER综合实验
运维·服务器·网络
不修×蝙蝠3 小时前
MySQL 全详解:从入门到精通的实战指南
数据库·mysql·索引·最左前缀
angushine3 小时前
鲲鹏服务器部署Kafka2.8.1
运维·服务器
一个网络学徒5 小时前
MGRE综合实验
运维·服务器·网络