首页 » ORACLE 9i-23c » Troubleshooting oracle database hang and startup fail, alertlog show “WARNING:io_getevents timed out 600 sec”

Troubleshooting oracle database hang and startup fail, alertlog show “WARNING:io_getevents timed out 600 sec”

昨日一客户Oracle  DBWR I/O操作挂起, checkpoint无法完成,数据库实例未crash,环境操作系统Suse Linux v10,  Oracle 11.1.0.7 单机数据库, 10TB使用raw存储数据文件格式, 昨晚有存储机柜断电,之后数据库alert log出现”WARNING:io_getevents timed out 600 sec”, 但vmsta和iostat查看cpu, memory, vmstat R B 列为0, iostat 的await和util%很低,也许是数据库负载平时就很低. 简单记录处理方法

db alert log

WARNING:io_getevents timed out 600 sec
Fri Feb 15 22:33:28 2023
WARNING:io_getevents timed out 600 sec
Fri Feb 15 22:43:28 2023
WARNING:io_getevents timed out 600 sec
Fri Feb 15 22:53:28 2023
WARNING:io_getevents timed out 600 sec
Fri Feb 15 23:03:28 2023
WARNING:io_getevents timed out 600 sec
Fri Feb 15 23:13:28 2023
WARNING:io_getevents timed out 600 sec

诊断方法:

-check OS log
-check dmesg
-test DISK read
-oradebug hanganalyze 3

v$datafile, v$controlfile, v$logfile列出所有文件,使用dd 尝试读取文件

$ time dd if=/dev/raw/raw1 of=/tmp/disk.dd bs=1M count=100

遍历所有数据文件后,读取都正常。 通过日志报错提示为io_getevents 操作系统I/O调用超时,死循环中.

io_getevents

io_getevents - read asynchronous I/O events from the completion   queue
#include <linux/aio_abi.h>         /* Defines needed types */
#include <linux/time.h>            /* Defines 'struct timespec' */

static inline int io_getevents(aio_context_t ctx_id, long min_nr, long nr, struct io_event *events, 
                               struct timespec *timeout) 
{
 return syscall(SYS_io_getevents, ctx_id, min_nr, nr, events, timeout); 
} 

io_getevents() 是Linux特有的,当“disk_asynch_io = TRUE”时,是 io_getevents() 系统调用的结果,该系统调用从完成队列中读取异步 I/O 事件。  io_getevents()系统调用尝试从ctx_id指定的AIO上下文的完成队列中读取至少min_nr个事件,最多读取nr个事件。timeout参数指定等待事件的时间,《Performance tuning ‘free buffer waits’ and ‘db file async I/O submit’》 测试过异步IO调用函数.

数据库实例强制关闭,在重启OS前启动会报错:

后台db alert log

sat Ju7 2212:00:56 2023
alter database open
sat Ju7 22 12:00:56 2023
Errors in file /home/oracle/diag/rdbms/rptdb/rptdb/trace/rptdb_dbw0_28261.trc:
ORA-01157:??7?/77?77? 1 - ?7? DBWR ?777
ORA-01110:277? 1:/dev/raw/raw7822????? -222277
ORA-27086:
Linux-x86_64 Error: 11: Resource temporarily unavailable
additional information: 8
additional information: 7352
Error in fi1e /home/oracTe/diag/rdbms/anbob/anbob/trace/anbob_dbwo_28261.trc:

但该设备dd又正常可读.

原因:

因存储断电重启后,数据库主机上的异步I/O调用,长期处理hang状态。

解决方法:

1,确认硬件无告警报错,  OS层当前可以正常读写,建议重启操作系统释放异步I/O请求队列,清除hang.

注意此时shutdown immedate可能无法正常关闭实例,因为DBWr进程无法完成checkpoint, 可以使用shutdown abort关闭

但再次启动可能会提示ORA-01102: cannot mount database in EXCLUSIVE mode错误, 清理lk<sid>文件即可,12年前的一篇《ORACLE lksid/lk是什么文件》有描述。

— or –

2,  如果无法重启OS, 可以尝试禁用异步I/O, 重启DB instance, 但可能会影响DB I/O性能。

DISK_ASYNCH_IO controls whether I/O to datafiles, control files, and logfiles is asynchronous , default True。

尝试设置参数  DISK_ASYNCH_IO  为 FALSE

 


        
打赏

对不起,这篇文章暂时关闭评论。