造成日志无法传到standby 的原因有:
1、一般通过以下语句查看primary数据库和standby数据库的归档日志的sequence是否一样。
先在primary数据库执行
SQL> alter system switch logfile;
System altered.
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
38
如果一样说明没有问题,
如果不一样说明日志没有归档。
首先确认standby是否开启了日志应用
SQL> alter database recover managed standby database disconnect from session;
如果已经开启。再确认归档位置是否可用。
SQL> select dest_name,status,error from v$archive_dest;
DEST_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
STATUS ERROR
------------------ -----------------------------------------------------------------
LOG_ARCHIVE_DEST_1
VALID
LOG_ARCHIVE_DEST_2
VALID
我遇到过这种情况:监听器没有监听到数据库
在操作系统Oracle用户登录查看监听器是否启动,lsnrctl stauts , lsnrctl start
用tnsping两个数据库是否正常,如果没有问题,在primary 数据库日志切换一次,看standby是否接收到归档日志了。
这几步没有问题就考虑数据库启动参数文件配置的问题了。
具体问题具体解决了。
当 DG 出现故障时,第一时间检测 alert 日志,服务器 OS 日志,网络是否通畅。
当DG出现日志不能传输到备库:
一、查看是不是TNS配置错误和监听配置错误。
二、主备库初始化参数文件配置错误(如archive_log_dest文件位置错误)。
三、备库控制文件过旧,从主库生成一个STANDBY CONTROL过去。
SQL> alter database create standby controlfile as '/bnerp_data1/bnerp/cntrl01.dbf';
。
四、备库是否应用了Failovers 。
下面就简单说说手工处理日志GAP的步骤:
1、在备库检查是否有日志缺失
SQL> select * from V$ARCHIVE_GAP;
2、在主库中查询缺失的日志的所在路径和名称
SQL> SELECT NAME FROM V$ARCHIVED_LOG
如果把日志移动到其他路径,则把日志所在路径换成当前实际所在路径。
3、把日志拷贝到备库上
4、在备库上手工注册上一步中从主库拷贝来的日志
SQL> ALTER DATABASE REGISTER LOGFILE '路径';
5、观察备库的alert日志信息
6、检查备库是否还有日志GAP
SQL> select * from V$ARCHIVE_GAP;
no rows selected
如果有行返回,则重复2-5步,直到查询结果是"no rows selected"。
如果日志只是临时移动到其他地方,过后会再移回原路径,则不用这么大费周折手工去手工处理了,把日志拷回原处后FAL会自动处理GAP。
---查询线程号
SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
---查询未应用日志(仅备库)
select thread#,sequence#,first_time,next_time,applied from v$archived_log where applied='NO';
select name,open_mode,protection_mode,database_role,switchover_status from v$database;
select DEST_NAME,STATUS,ERROR from v$archive_dest;
select PROCESS,CLIENT_PROCESS,SEQUENCE# ,STATUS from v$managed_standby;
archive log list;