• DataGuard日常维护常见问题之数据同步异常


    造成日志无法传到standby 的原因有:

    1. standby 服务器异常
    2. standby 相应的进程异常
    3. standby 监听器服务异常

    日志传输问题

    1、一般通过以下语句查看primary数据库和standby数据库的归档日志的sequence是否一样。

    先在primary数据库执行

    SQL> alter system switch logfile;
    
    System altered.
    
    SQL> select max(sequence#) from v$archived_log;
    
    MAX(SEQUENCE#)
    --------------
                38
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果一样说明没有问题,
    如果不一样说明日志没有归档。

    首先确认standby是否开启了日志应用

    SQL> alter database recover managed standby database disconnect from session;
    
    • 1

    如果已经开启。再确认归档位置是否可用。

    SQL> select dest_name,status,error from v$archive_dest;
    
    DEST_NAME
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    STATUS             ERROR
    ------------------ -----------------------------------------------------------------
    LOG_ARCHIVE_DEST_1
    VALID
    
    LOG_ARCHIVE_DEST_2
    VALID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我遇到过这种情况:监听器没有监听到数据库
    在操作系统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处理

    下面就简单说说手工处理日志GAP的步骤:
    1、在备库检查是否有日志缺失

    SQL> select * from V$ARCHIVE_GAP;
    
    • 1

    2、在主库中查询缺失的日志的所在路径和名称

    SQL> SELECT NAME FROM V$ARCHIVED_LOG 
    
    • 1

    如果把日志移动到其他路径,则把日志所在路径换成当前实际所在路径。

    3、把日志拷贝到备库上

    4、在备库上手工注册上一步中从主库拷贝来的日志

    SQL> ALTER DATABASE REGISTER LOGFILE '路径';
    
    • 1

    5、观察备库的alert日志信息

    6、检查备库是否还有日志GAP

    SQL> select * from V$ARCHIVE_GAP;
    
    no rows selected
    
    • 1
    • 2
    • 3

    如果有行返回,则重复2-5步,直到查询结果是"no rows selected"。

    如果日志只是临时移动到其他地方,过后会再移回原路径,则不用这么大费周折手工去手工处理了,把日志拷回原处后FAL会自动处理GAP。

    常用SQL

     ---查询线程号
    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    萌新看过来,你还学不懂VScode插件吗?
    人工智能在医疗领域的突破:从诊断到治疗的创新
    一、Java面试题基础第十天
    Flask 学习-5.请求对象Request
    【测开求职】面试题:计算机网络 精简版整理
    Three.JS教程5 threejs中的材质
    数组some和every的区别
    只因程序员写了一段爬虫,公司200人被端,是种什么体验?
    ROS 基础教程
    XML Web 服务 Eclipse实现中的sun-jaxws.xml文件
  • 原文地址:https://blog.csdn.net/weixin_43700866/article/details/126105043