Oracle数据库由dataguard备库引起的log file sync等待问题

导读:

最近数据库经常出现会话阻塞的报警,过一会又会自动消失,昨天晚上恰好发生了一次,于是赶紧进行了查看,不看不知道,一看吓一跳,发现是由dataguard引起的log file sync等待。我们知道,通常log file sync等待都是由频繁写日志造成的,这次居然是由DG环境引起的。

(一)问题描述

数据库:Oracle 11.2.0.4,单机版,有Dataguard环境

操作系统:centos 7.4

通过zabbix监控到的会话阻塞信息如下图,这里是自定义的监控,解释如下:

用户usera,其session id为2663,session serial为27727,该会话未在执行SQL语句,但是却一直处于非空闲等待,等待的事件为log file sync,一共等待了548s

(二)分析

查看报警期间的历史会话信息:

select sample_time, session_id,session_serial#,session_type,user_id,sql_id,sql_plan_operation,event,
  blocking_session,blocking_session_serial#,PROGRAM,MACHINE
from v$active_session_history a
where a.sample_time > to_date('2020-11-25 20:40:00','yyyy-mm-dd hh24:mi:ss')
and  a.sample_time < to_date('2020-11-25 20:59:00','yyyy-mm-dd hh24:mi:ss')
and  blocking_session is not null
order by a.sample_time;

可以看到,会话1333,2191,2663均被会话1331阻塞了,等待事件是log file sync,它们在等待的会话为1311。

查询1331会话信息,发现是日志写进程LGWR,1311会话不再被其它会话阻塞,可以判定该会话为阻塞源头,1331会话的等待事件是LGWR-LNS wait on channel。

select sample_time, session_id,session_serial#,session_type,user_id,sql_id,event,
  blocking_session_status,blocking_session,PROGRAM,MACHINE
from v$active_session_history a
where a.sample_time > to_date('2020-11-25 20:40:00','yyyy-mm-dd hh24:mi:ss')
and  a.sample_time < to_date('2020-11-25 20:59:00','yyyy-mm-dd hh24:mi:ss')
and  a.session_id = 1331
order by a.sample_time;

在本案例中,一共出现了2种类型的非空闲等待事件:

  • log file sync
  • LGWR-LNS wait on channel(阻塞源头)

什么是log file sync:当用户提交一个事务之后就开始等待log file sync,直到LGWR进程完成了对SCN的传播和对应重做日志的写入操作。所以log file sync的等待时间是由重做日志I/O时间和SCN传播时间两部分构成的,如果还使用了DataGuard,且日志传送时使用了同步+确认(SYNC+AFFRIM)选项时,那么LGWR还需在用户提交事务之后将重做日志信息传递到远程备库节点。总结一下,log file sync的计算公式如下:

用户进程log file sync等待时间 = LGWR执行重做日志I/O时间 + SCN传播时间 + LGWR传送重做日志到备库的时间。

在数据库实例中,log file sync的等待步骤如下:

步骤①和②时所经历的时间就是log file sync所经历的时间。a1~a4是LGWR传送重做日志到备库的过程,b1~b4是LGWR传播SCN的过程,c1~c2是LGWR将重做日志写入到重做日志文件的过程。

a1~a4代表LGWR传送重做日志到DataGuard备库,过程如下:

a1:LGWR将事务对应的重做信息发送给本地节点的LNS(network server)进程

a2:LNS进程通过网络将重做信息发送给备库的RFS(remote file server)进程

a3:RFS进程将重做日志信息写入到备库的备用重做日志文件(Standby redo log),返回消息给主库的LNS进程

a4:主库的LNS进程通知LGWR进程重做信息已经写入到备库的备用重做日志文件

b1~b4代表LGWR传播SCN,SCN是数据库内部的时钟,不重复,单项增长,SCN是针对数据库的,不是针对实例的,也就是说,对于RAC数据库,虽然有多个实例,这些实例会使用相同的SCN,但是每个实例都可以进行各自的任务,这就意味着实例之间需要传播SCN。对于分布式数据库(例如,使用了DB Link),也同样存在着同步SCN的概念。同步SCN的过程如下:

b1:LGWR进程将事务提交的SCN发送给本地的一个LMS进程

b2:本地节点的LMS进程将包含了SCN的消息发送给所有远程节点的LMS进程

b3:所有远程节点的LMS进程接受到了SCN消息并反馈给本地节点的LMS进程

b4:本地节点的LMS进程通知LGWR,所有远程节点都受到了事务的SCN

c1~c2代表LGWR执行重做日志写I/O。过程如下:

