【故障处理】因AIX异步IO没有开启导致SQL*Plus不可用

今天处理了一起因异步IO没有开启导致Oracle的SQL*Plus不可用的故障。记录在此,供参考。

1.故障场景
情况是这样的,系统是使用IBM的HACMP做的两节点HA,在第一个节点部署完Oracle(11.1.0.6)并在挂载的存储上创建完数据库后,使用tar方法将第一个节点上的Oracle软件解tar到第二个节点上完成软件安装。但当在第二节点上运行SQL*Plus时抛出如下的错误:
$ sqlplus / as sysdba
exec(): 0509-036 Cannot load program sqlplus because of the following errors:
        0509-130 Symbol resolution failed for /usr/lib/libc.a[aio_64.o] because:
        0509-136  Symbol kaio_rdwr64 (number 0) is not exported from
                  dependent module /unix.
        0509-136  Symbol listio64 (number 1) is not exported from
                  dependent module /unix.
        0509-136  Symbol acancel64 (number 2) is not exported from
                  dependent module /unix.
        0509-136  Symbol iosuspend64 (number 3) is not exported from
                  dependent module /unix.
        0509-136  Symbol aio_nwait (number 4) is not exported from
                  dependent module /unix.
        0509-150  Dependent module libc.a(aio_64.o) could not be loaded.
        0509-026 System error: Cannot run a file that does not have a valid format.
        0509-192 Examine .loader section symbols with the
                'dump -Tv' command.

2.故障原因
从报错信息中很容易发现到处都充斥的“aio”关键字,AIO = Asynchronous I/O 顾名思意“异步I/O”是也。
根本原因是AIX操作系统的异步I/O没有开启。

3.故障处理
既然定位了问题,处理就简单了,这里给出两种异步I/O的开启方法。
1)使用操作系统命令开启异步I/O
(1)确认所需的bos.rte.aio是否安装妥当
# lslpp -l bos.rte.aio
  Fileset                      Level  State      Description         
  ----------------------------------------------------------------------------
Path: /usr/lib/objrepos
  bos.rte.aio               5.3.0.62  COMMITTED  Asynchronous I/O Extension

(2)使用如下命令开启AIX操作系统的异步I/O
# mkdev -l aio0
aio0 Available

# chdev -P -l aio0 -a autoconfig='available'
aio0 changed

2)使用rootpre.sh脚本开启异步I/O
如果您能找到rootpre.sh,直接执行这个脚本便可达到开启异步I/O的目的。
可气的是在64-bit IBM RS 6000 AIX 5L版本的Oracle 11.1.0.6.0的安装介质里面根本无法找到这个rootpre.sh脚本,在安装开始时也不会像以前一样提示进行这样的check。这是Oracle的一个internal bug。竟然被遗忘了,这一点在MOS中有详细记载,ML号是468472.1,文章名字是:The "rootpre.sh" Script. And "rootpre" Directory Are Missing From The Oracle11g Release 1 (11.1.0.6) Media。文中给出了三种处理方法:
第一种方法:从OTN上下载被遗漏的rootpre.sh脚本;
下载地址是:http://download.oracle.com/otn/aix/oracle11g/rootpre_aix.zip
第二种方法:使用10.2.0.1安装介质中的rootpre.sh亦可;
第三种方法:下载patch 6613550,执行其中提供的rootpre.sh脚本。

最后摘录一下rootpre.sh脚本中有关异步I/O设置的内容,方便大家参考。
#====================================================================================
#======================= configure Asynchronous I/O =================================
#====================================================================================

#--- function to check the autoconfig value on an AIO device
is_autoconfig_available () {
   DEVICE=${1}
   VALUE=`$LSATTR -E -l ${DEVICE}|${GREP} autoconfig|${AWK} '{print $2}'`
   if [ "${VALUE}" = "available" ]; then
      return 1
   else
      return -1
   fi
}

#--- In AIX 6.1 and newer AIO is already configured and ioo is used,
#---    not chdev to modify AIO configuration
if [ $OSVER -lt 6 ]; then
  log_con "\nConfiguring Asynchronous I/O...."
  AIO=`${LSDEV} -C -t aio|${AWK} '{print $2}'`
  case ${AIO} in
    *Available*) log_con "Asynchronous I/O is already defined"
               is_autoconfig_available "aio0"
               if [ $? -ne 1 ]; then
                  log_con "Setting autoconfig to available for aio0"
                  log_do "${CHDEV} -P -l aio0 -a autoconfig=available"
               fi
               ;;
      *Defined*) log_do "${MKDEV} -l aio0"
               log_do "${CHDEV} -P -l aio0 -a autoconfig=available"
               ;;
            *) log_con "Asynchronous I/O is not installed on this system."
               log_con "You will need to install it, and either configure it yourself using"
               log_con "'smit aio' or rerun the Oracle root installation procedure."
               ;;
  esac

  #--- configure POSIX AIO if AIX 5.2 or greater, we may want to use it
  if [ ${OSVER}${OSREL} -ge 52 ]; then
    log_con "\nConfiguring POSIX Asynchronous I/O...."
    POSIX_AIO=`${LSDEV} -C -t posix_aio|${AWK} '{print $2}'`
    case ${POSIX_AIO} in
      *Available*) log_con "Posix Asynchronous I/O is already defined"
                   is_autoconfig_available "posix_aio0"
                   if [ $? -ne 1 ]; then
                      log_con "Setting autoconfig to available for posix_aio0"
                      log_do "${CHDEV} -P -l posix_aio0 -a autoconfig=available"
                   fi
                   ;;
        *Defined*) log_do "${MKDEV} -l posix_aio0"
                   log_do "${CHDEV} -P -l posix_aio0 -a autoconfig=available"
                   ;;
                *) log_con "Posix Asynchronous I/O is not installed on this system."
                   log_con "You will need to install it, and either configure it yourself using"
                   log_con "'smit aio' or rerun the Oracle root installation procedure."
                   ;;
    esac
  fi
