环境,前面的dg的测试环境,主库cad,备库cad02
在一段时间之后,启动备库失败(open)
[oracle@dg1 ~]$ export ORACLE_SID=cad02 [oracle@dg1 ~]$ sqlplus /nolog SQL> conn /as sysdba SQL> startup mount; SQL> ALTER DATABASE OPEN; ALTER DATABASE OPEN * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01196: file 1 is inconsistent due to a failed media recovery session ORA-01110: data file 1: '/u01/app/oracle/oradata/cad02/data/system.271.1032629567' [oracle@dg1 ~]$ lsnrctl start SQL> alter database recover managed standby database disconnect from session; Database altered. SQL> select process,status,sequence#,delay_mins from v$managed_standby; PROCESS STATUS SEQUENCE# DELAY_MINS --------- ------------ ---------- ---------- ARCH CONNECTED 0 0 ARCH CONNECTED 0 0 ARCH CLOSING 488 0 ARCH CONNECTED 0 0 RFS CLOSING 567 0 RFS CLOSING 565 0 RFS CLOSING 566 0 RFS CLOSING 301 0 RFS IDLE 621 0 RFS CLOSING 299 0 RFS CLOSING 300 0 PROCESS STATUS SEQUENCE# DELAY_MINS --------- ------------ ---------- ---------- RFS WRITING 382 0 MRP0 WAIT_FOR_GAP 241 0 ###WAIT_FOR_GAP注意此状态 13 rows selected.
查询归档
SQL> select max(sequence#) from v$archived_log; ##已经同步到最新的归档日志 MAX(SEQUENCE#) -------------- 621 SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ##但是由于缺少之前的归档,报错 Database altered. SQL> alter database open; alter database open * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01196: file 1 is inconsistent due to a failed media recovery session ORA-01110: data file 1: '/u01/app/oracle/oradata/cad02/data/system.271.1032629567' SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; Database altered. SQL> select thread#,low_sequence#,high_sequence# from v$archive_gap; ##查询到有归档缺失 THREAD# LOW_SEQUENCE# HIGH_SEQUENCE# ---------- ------------- -------------- 2 241 244
查询备库当前的归档日志状态
col name for a100 set linesize 9999 pagesize 9999 SQL> SELECT dest_id,THREAD#,NAME,sequence#,archived,applied,a.NEXT_CHANGE# FROM v$archived_log a WHERE a.sequence# >= 200 AND resetlogs_change# = (SELECT d.RESETLOGS_CHANGE# FROM v$database d) and a.dest_id=1 ORDER BY a.THREAD#, a.sequence#,a.dest_id; 2 3 4 5 6 7 DEST_ID THREAD# NAME SEQUENCE# ARC APPLIED NEXT_CHANGE# ---------- ---------- --------------------------------------------------------------------------------------------------------------------------------------- 1 1 /u01/app/oracle/archive/1_488_1032629558.arch 488 YES NO 12496347 1 1 /u01/app/oracle/archive/1_621_1032629558.arch 621 YES NO 17879615 1 1 /u01/app/oracle/archive/1_622_1032629558.arch 622 YES NO 17917819 1 2 /u01/app/oracle/archive/2_382_1032629558.arch 382 YES NO 17879589 1 2 /u01/app/oracle/archive/2_383_1032629558.arch 383 YES NO 17879605 1 2 /u01/app/oracle/archive/2_384_1032629558.arch 384 YES NO 17879625 6 rows selected.
主库,拿到scn号去增量备份
SQL> set linesize 999 SQL> select dbid,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database; DBID CURRENT_SCN PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE FOR OPEN_MODE SWITCHOVER_STATUS ---------- - ----------- -------------------- -------------------- ---------------- --- -------------------- -------------------- 1640682678 17922067 MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PRIMARY YES READ WRITE UNRESOLVABLE GAP SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination +FRA Oldest online log sequence 622 Next log sequence to archive 623 Current log sequence 623 SELECT dest_id,THREAD#,NAME,sequence#,archived,applied,a.NEXT_CHANGE# FROM v$archived_log a WHERE a.sequence# >= 200 AND resetlogs_change# = (SELECT d.RESETLOGS_CHANGE# FROM v$database d) and a.dest_id=1 ORDER BY a.THREAD#, a.sequence#,a.dest_id; SELECT (SELECT MIN(d.CHECKPOINT_CHANGE#) FROM v$datafile d) datafile_scn, (SELECT MIN(d.CHECKPOINT_CHANGE#) FROM v$datafile_header d WHERE rownum = 1) datafile_header_scn, (SELECT current_scn FROM v$database) current_scn, (SELECT b.NEXT_CHANGE# FROM v$archived_log b WHERE b.SEQUENCE# = 240 AND resetlogs_change# = (SELECT d.RESETLOGS_CHANGE# FROM v$database d) AND rownum = 1) NEXT_CHANGE# FROM dual;
主库rman备份
[oracle@rac01 standby_bk]$ rman target/ Recovery Manager: Release 11.2.0.4.0 - Production on Wed May 6 16:04:48 2020 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. RMAN> run { allocate channel d1 type disk; allocate channel d2 type disk; backup as compressed backupset incremental from SCN 17879625 database format '/home/oracle/standby_bk/standby_%d_%T_%U.bak' include current controlfile for standby filesperset=5 tag 'FOR 2> 3> 4> 5> STANDBY'; release channel d1; release channel d2; }6> 7> 8>
[oracle@rac01 standby_bk]$ ll total 16848 -rw-r----- 1 oracle asmadmin 11345920 May 6 16:08 standby_20200506_07uvhd04_1_1.bak -rw-r----- 1 oracle asmadmin 4775936 May 6 16:07 standby_20200506_08uvhd0c_1_1.bak -rw-r----- 1 oracle asmadmin 1130496 May 6 16:08 standby_20200506_09uvhd2k_1_1.bak 把增量备份拷贝到备库 [oracle@rac01 standby_bk]$ pwd /home/oracle/standby_bk [oracle@rac01 standby_bk]$ scp * oracle@*:/home/oracle/standby_bk/. oracle@1*'s password: standby_20200506_07uvhd04_1_1.bak 100% 11MB 10.8MB/s 00:00 standby_20200506_08uvhd0c_1_1.bak 100% 4664KB 4.6MB/s 00:00 standby_20200506_09uvhd2k_1_1.bak 100% 1104KB 1.1MB/s 00:00 备库查询 [oracle@dg1 ~]$ mkdir -p /home/oracle/standby_bk [oracle@dg1 ~]$ cd standby_bk/ [oracle@dg1 standby_bk]$ ll total 16848 -rw-r----- 1 oracle oinstall 11345920 May 6 16:14 standby_20200506_07uvhd04_1_1.bak -rw-r----- 1 oracle oinstall 4775936 May 6 16:14 standby_20200506_08uvhd0c_1_1.bak -rw-r----- 1 oracle oinstall 1130496 May 6 16:14 standby_20200506_09uvhd2k_1_1.bak
重启备库到nomount
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; Database altered. SQL> shutdown immediate; ORA-01109: database not open Database dismounted. ORACLE instance shut down. [oracle@dg1 standby_bk]$ rman target / Recovery Manager: Release 11.2.0.4.0 - Production on Wed May 6 16:18:56 2020 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. RMAN> restore standby controlfile to '/u01/app/oracle/oradata/cad02/control01.ctl' from '/home/oracle/standby_bk/standby_20200506_09uvhd2k_1_1.bak'; Starting restore at 06-MAY-20 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=63 device type=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 Finished restore at 06-MAY-20 RMAN> restore standby controlfile to '/u01/app/oracle/fast_recovery_area/cad02/control02.ctl' from '/home/oracle/standby_bk/standby_20200506_09uvhd2k_1_1.bak'; Starting restore at 06-MAY-20 using channel ORA_DISK_1 channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 Finished restore at 06-MAY-20 RMAN> alter database mount; database mounted released channel: ORA_DISK_1 RMAN> catalog start with '/home/oracle/standby_bk/'; Starting implicit crosscheck backup at 06-MAY-20 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=131 device type=DISK Finished implicit crosscheck backup at 06-MAY-20 Starting implicit crosscheck copy at 06-MAY-20 using channel ORA_DISK_1 Crosschecked 2 objects Finished implicit crosscheck copy at 06-MAY-20 searching for all files in the recovery area cataloging files... no files cataloged searching for all files that match the pattern /home/oracle/standby_bk/ List of Files Unknown to the Database ===================================== File Name: /home/oracle/standby_bk/standby_20200506_07uvhd04_1_1.bak File Name: /home/oracle/standby_bk/standby_20200506_08uvhd0c_1_1.bak File Name: /home/oracle/standby_bk/standby_20200506_09uvhd2k_1_1.bak Do you really want to catalog the above files (enter YES or NO)? yes cataloging files... cataloging done List of Cataloged Files ======================= File Name: /home/oracle/standby_bk/standby_20200506_07uvhd04_1_1.bak File Name: /home/oracle/standby_bk/standby_20200506_08uvhd0c_1_1.bak File Name: /home/oracle/standby_bk/standby_20200506_09uvhd2k_1_1.bak RMAN> recover database noredo; Starting recover at 06-MAY-20 using channel ORA_DISK_1 Finished recover at 06-MAY-20
备份库
SQL> col name for a100 SQL> set linesize 9999 pagesize 9999 SQL> SELECT dest_id,THREAD#,NAME,sequence#,archived,applied,a.NEXT_CHANGE# FROM v$archived_log a WHERE a.sequence# >= 200 AND resetlogs_change# = (SELECT d.RESETLOGS_CHANGE# FROM v$database d) and a.dest_id=1 ORDER BY a.THREAD#, a.sequence#,a.dest_id; 2 3 4 5 6 7 DEST_ID THREAD# NAME SEQUENCE# ARC APPLIED NEXT_CHANGE# ---------- ---------- ---------------------------------------------------------------------------------------------------- ---------- --- --------- ------------ 1 1 /u01/app/oracle/archive/1_623_1032629558.arch 623 YES NO 17929963 1 2 /u01/app/oracle/archive/2_385_1032629558.arch 385 YES NO 17929957 SQL> alter database recover managed standby database using current logfile disconnect from session; Database altered. SQL> SELECT * FROM V$ARCHIVE_GAP; no rows selected SQL> alter database recover managed standby database cancel; Database altered. SQL> alter database open; alter database open * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01196: file 1 is inconsistent due to a failed media recovery session ORA-01110: data file 1: '/u01/app/oracle/oradata/cad02/data/system.271.1032629567'
##ERROR log
Wed May 06 16:41:33 2020 Managed Standby Recovery starting Real Time Apply Parallel Media Recovery started with 4 slaves Waiting for all non-current ORLs to be archived... All non-current ORLs have been archived. Media Recovery Waiting for thread 2 sequence 241 Fetching gap sequence in thread 2, gap sequence 241-340 Completed: alter database recover managed standby database using current logfile disconnect from session Wed May 06 16:44:14 2020 FAL[client]: Failed to request gap sequence GAP - thread 2 sequence 241-340 DBID 1640682678 branch 1032629558 FAL[client]: All defined FAL servers have been attempted. ------------------------------------------------------------ Check that the CONTROL_FILE_RECORD_KEEP_TIME initialization parameter is defined to a value that's sufficiently large enough to maintain adequate log switch information to resolve archivelog gaps. ------------------------------------------------------------
当查询v$datafile scn,database scn,datafile_header.scn发现均不一致,这个时候不能使用CURRENT_SCN来作为scn增量备份的起点,这个时候需要根据缺少日志最下sequence#找出scn,然后作为增量备份的起点.
SQL> select FIRST_CHANGE# from v$archived_log where SEQUENCE# =241; ##找不到scn号,归档日志已经被清理 no rows selected
所以使用gap中提示的sequence#找出起始scn比CURRENT_SCN 更加靠谱(出现scn不一致情况,一般人工不正常干预dg导致
这里在主备库都查询不到241-244的归档日志信息,而且个人测试环境没有备份,所有后面只能重建adg了。
文档参考:
http://www.xifenfei.com/2011/07/data-guard%E5%87%BA%E7%8E%B0gap-sequence%E4%BF%AE%E5%A4%8D.html
https://www.cnblogs.com/lhrbest/p/4754289.html