sqlpus报错"ORA-01033: ORACLE initialization or shutdown in progress",且数据库状态是"ORA-01507: database not m

 

Oracle异常不能访问会话

今天在一个项目排除用户使用错误时,需要登录Oracle数据库进行查询和修改。但是,意外发现普通用户无法访问oracle instance。

1
sqlplus umail/umail
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 12 10:30:54 2010
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
ERROR:
ORA-01033: ORACLE initialization or shutdown in progress
Enter user-name:

不过,以 connect as sysdba 方式可以使用

1
sqlplus "/ as sysdba"

参考 ORA-01033: ORACLE initialization or shutdown in progress
对系统状态进行检查:

1
sqlplus / as sysdba
1
select status, database_status from v$instance;
STATUS	     DATABASE_STATUS
------------ -----------------
STARTED      ACTIVE
1
select open_mode from v$database;
select open_mode from v$database
                      *
ERROR at line 1:
ORA-01507: database not mounted

以上看到instance已经启动,但是数据库没有mounted。
尝试mount数据库

1
alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01102: cannot mount database in EXCLUSIVE mode

这个问题比较奇特,似乎是数据库状态不正常,处于维护状态(no mounted),所以普通用户无法使用。
不过,此 时,整个邮件系统使用尚正常,连接数据库的邮件系统能够正常收发邮件。(应用正常)

这个问题可能和我上次数据库故障 (无法使用sqlplus登录进行shutodown,不得已kill了oracle进程)有关。那次kill掉oracle进程后,也不能正常使用 sqlplus,被迫硬关机服务器。在那次故障处理时,数据库已经启动了,但是我再次使用slqplus "/ as sysdba", 并再次startup的报错情况有关。此时oracle对于后启动的命令没有正常显示mount,也不能分配资源。(Oracle数据库启动后,如果再尝试 startup ,会报错误 ORA-01102: cannot mount database in EXCLUSIVE mode

解决方案参考

参考: http://www.orafaq.com/forum/t/40030/2/
数 据库默认是以 EXCLUSIVE 模式启动。然而,ORA-01102错误是误导的并且可能由于 以下原因出现:

  • ORACLE_HOME/dbs 目录中仍然存在 sgadef<sid>.dbf 文件
  • Oracle进程(pmonsmonlgwrdbwr) 仍然存在
  • 共享内存段(shared memory segments,SGA)和信号灯(semaphores)在数据库关闭以后仍然存在
  • 存在一个 ORACLE_HOME/dbs/lk<sid> 文件

这个 lk<sid>sgadef<sid>.dbf 文件是用来锁住共享内存的。这意味着即使没有内存分配,Oracle仍然认为内存被锁住了。通过移除 sgadeflk 文件,就移除了通知Oracle共享内存被使用的信息。这样数据库就可以启动了。

可能的解决方案

通过以下步骤确保数据库已经干 净地关闭了

  • 检查在 ORACLE_HOME/dbs 目录中没有 sgadef<sid>.dbf 文件
1
ls $ORACLE_HOME/dbs/sgadef<sid>.dbf

如果文件存在,删除它。

  • 检查没有任何后题属于”oracle”用户的进程
1
ps -ef | grep ora_ | grep $ORACLE_SID

如果有后台进程存在,通过使用kill命令杀死进程

1
kill -9 <Process_ID_Number>
  • 验证没有”oracle”用户拥有的共享内存段和信号
1
ipcs
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x8abda088 0          oracle    640        1243611136 26
0x71655724 65538      oracle    640        1243611136 13

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xf0bfd328 196610     oracle    640        154
0x3aec371c 589835     oracle    640        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

如果有属于oracle用户的共享段或信号,移除它

1
ipcrm -m <Shared_Memory_ID_Number>
1
ipcrm -s <Semaphore_ID_Number>
  • 确保没有存在 $ORACLE_HOME/dbs/lk<sid> 文件
  • 现在可以启动数据库了

实际解决过程操作记录

  • 首先尝试关闭数据库
1
shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.

但是,此时检查后台进程仍然存在oracle进程

1
ps -ef | grep ora_
oracle    3642     1  0 Jul09 ?        00:00:00 ora_pmon_umail
oracle    3644     1  0 Jul09 ?        00:00:00 ora_psp0_umail
oracle    3646     1  0 Jul09 ?        00:00:05 ora_mman_umail
oracle    3655     1  0 Jul09 ?        00:00:30 ora_dbw0_umail
oracle    3657     1  0 Jul09 ?        00:00:10 ora_lgwr_umail
oracle    3659     1  0 Jul09 ?        00:00:00 ora_ckpt_umail
oracle    3661     1  0 Jul09 ?        00:00:14 ora_smon_umail
oracle    3663     1  0 Jul09 ?        00:00:00 ora_reco_umail
oracle    3665     1  0 Jul09 ?        00:00:06 ora_cjq0_umail
oracle    3667     1  0 Jul09 ?        00:00:24 ora_mmon_umail
oracle    3669     1  0 Jul09 ?        00:00:00 ora_mmnl_umail
oracle    3671     1  0 Jul09 ?        00:00:00 ora_d000_umail
oracle    3673     1  0 Jul09 ?        00:00:00 ora_s000_umail
oracle    3807     1  0 Jul09 ?        00:00:00 ora_qmnc_umail
oracle    4058     1  0 Jul09 ?        00:00:05 ora_q000_umail
oracle    4816     1  0 Jul09 ?        00:00:00 ora_q001_umail
oracle   25615     1  0 13:05 ?        00:00:00 ora_j000_umail

但是这时候再尝试关闭数据库会报错,显示oracle不在运行。

1
shutdown immediate;
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
  • 杀死Oracle后台进程
1
kill -9 3642 3644 3646 3655 3657 3659 3661 3663 3665 3667 3669 3671 3673 3807 4058 4816 25615
  • 检查内存段
1
ipcs

显示

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x8abda088 0          oracle    640        1243611136 0

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xf0bfd328 196610     oracle    640        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

删除共享内存段

1
ipcrm -m 0

再次检查

1
ipcs
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xf0bfd328 196610     oracle    640        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

删除信号

1
ipcrm -s 196610

再次检查

1
ipcs
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
  • 删除lk<sid>
1
2
cd $ORACLE_HOME/dbs
rm lkUMAIL
  • 启动数据库
1
sqlplus "/ as sysdba"
1
startup
ORACLE instance started.

Total System Global Area 1241513984 bytes
Fixed Size		    1219136 bytes
Variable Size		  134219200 bytes
Database Buffers	 1090519040 bytes
Redo Buffers		   15556608 bytes
Database mounted.
Database opened.
    • 启动时检查数据库日志,确保没有意外报错
1
2
cd $ORACLE_BASE/admin/umail/bdump
tail -f alert_umail.log
  • 检查数据库:状态正常
1
select status, database_status from v$instance;
STATUS	     DATABASE_STATUS
------------ -----------------
OPEN	     ACTIVE
1
select open_mode from v$database;
OPEN_MODE
----------
READ WRITE

这表明数据库状态已经恢复正常。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值