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
对不起,这篇文章暂时关闭评论。