IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

DBA手记:共享内存无法正常释放的处理

Oracle Life 2011-02-28 23:13:12 累计浏览 2,630 次
本机暂存

在数据库启动之后,需要从操作系统上分配共享内存和信号量(Semaphore)资源,而在某些情况下,数据库异常关闭后,这些资源有可能无法正常释放,则在下次启动时,数据库可能遭遇错误,无法正常启动。

在一个客户环境(操作系统为SUN Solaris平台)中出现了ORA-04031错误之后,使用了shutdown abort选项关闭了数据库:

Sun Jul 19 19:20:23 2009

Errors in file /ora9i/oracle/admin/ora9i/bdump/ora9i1_j000_14337.trc:

ORA-12012: error on auto execute of job 721

ORA-04031: unable to allocate 4088 bytes of shared memory ("shared pool","STANDARDSYS","PL/SQL MPCODE","BAMIMA: Bam Buffer")

Sun Jul 19 19:24:24 2009

Errors in file /ora9i/oracle/admin/ora9i/bdump/ora9i1_j000_17497.trc:

ORA-12012: error on auto execute of job 721

ORA-04031: unable to allocate 4088 bytes of shared memory ("shared pool","STANDARDSYS","PL/SQL MPCODE","BAMIMA: Bam Buffer")

Sun Jul 19 19:26:56 2009

Shutting down instance (abort)

License high water mark = 1012

Instance terminated by USER, pid = 19157

接下来的尝试启动失败,告警日志记录了如下所示的错误信息:

Sun Jul 19 19:35:27 2009

Errors in file /ora9i/oracle/admin/ora9i/udump/ora9i1_ora_25055.trc:

ORA-27154: post/wait create failed

ORA-27300: OS system dependent operation:semget failed with status: 28

ORA-27301: OS failure message: No space left on device

ORA-27302: failure occurred at: sskgpsemsper

注意以上信息中,提示失败的操作是semget,其实如果仔细阅读这个提示,就可以获知错误的真正原因,在操作系统可以通过man semget查看手册,了解出错的真实原因。以下输出告诉我们,semget的任务是获得信号量集(get set of semaphores),所以也就可以知道之前的提示No space left on device并不是指存储空间,而是信号量资源:

oracle@db-server # man semget

NAME

     semget - get set of semaphores

SYNOPSIS

     #include

     #include

     #include

     int semget(key_t key, int nsems, int semflg);

DESCRIPTION

     The semget() function returns the semaphore identifier associated with key.

知道了这个原因以后,就可以通过ipcs命令来找到数据库的信号量资源占用,该主机上有三个数据库,Oracle用户的信号量集就是没有正常释放的那个:

oracle@db-server # ipcs -sa

IPC status from as of Sun Jul 19 22:01:09 CST 2009

T      ID      KEY        MODE        OWNER GROUP  CREATOR   CGROUP NSEMS   OTIME    CTIME

Semaphores:

s  851977   0x462fcb40 --ra-r----- orabil9 dbabil9  orabil9  dbabil9   604 22:07:58 12:54:47

s 1769482   0x6b997db0 --ra-r----- oracle9    dba9  oracle9     dba9  2004 22:07:15 17:03:39

s 1245195   0x8ea0d4d4 --ra-ra----  oracle   dba   oracle      dba  2004 no-entry 19:27:06

接下来就可以通过操作系统的ipcrm命令来移除信号量集:

oracle@db-server # man ipcrm

NAME

       ipcrm - remove a message queue, semaphore set or shared memory id

执行过程如下所示:

oracle@db-server # ipcrm -s 1245195

oracle@db-server # ipcs -sa

IPC status from as of Sun Jul 19 22:09:01 CST 2009

T      ID      KEY        MODE        OWNER    GROUP  CREATOR   CGROUP NSEMS   OTIME    CTIME

Semaphores:

s  851977   0x462fcb40 --ra-r----- orabil9 dbabil9  orabil9  dbabil9   604 22:07:58 12:54:47

s 1769482   0x6b997db0 --ra-r----- oracle9    dba9  oracle9     dba9  2004 22:07:15 17:03:39

完成这个操作之后,数据库就可以正常启动了。

 

这个案例告诉我们的是,如果采用特殊手段来进行维护和管理,那么必须清楚这些操作可能带来的影响和后果。

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. Oracle MTS模式下 进程地址与会话信息 (累计阅读 14,408)
  2. 那些在11gR2中可能惹祸的新特性,一张列表帮助你摆脱升级11gR2带来的烦恼 (累计阅读 6,879)
  3. nginx源码分析-共享内存 (累计阅读 6,285)
  4. 性能测试工具sysbench简介 (累计阅读 6,027)
  5. 大于2GB的Listener.log和运行超过198天的主机上的Oracle实例 (累计阅读 5,863)
  6. 仅仅只备份是不够的 (累计阅读 5,825)
  7. Oracle Database 12c 新特性 - Native Top N 查询 (累计阅读 5,751)
  8. ORACLE最大可以存储多少数据量 (累计阅读 5,729)
  9. Oracle DBA的学习进阶成长树-从初出茅庐到高瞻远瞩 (累计阅读 5,603)
  10. 老托的Oracle 数据库Patch概念性小常识 (累计阅读 5,549)