c1:LGWR进程将redo buffer cache中的日志写入到online redo log

c2:写完之后LGWR会收到通知已完成

在分析完log file sync等待事件的过程之后,基本上可以知道其形成原因了。然而,新的问题又来了,log file sync等待由3部分原因构成,在我的环境中,到底是LGWR执行重做日志比较慢,还是SCN传播时间存在异常等待,还是LGWR传送重做日志到备库存在性能瓶颈,这个时候我们就需要确认log file sync的并发现象了,我们继续分析。

(1)由LGWR执行重做日志I/O引起的log file sync

如果是由于LGWR将日志写入到online redo log引起的I/O问题,往往会伴随着log file parallel write等待事件出现,也就是说,如果log file sync和log file parallel write一起出现,那么往往是存放在线日志文件的磁盘I/O出问题了,有可能是磁盘吞吐量较差,也有可能是频繁的小I/O操作,磁盘I/O问题的主要解决方案如下:

  • 优化了redo日志的I/O性能,尽量使用快速磁盘,不要把redo log file存放在raid 5的磁盘上;
  • 加大日志缓冲区(log buffer);
  • 使用批量提交,减少提交的次数;

(2)由SCN传播引起的log file sync

由SCN传播引起的log file sync等待事件几乎没有见过,个人觉得SCN传播引起log file sync的概率较小,可以忽略

SQL> SELECT NAME FROM v$event_name a WHERE a.name LIKE '%SCN%' OR a.name LIKE '%LMS%';

NAME
----------------------------------------------------------------
retry contact SCN lock master
ges master to get established for SCN op

(3)由LGWR传送重做日志到备库引起的log file sync

需要特别注意的是,只有在LOG_ARCHIVE_DEST_n参数中使用了"SYNC,AFFIRM"属性时,log file sync等待事件才会与LGWR传送日志有关,如果使用了其它属性,不用考虑。

LNS进程DataGuard环境中主库用来传送日志到备库的进程,查看所有与之相关的等待事件。

SQL> SELECT NAME FROM v$event_name a WHERE a.name LIKE '%LNS%';

NAME
----------------------------------------------------------------
LNS wait on ATTACH
LNS wait on SENDREQ
LNS wait on DETACH
LNS wait on LGWR
LGWR wait on LNS
LNS ASYNC archive log
LNS ASYNC dest activation
LNS ASYNC end of log
LNS simulation latency wait
LGWR-LNS wait on channel

回过头,再次查看我们的生产环境的问题,是log file sync伴随着LGWR-LNS wait on channel出现,再次确认数据库的参数信息,发现数据库运行在最大可用模式,备库采用了同步(sync)方式传送数据。

SQL> select name,open_mode,database_role,protection_mode,protection_level from v$database;

NAME  OPEN_MODE   DATABASE_ROLE PROTECTION_MODE  PROTECTION_LEVEL
--------- -------------------- ---------------- -------------------- --------------------
ORCL2  READ WRITE   PRIMARY   MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL> show parameter log
NAME       TYPE VALUE
----------------------------- ------- ----------------------------------------------------------------------------------------------------
log_archive_dest_2   string SERVICE=adg_orcl LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
          DB_UNIQUE_NAME=adg_orcl

再进一步分析"LGWR-LNS wait on channel"等待事件:

什么是LGWR-LNS wait on channel:这个等待事件监视LGWR或LNS进程等待在KSR通道上接收消息所花费的时间(This wait event monitors the amount of time spent by the log writer (LGWR) process or the network server processes waiting to receive messages on KSR channels. Data Guard Wait Events (Doc ID 233491.1) )。

KSR通道的解释:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/DBA_HIST_CHANNEL_WAITS.html#GUID-682C58F4-5787-4C8E-844C-9DFE04612BDD。

可以断定,数据库的异常等待是由于主库的LNS进程同步传送在线日志信息给DG环境引起的,且引起的瓶颈在备库端。想到我们的主库是高配的物理服务器,备库是低配的云主机(虚拟机),出现这种问题也就不足为奇了。

(三)解决方案

使用异步方式传送日志信息,修改日志传送方式为异步(async)传送

SQL> alter system set log_archive_dest_2= SERVICE="adg_orcl" LGWR ASYNC VALID_FOR=(all_logfiles, primary_role) DB_UNIQUE_NAME="adg_orcl" scope=both;

-- 重新启用通道
SQL> alter system set log_archive_dest_state_2= defer;
SQL> alter system set log_archive_dest_state_2= enable;