fi

4.小结
这个故障是由于部署过程中不够细心导致的,如若能严格按照既定的操作规范进行部署,一般都可以避免此类问题的发生。
BTW:当遇到大段的报错信息时不要惊慌,对于故障排查来说,报错信息就是提示信息,这是好事。最可怕的不是遇到报错信息,而是出现了故障没有任何的信息作为指引!!

Good luck.

secooler
10.01.22

-- The End --

时间: 2024-08-02 23:58:02

【故障处理】因AIX异步IO没有开启导致SQL*Plus不可用的相关文章

VXFS启用异步IO导致的严重问题

今天在做数据迁移的时候,碰到了一个严重的问题,数据加载完全hang住了,最后无奈回退了. 系统使用的vxfs文件系统,在生产升级前一个月的时候,做过一次小规模的数据迁移,当时查看awr,ash,最后根据addm的推荐得出加载速度比较慢主要是由于异步IO导致的,而且当时生产库确实没有启用异步io, filesystemio_option的设置为none,在经过确认之后,在半个月前的一此例行维护中,由客户做了这个配置的修改.修改后发现iowait明显增加了,当时也没再多跟多的分析因为没有比较明显的性

如何在Hp的主机打开异步IO

异步 一.说说异步IO(Aio)   在Hp-ux中,当采用同步IO的方式时,这就意味着在下一次写IO进行之前,前一次IO必须返回"成功写完成"的信息,可以看到同步IO方式在IO负荷比较大的系统存在着性能的瓶颈.而采用异步IO方式时,在写请求发出之后操作系统会立即反回给应用一个写成功的信息,余下的事就由操作系统完成了.在Hp-ux中使用Oracle.Sybase这些数据库时,为减少IO的瓶颈.提高库的性能,建议打开异步IO,Hp在这方面相对Aix来说相对麻烦一些. 二.Hp-ux方面打

ORACLE数据库异步IO介绍

异步IO概念     Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能.它是Linux 2.6 版本内核的一个标准特性,当然我们在2.4 版本内核的补丁中也可以找到它.AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成.稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果.     Linux IO模型(I/O models)分同步IO模型(synchronous models)和异步IO模型(asynchr

MySQL · 源码分析 · InnoDB 异步IO工作流程

之前的一篇内核月报InnoDB IO子系统 中介绍了InnoDB IO子系统中包含的同步IO以及异步IO.本篇文章将从源码层面剖析一下InnoDB IO子系统中,数据页的同步IO以及异步IO请求的具体实现过程. 在MySQL5.6中,InnoDB的异步IO主要是用来处理预读以及对数据文件的写请求的.而对于正常的页面数据读取则是通过同步IO进行的.到底二者在代码层面上的实现过程有什么样的区别? 接下来我们将以Linux native io的执行过程为主线,对IO请求的执行过程进行梳理. 重点数据结

PostgreSQL 异步IO实测

标签 PostgreSQL , effective_io_concurrency , 异步IO 背景 异步IO的目的是充分发挥块设备的吞吐能力,让块设备处于更繁忙的工作状态(一次连续摄取更多的块),而不是等用户进程需要数据时再读取. 如果数据库并发连接(或者活跃会话)足够时,并且块设备处于繁忙状态,那么没有必要开启异步IO,因为开了也没什么用,块设备已经足够的忙了. 目前PostgreSQL的bitmap heap scan支持异步IO,因为bitmap heap scan是按顺序读取堆表的数据

《Netty 权威指南》—— 伪异步IO编程

声明:本文是<Netty 权威指南>的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文. 为了解决同步阻塞IO面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽. 下面,我们结合连接模型图和源码,对伪异步IO进行分析,看它是否能够解决同步阻塞IO面临的问题.

linux异步IO浅析

知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上.预先知道这些数据的位置,所以预先发起异步IO读请求.等到真正需要用到这些数据的时候,再等待异步IO完成.使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情). 假此机会,也顺便研究了一下linux下的异步IO的实现. linux下主要有两套异步IO,一套是由glibc实现的(以下称之为glibc版本).一套是由linux内核实现,并由l

Python通过select实现异步IO的方法

  本文实例讲述了Python通过select实现异步IO的方法.分享给大家供大家参考.具体如下: 在Python中使用select与poll比起在C中使用简单得多.select函数的参数是3个列表,包含整数文件描述符,或者带有可返回文件描述符的fileno()方法对象.第一个参数是需要等待输入的对象,第二个指定等待输出的对象,第三个参数指定异常情况的对象.第四个参数则为设置超时时间,是一个浮点数.指定以秒为单位的超时值.select函数将会返回一组文件描述符,包括输入,输出以及异常. 在lin

Python通过poll实现异步IO的方法

  本文实例讲述了Python通过poll实现异步IO的方法.分享给大家供大家参考.具体分析如下: 在使用poll()后返回轮询对象,该对象支持以下方法: pollObj.register(fd,[,eventmask])第一个参数是注册新的文件描述符fd,fd要么是一个整数文件描述符,要么可以带有一个获取文件描述符的fileno()方法的对象.eventmask是一些按位或标记,这些标记指示要处理的事件. POLLIN: 用于读取数据 POLLPRI: 用于读取紧急数据 POLLOUT: 准备