@H_502_1@导读: @H_502_1@最近数据库经常出现会话阻塞的报警,过一会又会自动消失,昨天晚上恰好发生了一次,于是赶紧进行了查看,不看不知道,一看吓一跳,发现是由dataguard引起的log file sync等待。我们知道,通常log file sync等待都是由频繁写日志造成的,这次居然是由DG环境引起的。@H_502_1@ @H_502_1@(一)问题描述 @H_502_1@数据库:Oracle 11.2.0.4,单机版,有Dataguard环境 @H_502_1@操作系统:centos 7.4 @H_502_1@ @H_502_1@通过zabbix监控到的会话阻塞信息如下图,这里是自定义的监控,解释如下: @H_502_1@用户usera,其session id为2663,session serial为27727,该会话未在执行sql语句,但是却一直处于非空闲等待,等待的事件为log file sync,一共等待了548s @H_502_1@ @H_502_1@ @H_502_1@(二)分析 @H_502_1@查看报警期间的历史会话信息:
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',1)">yyyy-mm-dd hh24:mi:ss') and a.sample_time < to_date(2020-11-25 20:59:00and blocking_session is not null order by a.sample_time;
@H_502_1@可以看到,会话1333,2191,2663均被会话1331阻塞了,等待事件是log file sync,它们在等待的会话为1311。
@H_502_1@
@H_502_1@查询1331会话信息,发现是日志写进程LGWR,1311会话不再被其它会话阻塞,可以判定该会话为阻塞源头,1331会话的等待事件是LGWR-LNS wait on channel。
and a.session_id = 1331 by a.sample_time;
@H_502_1@
@H_502_1@
@H_502_1@在本案例中,一共出现了2种类型的非空闲等待事件:
- log file sync
- LGWR-LNS wait on channel(阻塞源头)
sql> SELECT NAME FROM v$event_name a WHERE a.name LIKE %SCN%' OR a.name %LMS%; NAME ---------------------------------------------------------------- retry contact SCN lock master ges master to get established for SCN op
%LNS%--------------------------------------------------------------
LNS wait on ATTACH
LNS wait SENDREQ
LNS wait DETACH
LNS wait LGWR
LGWR wait LNS
LNS ASYNC archive log
LNS ASYNC dest activation
LNS ASYNC end of
LNS simulation latency wait
LGWR-LNS wait on channel
@H_502_1@回过头,再次查看我们的生产环境的问题,是log file sync伴随着LGWR-LNS wait on channel出现,再次确认数据库的参数信息,发现数据库运行在最大可用模式,备库采用了同步(sync)方式传送数据。
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
NAME TYPE VALUE
--------------------------- ------- ----------------------------------------------------------------------------------------------------
log_archive_dest_2 string SERVICE=adg_orcl LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=adg_orcl
@H_502_1@再进一步分析"LGWR-LNS wait on channel"等待事件:
@H_502_1@什么是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) )。
@H_502_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。
@H_502_1@
@H_502_1@可以断定,数据库的异常等待是由于主库的LNS进程同步传送在线日志信息给DG环境引起的,且引起的瓶颈在备库端。想到我们的主库是高配的物理服务器,备库是低配的云主机(虚拟机),出现这种问题也就不足为奇了。
@H_502_1@
@H_502_1@(三)解决方案
@H_502_1@使用异步方式传送日志信息,修改日志传送方式为异步(async)传送,修改Data Guard保护模式为最大性能模式
修改日志传送方式为异步模式(async) sqlalter system set log_archive_dest_2= SERVICE=adg_orcl LGWR ASYNC VALID_FOR=(all_logfiles,primary_role) DB_UNIQUE_NAME=adg_orcl' scopeboth; 重新启用通道 sqlset log_archive_dest_state_2 defer; sql enable; 转换为最大性能模式,在备库和主库上执行: alter database set standby to maximize performance;