到此这篇关于Oracle数据库由dataguard备库引起的log file sync等待的文章就介绍到这了,更多相关Oracle dataguard备库引起的log file sync等待内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Oracle删除archivelog文件的正确方法

    Oracle在开启了归档模式后,会在指定的archive目录下产生很多的archivelog文件,而且默认是不会定期清除的,时间长久了,该文件夹会占用很大的空间. 问题:如何定期正确删除archivelog文件呢? 很多人直接在archive目录下删除文件,这样其实不能达到在Oracle CLF文件中删除文件记录的效果. 正确方法: 1.用RMAN连接目标DB:在命令行界面输入以下命令 RMAN target sys/*@orcl** 2.在RMAN命令窗口中,输入如下命令: crosschec

  • 关于Oracle Dataguard 日志传输状态监控问题

    ORACLE DATAGUARD的主备库同步,主要是依靠日志传输到备库,备库应用日志或归档来实现.当主.备库间日志传输出现GAP,备库将不再与主库同步.因此需对日志传输状态进行监控,确保主.备库间日志没有GAP,或发现GAP后及时处理.除了在告警日志中查看日志同步情况外,还可以通过查看相关视图来对日志传输状态进行监控. 1.主.备库查看当前日志状况 SELECT SEQUENCE#,STATUS FROM V$LOG; 2.备库查看RFS接收日志和MRP应用日志同步主库情况 SELECT PRO

  • oracle自动清理archivelog文件的具体方法

    1.登陆到服务器上创建rman自动删除两天前的归档日志脚本[oracle@108 ~]$ cat >>del_ora_log.rman <<EOF crosscheck archivelog all;delete noprompt expired archivelog all;delete noprompt force archivelog until time 'sysdate -2';   -------删除两天前的archivelogexit;EOF2.手动执行清除日志[or

  • Oracle 11g Dataguard参数详解

    注:本文译自<Oracle Data Guard 11g Handbook> Page 78 – Page 88 就Data Guard(后面都写成DG)来说,我们只关注如下三种参数: 1.独立于数据库角色的参数 2.数据库角色为primary时的参数 3.数据库角色为standby时的参数 虽然DG有着非常多的配置参数,我们实际使用的只有其中很少的部分,而且因为现在许多的DG功能被集成到了代码中,最近的DG版本中很多配置参数已经被弃用了.需要注意的是,为了便于完成数据库的角色转换(Role

  • Oracle WebLogic Server 12.2.1.2安装部署教程

    本教程为大家分享了Oracle WebLogic Server 12.2.1.2安装与项目部署,供大家参考,具体内容如下 1.下载 http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html 选择红框里面下载其中一个就可以. 现在不分windows版本和linux版本,为了兼容统一只发布jar版,安装过程方法一样 2.安装 直接执行java -d64 -jar D:\xxx\xx

  • ORACLE DATAGUARD中手工处理日志v$archive_GAP的方法

    从9i以后,oracle dataguard 备库一般都不需要手工处理丢失的日志,FAL自动会帮我们处理,下面通过个案例来讲下手工处理丢失的日志的方法: 1.在备库查询有哪些日志丢失,没应用到备库 SQL> select * from V$ARCHIVE_GAP; THREAD# LOW_SEQUENCE# HIGH_SEQUENCE# ---------- ------------- -------------- 1 9873 9876 我们可以看到9873到9876这四个归档日志丢失, 2.

  • Oracle数据库由dataguard备库引起的log file sync等待问题

    导读: 最近数据库经常出现会话阻塞的报警,过一会又会自动消失,昨天晚上恰好发生了一次,于是赶紧进行了查看,不看不知道,一看吓一跳,发现是由dataguard引起的log file sync等待.我们知道,通常log file sync等待都是由频繁写日志造成的,这次居然是由DG环境引起的. (一)问题描述 数据库:Oracle 11.2.0.4,单机版,有Dataguard环境 操作系统:centos 7.4 通过zabbix监控到的会话阻塞信息如下图,这里是自定义的监控,解释如下: 用户use

  • oracle数据库ORA-01196错误解决办法分享

    上一篇文章中我们了解到oracle常见故障类别及规划解析,接下来,我们看看oracle数据库ORA-01196错误解决的相关内容,具体如下: 问题现象 在使用shutdown abort停DataGuard备库后,备库不能open,报ORA-01196错误. 发现一备库不能应用日志,查看备库日志没发现报错,怀疑是备库应用日志服务停止,于是尝试重启备库: 可能因为备库是读业务比较繁忙,在shutdown immediate关闭备库时等时间过长,于是使用了shutdown abort命令: 但后面在

  • python链接Oracle数据库的方法

    本文实例讲述了python链接Oracle数据库的方法.分享给大家供大家参考.具体如下: 这里使用python链接Oracle数据库需要引用cx_Oracle库 #coding=UTF-8 import cx_Oracle def hello(): '''Hello cx_Oracle示例: 1)打印数据库版本信息. 2)查询表数据.''' conn = cx_Oracle.connect("obs61","obs61","tx8i.hp") c

  • Linux中大内存页Oracle数据库优化的方法

    前言 PC Server发展到今天,在性能方面有着长足的进步.64位的CPU在数年前都已经进入到寻常的家用PC之中,更别说是更高端的PC Server:在Intel和AMD两大处理器巨头的努力下,x86 CPU在处理能力上不断提升:同时随着制造工艺的发展,在PC Server上能够安装的内存容量也越来越大,现在随处可见数十G内存的PC Server.正是硬件的发展,使得PC Server的处理能力越来越强大,性能越来越高.而在稳定性方面,搭配PCServer和Linux操作系统,同样能够满重要业

  • Oracle备库宕机启动的完美解决方案

    简介 ORA-10458: standby database requires recovery ORA-01196: 文件 1 由于介质恢复会话失败而不一致 ORA-01110: 数据文件 1: 'XXXXXXXXXXXXXXXXXX\XXXXX1.DBF' 一个项目做了Oracle主从数据库同步,通过Dataguard实现,从库服务器宕机,再开机的时候,从库无法启动,报"ORA-01196: 文件 1 由于介质恢复会话失败而不一致"这个错误,具体日志信息如下: ORA-10458:

  • win平台oracle rman备份和删除dg备库归档日志脚本

    总觉得使用windows跑oracle是不靠谱的事情,可以这个世界上总有很多人喜欢做类似这样的事情,对于数据库比较常见的两件事情:rman和删除dg备库归档日志,在linux/unix平台上使用shell实现很简单,可是跑到win里面,就变的烦了,不是因为其麻烦,而是因为用的人少,不知道怎么下手处理该事情,我编写了简单的实现初级功能的win下面rman备份和删除备库归档日志脚本,供大家参考,也更加欢迎朋友提出来更加好的处理方法(win是真心的不懂)rman备份脚本 复制代码 代码如下: --ba

  • Oracle数据库中的基本建库操作详解

    图形建库: 1. 确定是否存在要建的库    查看 $ORACLE_BASE/admin/和$ORACLE_BASE/oradata 2. 运行dbca 3. 选择新建库--General Purpose(通用库)模版--Global Database Name:库名.域名,可以只使用 库名--SID区分大小写------数据路径选择,模版默认的是$ORACLE_BASE/oradata/dababase--备份数据的路径--内存分配(SGA专用内存,事务处理为主:PGA系统内存,数据为主)|S

  • Oracle 数据库启动过程的三阶段、停库四种模式详解

    目录 数据库的启动过程(3个台阶) 1.nomount 2.mount 3.open 数据库的启动过程(3个台阶) 1.nomount shutdown --> nomount startup nomount select status from v$instance; SQL> SQL> conn / as sysdba Connected to an idle instance. SQL> SQL> startup nomount ORACLE instance star

  • Oracle数据库 DGbroker三种保护模式的切换

    1.三种保护模式 – Maximum protection 在Maximum protection下, 可以保证从库和主库数据完全一样,做到zero data loss.事务同时在主从两边提交完成,才算事务完成.如果从库宕机或者网络出现问题,主从库不能通讯,主库也立即宕机.在这种方式下,具有最高的保护等级.但是这种模式对主库性能影响很大,要求高速的网络连接. – Maximum availability 在Maximum availability模式下,如果和从库的连接正常,运行方式等同Maxi

  • 浅谈Oracle数据库的建模与设计

    正在看的ORACLE教程是:浅谈Oracle数据库的建模与设计.要开发一个基于数据库的应用系统,其中最关键的一步就是整个系统所依据的数据库的建模设计,从逻辑的到物理的,一个环节疏于设计,整个的应用系统便似建立在危房之上,随着开发过程的不断深入,它要随时面临着各种难 以预料的风险,开发者要为修改或重新设计没有设计好的数据库系统而付出难以预料的代价.所以,一个良好的数据库设计是高效率的系统所必须的. 一.逻辑建模 数据库设计的方法因具体数据库而异,但是建模阶段的相同的,所以可以用一些通用的工具来进行

随机推荐