Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1213140
  • 博文数量: 212
  • 博客积分: 10450
  • 博客等级: 上将
  • 技术积分: 1957
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-23 09:00
文章分类

全部博文(212)

文章存档

2012年(1)

2011年(16)

2010年(11)

2009年(9)

2008年(22)

2007年(36)

2006年(117)

分类: Oracle

2010-12-17 10:18:22

down机几个原因:
  • 主机突然掉电
  • oracle进程被手工kill掉
  • 如果是运行在一些虚拟机上,虚拟机进程突然关闭

何时出现异常现象?
异常down机,后再重启


故障定位
  • 1.如果使用者是非专业人员,则会在操作过程中看到ORA-01109错误和ORA-01034错误
所谓非专业人员,是指:
使用者对数据库的启动机制不甚了解,服务器往往做到了自动启动,使用者只是执行启动脚本(比如dbstart),甚至自动启动脚本被做进rc.local中,使用者只需要给服务器加电.
这种使用者在操作数据库(比如增删改查CRUD)时,会看到ORA-01109,ORA-01034:
SQL> conn sys/change_on_install as sysdba;
Connected.
SQL> CREATE TABLE person(
    pid varchar2(18) primary key,
    name varchar2(18) unique not null);

*
ERROR at line 1:
ORA-01109: database not open

SQL> select * from emp;
select * from scott.emp
*
ERROR at line 1:
ORA-01034: ORACLE not available

  • 2.如果使用者是管理员资格,可以在重启过程看到ORA-01102错误
SQL> conn /as sysdba
Connected to an idle instance.
如果你是在服务器开启后发现问题的,那通过登陆sysdba账户,就能立刻发现问题."Connected to an idle instance."说明数据库根本没mounted
启动数据库,出现ORA-01102错误
SQL> startup;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size             117442152 bytes
Database Buffers          159383552 bytes
Redo Buffers                7168000 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode
SQL> select open_mode from v$database;
select open_mode from v$database
                      *
ERROR at line 1:
ORA-01507: database not mounted


解决问题:
1. 关闭这个未完全启动的数据库
SQL> shutdown immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
2.查找dbs目录,找到lkORCL文件
这个目录随不同的安装过程,可能出现在不同的地方,有的时候在oracle账户的home目录下,有时出现在$ORACLE_HOME下
[oracle@oracle ~]$ cd $ORACLE_HOME
[oracle@oracle db_1]$ cd dbs
[oracle@oracle dbs]$ ls
hc_orcl.dat  initdw.ora  init.ora  lkORCL  orapworcl  spfileorcl.ora
3.检查1kORCL,是否在数据库关闭的情况下,仍存在不正常进程关联
[oracle@oracle dbs]$ fuser -u 1kORCL
-bash: fuser: command not found
[oracle@oracle dbs]$ /sbin/fuser -u 1kORCL
1kORCL: 没有那个文件或目录

注意是小写的西文字母l,不是数字1,别弄错了

此时在数据库shutdown的情况下,仍然有不少进程关联着进程,显然是"死锁"
[oracle@oracle dbs]$ /sbin/fuser -u lkORCL
lkORCL:              27621(oracle) 27623(oracle) 27625(oracle) 27627(oracle) 27629(oracle) 27631(oracle) 27633(oracle) 27635(oracle) 27637(oracle) 27639(oracle)
4.杀掉关联到lkORCL文件的进程
[oracle@oracle dbs]$ /sbin/fuser -k lkORCL
lkORCL:              27621 27623 27625 27627 27629 27631 27633 27635 27637 27639
[oracle@oracle dbs]$ /sbin/fuser -u lkORCL 
5.重启oracle,数据库正常启动
[oracle@oracle dbs]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 9月 15 05:50:35 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size             117442152 bytes
Database Buffers          159383552 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.
SQL> select open_mode from v$database;

OPEN_MODE
----------
READ WRITE

SQL> 

注意:网上有人建议用比较暴力的方法:直接删掉lk文件
$ rm lk*
事实是也是可行的,重启oracle系统后,oracle会重建这个文件
阅读(1293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~