暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(ORA-01102、ORA-32004)-Oracle关闭时没有完全释放资源

原创 huawei 2021-03-02
970

(ORA-01102、ORA-32004)-Oracle关闭时没有完全释放资源

现象描述

启动Oracle失败,系统显示如下错误信息:

SQL> startup

ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE instance started.

Total System Global Area 2137886720 bytes
Fixed Size                  2122920 bytes
Variable Size            1191185240 bytes
Database Buffers          939524096 bytes
Redo Buffers                5054464 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode
复制

可能原因

异常关闭Oracle时,存在以下几种没有释放资源的可能原因:
  • Oracle的后台进程(如SMON、PMON、LWGW、DBWn等)没有关闭。
  • 用于锁内存的文件“lk<sid>”“sgadef<sid>.dbf”没有删除。
  • Oracle的共享内存段或信号量没有释放。

定位思路

  1. 如果是HA系统,检查其他节点是否已经启动实例。
  2. 检查Oracle进程是否存在,如果存在则删除进程。
  3. 检查锁内存文件“lk<sid>”“sgadef<sid>.dbf”是否存在,如果存在,则删除锁内存文件。
  4. 检查共享内存段是否存在,如果存在,则清除共享内存段。
  5. 检查信号量是否存在,如果存在,则清除信号量。

处理步骤

  1. oracle用户登录数据库所在机器。
  2. 检查数据库在备节点上的状态。

    确定备节点的实例处于关闭状态。

  3. 检查Oracle进程是否启动。

    % ps -ef | grep pmon

    如果进程启动,则关闭。

    % kill -9 Oracle进程ID

  4. sysdba用户连接数据库。

    % sqlplus / as sysdba

  5. abort模式退出数据库。

    SQL> shutdown abort;

  6. 重新启动数据库。

    SQL> startup

    • 如果数据库启动成功,则结束操作。
    • 如果数据库启动失败,则执行7
  7. 退出SQLPLUS。

    SQL> quit

  8. 检查锁内存文件“lk<sid>”“sgadef<sid>.dbf”是否被删除。
    1. 进入“$ORACLE_HOME/dbs”目录。

      % cd $ORACLE_HOME/dbs

    2. 检查“sgadef<sid>.dbf”是否存在。

      % ls sgadef*

      • 如果“sgadef<sid>.dbf”文件不存在,系统提示如下信息:
        sgadef* not found
        复制
      • 如果“sgadef<sid>.dbf”文件存在,则删除此文件。

        % rm sgadef*

    3. 检查“lk<sid> ”是否存在。

      % ls lk*

      • 如果“lk<sid> ”不存在,系统提示如下信息:
        lk* not found
        复制
      • 如果“lk<sid> ”文件存在,则删除此文件。

        % rm lk*

    4. 重新启动数据库。

      SQL> startup mount;
      说明:
      • 如果数据库启动成功,则结束操作。
      • 如果数据库启动失败,则执行9
  9. root用户登录数据库所在机器。
  10. 栓查共享内存段是否存在。如果存在,则删除。
    1. 查看共享内存段。

      # ipcs -map

      系统显示如下信息时,表示Oracle共享内存段存在。
      ------ Shared Memory Creator/Last-op --------
      shmid   owner  cpid    lpid
      786444  root    6490   6438
      819213  root    6549   6438
      1409040 oracle   31502  16728
      复制
    2. 根据ID号清除共享内存段。

      # ipcrm –m 1409040

      说明:
      1409040是共享内存段ID,以系统实际查询值为准。
  11. 检查信号量是否存在。如果存在,则删除。
    1. 查看信号量。

      # ipcs -s

      系统显示如下信息时,表示Oracle信号量存在。

      key       semid      owner   perms    nsems
      0x17ff6454 360448     oracle    640     154
      复制
    2. 清除oracle的信号量。

      # ipcrm -s 360448

      说明:
      360448是信号量ID,以系统实际查询值为准。
    3. 再次查询确认。

      # ipcs -s

      删除成功,系统显示如下信息:
      ------ Semaphore Arrays --------
      key  semid  owner  perms   nsems
      
      复制
  12. 重新启动数据库。

    SQL> startup

    数据库启动成功,系统显示如下信息:
    ORACLE instance started.
    
    Total System Global Area 2137886720 bytes
    Fixed Size                  2122920 bytes
    Variable Size            1191185240 bytes
    Database Buffers          939524096 bytes
    Redo Buffers                5054464 bytes
    Database mounted.
    Database opened.
    复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论