接到同事电话,说公司的mis系统好像从库查询和主库的数据有点不一致。Ok,很明显应该是主从不同步的问题,在处理过程中以为和往常一样很简单,哪儿晓得遇到了好几个坑,特此记录一下。

数据库版本:11.2.0.4 单实例

一、照往常一样查看dataguard的日志同步三板斧

第一板斧:查看主从库的日志的最大号以及是否存在lag

1.Primary/stndby:查询主库的最大日志

SQL> select max(sequence#) from v$archived_log;
SQL> select max(sequence#) from v$archived_log where applied='YES';

2.查看是够有lag

用以下命令查看
set lines 200
col ctime format a20
col value format a20
select inst_id,to_char(sysdate,'yyyymmdd hh24:mi:ss') ctime,name,value,datum_time from gv$dataguard_stats where name like '%lag';

第二板斧:查看查询主库日志与备库是否一致

1.查看查询主库日志与备库是否一致

SQL> select sequence# from v$archived_log  where recid = (select max(recid) from v$archived_log) and applied = 'YES';
SQL> select sequence#  from v$archived_log where recid = (select max(recid) from v$archived_log);

2.备库接收到的日志和应用的日志是否一致

select max(lh.SEQUENCE#) ,max(al.SEQUENCE#)  fromv$log_history lh,v$archived_log al;

第三板斧:查看有没有MRP进程

SQL> select process,status from v$managed_standby;

PROCESS STATUS
------- ------------
ARCH CONNECTED
ARCH CONNECTED
MRP0 WAIT_FOR_LOG
RFS RECEIVING

没有MRP进程,说明备库没有处于恢复状态。可以使用

alter database recover managed standby database disconnect from session ;

打开standby的同步。

二、启动了mrp进程后发现有ora-600的错误

原本以为就搞定了,结果查看了一下alert日志,发现报错:

ORA-00600: internal error code, arguments: [2619], [81304], [], [], [], [], [], [], [], [], [], []
MRP0: Background Media Recovery process shutdown (amldb)

查了下metalink,发现这个600错误是备库在执行恢复的过程中,发现81304这个归档日志有问题或者找不到。 根据提示查了下主库,这个81304号的归档日志已经早删除了。。(如果没有删的话,可以直接传一份到备库重新应用即可)

为了让主备库的数据一致,在不重建备库的情况下,可以采用通过主库增量备份的方式来完成重新同步了。

重新同步的步骤:

1.在备库上取消日志应用

alter database recover managedstandby database cancel;

2.查看备库scn

select current_scn from v$database;

3.根据scn,在主库上进行rman增量备份

获取增量数据

backup incremental from scn xxxx database format '/u01/archivelog/temp/20180705_%U.bak' tag 'forstandby';

备份控制文件

backup current controlfile forstandby format '/u01/archivelog/temp/controlfile.bak';

4.将增量备份传到备库

5.将备库启动到mount状态

shutdown immediate
startup nomount
alter database mount standby database;

6.用rman进行恢复增量备份

rman target / nocatalog

RMAN> catalog start with '/u01/archivelog/temp/';

RMAN> recover database noredo;

7.用rman恢复控制文件

RMAN> shutdown;

RMAN> startup nomount;

RMAN> restore standby controlfile from '/u01/archivelog/temp/controlfile.bak';

8.启动备库到mount状态

RMAN> shutdown

SQL> startup nomount;

SQL> alter database mount standby database;

9.因为恢复了控制文件,所以需要重新添加新的standby redo log file

alter database add standby logfile group 11('/u01/app/oracle/sid/oradata/stdbyredo01.log') size 100m; 

...

alter database add standby logfile group 17('/u01/app/oracle/sid/oradata/stdbyredo07.log') size 100m;

10.启动备库同步

SQL> alter database open read only;

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

11.查看归档日志应用

select max(lh.SEQUENCE#) ,max(al.SEQUENCE#)  fromv$log_history lh,v$archived_log al;

三、备库报错ORA-00313、ORA-00312、ORA-27037

原本以为搞定了,然后查看alert日志,发现又报错了。。日了狗了! 这次报的错是DG备库报错ORA-00313、ORA-00312、ORA-27037

意思说redo日志不存在。去相对应的目录看,果然备库的redo不存在。

肿么办呢?只有用clear的方式把redo清除了

只有用clear的方式把redo清除了的步骤:

1.在备库上取消日志应用

alter database recover managed standby database cancel;

2.执行如下命令重建备库上所有的日志组

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARCHIVED STATUS 
---------- ---------- -------- ---------------- 
         1          1 YES      INACTIVE 
         2          2 YES      INACTIVE 
         3          3 NO       CURRENT

对于已经归档和状态为inactive的组可以用下面的命令来重建 对于状态为active的日志组则需要先做一下日志的切换才行,而做日志的切换又需要先把数据库open,切完后再startup到mount状态 ``` alter database clear logfile group X;

redo: alter database drop logfile group X; alter database add logfile group X ('路径') size 100m;

standby redo: alter database drop standby logfile group X; alter database add standby logfile group X ('路径') size 100m;


#### 3.在clear的过程又遇到一个报错:ORA-19527和ORA-00312
这个和备库的LOG_FILE_NAME_CONVERT有关,需要设置这个spfile的参数才行,修改完后重启数据库,执行clear成功。


#### 4.启动备库并检查

做完以上后:

shutdown immediate

startup mount #查看alert日志没有错误后再执行下面的

alter database open read only

alter database recover managedstandby database disconnect from session using current logfile;

select max(lh.SEQUENCE#) ,max(al.SEQUENCE#) fromv$log_history lh,v$archived_log al; ```

参考: (1) 官方文档:Database Backup and Recovery Advanced User's Guide (2) 1138913.1: ORA-600[2619] During Physical Standby Recovery

Copyright © suredandan 2018 all right reserved,powered by GitbookUpdateTime: 2020-04-09 15:36:00

results matching ""

    No results matching ""