---adg 搭建备库,归档缺失,主库归档有备份 --主库RAC,备库单机 ---adg 搭建备库,归档缺失 alter system set log_archive_config='dg_config=(ssdb,ssadg,ssbak)'; alter system set fal_server='ssadg,ssbak'; alter system set LOG_ARCHIVE_DEST_10='service=ssbak db_unique_name=ssbak reopen=30 compression=enable valid_for=(all_logfiles, primary_role)'; alter system set log_archive_dest_state_10=defer; ----搭建 nuhup rman target sys/123456 auxiliary sys/123456@ssbak @qb_bak.rman & vi qb_bak.rman run{ allocate channel ch01 type disk rate 10M; allocate channel ch02 type disk rate 10M; allocate channel ch03 type disk rate 10M; allocate channel ch04 type disk rate 10M; allocate auxiliary channel ch05 type disk; allocate auxiliary channel ch06 type disk; allocate auxiliary channel ch07 type disk; duplicate target database for standby from active database DORECOVER; release channel ch01; release channel ch02; release channel ch03; release channel ch04; release channel ch05; release channel ch06; release channel ch07; } --登陆数据库,杀掉通道进程 Select s.sid, s.serial#,s.status, p.spid, s.client_info from v$process p, v$session s where p.addr = s.paddr and s.program like '%rman%' --批量杀死rman会话 SELECT 'alter system kill session '''||SID||','||serial#||''' immediate;' FROM V$SESSION t WHERE T.client_info like 'rman channel=%' and status='ACTIVE'; --操作系统批量kill rman进程 ps -ef|grep rman |grep -v grep|awk '{print $2}' |xargs kill -9 --查询备库丢失归档信息 select * from v$archive_gap; ---根据主库的备份归档文件,把归档传递过了;然后在备库进行恢复; ---备库alter缺少归档 Tue Jun 11 17:12:14 2019 FAL[client]: Failed to request gap sequence GAP - thread 2 sequence 25196-25206 DBID 1476960055 branch 992196795 --查询主库归档对应备份集 list backup of archivelog from logseq 25196 until logseq 25206 thread 2; --如果归档还没删除,也没备份,然后在主库上定位这些丢失的文件 select name from v$archived_log where thread#=2 and dest_id=2 and sequence# between 25196 and 25206; --从主库传递归档 ---注册 catalog start with '/archive/archive1/arch/'; ---恢复 restore archivelog from logseq 25196 thread 2; ---应用 alter database recover managed standby database using current logfile disconnect; release channel ch05; 在Oracle中,DG中GAP有几种解决方案? 当主库的某些日志没有成功传送到备库,那么这时候就发生了归档裂缝(Archive Gap)。目前Oracle提供了两种日志GAP的检测和处理机制,分别是自动GAP处理(Automatic Gap Resolution)和FAL进程GAP处理(FAL Gap Resolution)。自动GAP处理即主库上的ARCn进程会每分钟检查备库上的日志GAP情况并做相应处理。FAL(Fetch Archive Log)是通过配置FAL_SERVER和FAL_CLIENT实现GAP检测的一种机制,它是备库主动发起的“取”日志的过程。备库就是FAL_CLIENT,它从FAL_SERVER中取这些GAP。Oracle会首先尝试使用FAL进程处理GAP,当发现FAL机制并没有配置生效的时候,进而尝试使用自动GAP处理。 FAL进程只在物理备库存在。FAL进程提供了一个CLIENT/SERVER的机制,用来解决检测在主库产生的连续的归档日志,而在备库接受的归档日志不连续的问题。该进程只有在需要的时候才会启动,而当工作完成后就关闭了,因此在正常情况下,该进程是无法看见的。 (一)物理DG手动解决GAP 在一些特殊情况下,如果GAP不能自动解决,那么就需要手工执行中断恢复。通过查询视图V$ARCHIVE_GAP可以确定断档的是哪些日志。 SQL> SELECT * FROM V$ARCHIVE_GAP; THREAD# LOW_SEQUENCE# HIGH_SEQUENCE# ----------- ------------- -------------- 1 10 12可以看到,当前物理备库丢失日志文件从线程1的序号10到序号12。接下来确定归档日志文件的路径:(假设在主数据库上的本地归档目的地是LOG_ARCHIVE_DEST_1): SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 10 AND 12; NAME ----------------------------------------------------------------- /arch/thread1_dest/arch_1_10.arc /arch/thread1_dest/arch_1_11.arc /arch/thread1_dest/arch_1_12.arc接下来,复制这些日志文件到物理备库,然后在物理备库上使用“ALTER DATABASE REGISTER LOGFILE”语句来注册这些归档日志,如下所示: SQL> ALTER DATABASE REGISTER LOGFILE '/arch/thread1_dest/arch_1_10.arc';也可以使用如下的SQL语句: ALTER DATABASE REGISTER OR REPLACE LOGFILE '/arch/thread1_dest/arch_1_10.arc'; ALTER DATABASE REGISTER OR REPLACE PHYSICAL LOGFILE '/arch/thread1_dest/arch_1_11.arc';在物理备库上注册这些日志文件之后,重新打开重做应用进程。如果断档的归档日志较多,那么可以使用如下的SQL语句来生成要执行的SQL语句(如下的SQL也适用于逻辑DG): SELECT 'ALTER DATABASE REGISTER OR REPLACE LOGICAL LOGFILE ''/arch/thread1_dest/arch_1_' || a ||'.arc'';' LOGICAL_DG, 'ALTER DATABASE REGISTER OR REPLACE LOGFILE ''/arch/thread1_dest/arch_1_' || a ||'.arc'';' PHYSICAL_DG FROM (SELECT LEVEL A FROM DUAL CONNECT BY LEVEL <= 12) WHERE A >= 10 ;需要注意的是,视图V$ARCHIVE_GAP只返回当前妨碍重做应用继续的下一个中断。在解决中断并重启重做应用进程后,再次在物理备库上查询V$ARCHIVE_GAP视图来确定下一个中断序号,如果有的话,重复这个过程直到没有更多的中断。 (二)逻辑DG手动解决GAP 在逻辑备库上查询DBA_LOGSTDBY_LOG视图可以确定是否有归档中断。例如,下面的查询指出断档号为16至18: SYS@orclasm > COLUMN FILE_NAME FORMAT a60 SYS@orclasm > SELECT THREAD#, SEQUENCE#, FILE_NAME 2 FROM DBA_LOGSTDBY_LOG L 3 WHERE NEXT_CHANGE# NOT IN (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# = THREAD#) 4 ORDER BY THREAD#, SEQUENCE#; THREAD# SEQUENCE# FILE_NAME --------- ---------- --------------------------------------------- 1 16 /arch/oracle/arch_1_16.arc 1 18 /arch/oracle/arch_1_18.arc接下来复制丢失的日志文件到逻辑备库,并在逻辑备库上使用“ALTER DATABASE REGISTER LOGICAL LOGFILE”来注册这些日志文件。例如: SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/arch/oracle/arch_1_16.arc';在逻辑备库上注册这些日志文件之后,重启SQL应用。和物理DG一样,在逻辑备库上的DBA_LOGSTDBY_LOG视图只返回当前妨碍SQL应用继续的下一个中断。在解决指定的中断并重启SQL应用之后,再次在逻辑备库上查询DBA_LOGSTDBY_LOG视图,以确定下一个中断序号,如果有的话,重复这个过程直到没有更多的中断。 需要注意的是,如果需要的归档日志已经不在主库上了,但是有归档日志的RMAN备份,那么可以通过RMAN恢复把缺少的归档日志进行还原,如下所示: SET ARCHIVELOG DESTINATION TO '/arch'; RESTORE ARCHIVELOG FROM LOGSEQ 7;如果断档的归档日志已经丢失,且RMAN又没有备份,那么在Oracle 10g之前没有办法修复了,只能重建DG,但是从Oracle 10g开始可以采用主库基于SCN的增量备份来恢复DG; (责任编辑:) |