(一)说明:
由于客户大厦突然断电,导致保系统服务器宕机,系统无法正常使用。
(二)系统恢复过程:
1、来电后,
手工重启一台tomcat后信息管理系统恢复正常。
2,同样重启档案系统后,登陆系统发现无法正常使用档案系统,说明系统没有正常启动。查看日志:
除了黄色部分外日志都显示正常,清理work文件重启也不行,黄色部分显示jar可能有重复的或版本不一致的,检查tomcat下lib和eams下lib发现slf4j确实有相近或重的,接下来考虑替换或升级jar不失为一种好方法,但系统原来一直正常运行啊,况且移除类似重复jar包也不行。
3 后来关闭linux服务器防火墙(service iptables stop),重启系统,查看日志,此时日志如下:
这时真正的错误信息才会显现出来,连接不上数据库。
可能是防火墙屏蔽了8080端口,可原来防火墙一直是开启状态,防火墙规则里面也没配置拒绝8080端口,系统都能正常使用(可能,可能的原因呢?)。(后来系统正常后开启防火墙后也不行,关闭就可以,所以最后把8080,和1521端口添加到防火墙配置规则里并开启防火墙)
所以这里建议:修复系统或安装应用时可以暂时关闭防火墙,以免端口被屏蔽影响判断,不过记得最后开启防火墙哦。
4、用PLSQL客户端连接oracle数据库,连接不上,显示无监听。所以初步判断是oracle数据库问题。(这里可以用telnet或者nc,nmap等命令连接一下远程端口检查是否开启,前提是服务器已经安装好了telnet,nc,nmap)
5、所以接下来登陆oracle数据库服务器,进行数据库检查。
(1)首先关闭防火墙service iptables stop;
(2)通过命令 netstat –anp | grep 1521检查1521端口是否开启
显示正常
(3)用lsnrctl status检查数据库监听是否正常:
显示正常
(4)再用ps命令检查:
显示正常。
到这一步,貌似oracle数据库显示一切正常。那就接下来重启数据库看看
(5)oracle linux下启动大概有三种方法,可以到安装根目录启动(可能不知道安装目录),也可以用脚本,网上有具体方法,这里最可靠好用的还是在SQL里启动。
切换到oracle用户:
依次命令为:su – oracle ; (切换到oracle用户)
sqlplus /nolog; (登陆到sqlplus,是不登陆到数据库服务器的模式)
connect /as sysydba(以数据库管理员身份)
start(启动数据库)
(关闭命令为shutdown immediate);
这里可以看到显示启动失败,重点为黄色标识的。如果你用select
*from xxx ;随便找个表查询一下数据会提示数据库无效,查不出数来。
ERROR at line 1:
ORA-01034: ORACLE not available
这个错误是因为数据库默认将使用spfile启动数据库,
如果spfile不存在,则就会出现上述错误。
注:Oracle在启动过程中,需要读取参数文件(pfile/spfile)来创建实例.Oracle在启动过程中,寻找参数文件的顺序为:spfile<sid>.ora,spfile.ora,init<sid>.ora.
spfile:服务器参数文件 是二进制格式,不能用记事本打开修改
pfile:参数文件 是文本文件格式,可以用记事本打开修改,
如果不指定用什么启动,则系统默认使用spfile,如果没有spfile,则使用pfile启动
解决方法:将$ORACLE_BASE/admin/数据库名称/pfile目录下的init.ora.012009233838(后面数字可能不同)形式的文件copy 到$ORACLE_HOME/database 目录下initoracle.ora即可。(注:initoracle.ora中的oracle为你的实例名 ORACLE_SID)
(6)从上可知oracle安装路径是uo1/app/oracle/….,然后进入到oracle目录,找到intioracle.ora(因为安装的数据库目录名可能不同,.ora文件名也不同,所以完全按网上的名去找肯定找不着)。在这里进入到oracle具体安装目录/u01/app/oracle/product/11.2.0_1/dbs
.ora文件就在dbs下面,而且名为init.ora.
不好找的话,你也可以用命令搜索一下文件的位置:
find /* -name '*.ora' –print
这里可以看出想找的文件就是dbs下的init.ora
(7)找到init.ora文件后最重要的是首先备份好这个文件。同时找到pfile文件
(8)然后用admin/orcl/pfile/文件夹下面的init.ora.11172012124714覆盖/db_1/dbs/下的init.ora文件
cp/u01/app/oracle/admin/orcl/pfile/init.ora.11172012124714/u01/app/oracle/product/11.2.0/db_1/dbs/init.ora
(9)启动数据库后,发现问题还是如上所示。
这个地方它提示打不开initORCL.ora,ORCL是实例名 ORACLE_SID。所以应该拷贝成initORCL.init而不是init.ora(不知道为什么原来是init.ora而没有initORCL.ini),重来一遍:
cp/u01/app/oracle/admin/orcl/pfile/init.ora.11172012124714/u01/app/oracle/product/11.2.0/db_1/dbs/initORCL.ora
这时候应该说没有问题了,但重启数据库的时候还是起不来,问题如下:
ORA-48108: invalid value given for the diagnostic_dest init.ora parameter
ORA-48140: the specified ADR Base directory does not exist [/u01/app/oracle/product/11.2.0/db_1/dbs/<ORACLE_BASE>]
ORA-48187: specified directory does not exist
Linux Error: 2: No such file or directory
Additional information: 1
(10)这时候问题出在哪里呢,明明按照步骤做了,按道理说应该不会有问题了。注意:上面拷贝cp .ora文件都是在root用户下,此时切换到oracle用户,su – oracle,再拷贝一次
奇迹就这么发生了,启动基本成功。
(这个地方不知道为什么用oracle用户就可以,用root用户就不行,白折腾了好几遍,而且dbs下没有.bash_profile文件,怎么会和用户变量有关么?我看遇到这个问题网上有改initORCL.ora文件的等等,这里需要好好研究下。。。。。。。)
(11)接下来解决启动时的cannot mount database in EXCUSIVE mode错误,该错误大意是: “Oracle被异常关闭时,有资源没有被释放……”
这里百度了一段话:
(ORA-01102 cannot mount database inEXCLUSIVE mode
出现1102错误可能有以下几种可能:
一、在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;
二、说明 oracle 被异常关闭时,有资源没有被释放,一般有以下几种可能,
1、 oracle 的共享内存段或信号量没有被释放;
2、 oracle 的后台进程(如SMON、PMON、DBWn等)没有被关闭;
3、用于锁内存的文件lk<sid>和sgadef<sid>.dbf文件没有被删除。
首先,虽然我们的系统是HA系统,但是备节点的实例始终处在关闭状态,这点通过在备节点上查数据库状态可以证实。
其次、是因系统掉电引起数据库宕机的,系统在接电后被重启,因此我们排除了第二种可能种的1、2点。最可疑的就是第3点了。)
(12)这时在dbs下查找是否有lk(SID) 文件存在
发现有lkORCL文件存在
再用/sbin/fuser –u lkORCL; /sbin/fuser –k lkORCL杀掉。用/sbin/fuser –u lkORCL检查还有没有,如果没有了,就ok。
合理的顺序应该是先用/sbin/fuser –u lkORCL;检查,再用/sbin/fuser –k lkORCL杀掉,再用/sbin/fuser –u lkORCL检查一遍。操作这两个命令前,最好把数据库先关了。
(13)接下来再重启数据库
一切ok。说明此时数据库正常启动了。
(14)用quit;退出SQL,重新打开监听,lsnrctl start,如果显示打开,停用lsnrctl stop ,再打开,查看状态lsnrctl status;重新检查1521端口,数据库状态。
到这一步,oracle数据库已经恢复正常。
(15)最后重新启动tomcat,发现系统还是不行,用PLSQL连接显示无监听。这时再回到数据库服务器,关闭监听,在oracle安装目录找到监听配置文件
打开vi :
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY =EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST =localhost.localdomain)(PORT = 1521))
)
)
ADR_BASE_LISTENER= /u01/app/oracle
按i编辑,把localhost.localdomain改为10.10.8.16
保存退出 :wq
然后重启监听。
(16)最后一次重启系统显示正常,plsql连接数据库正常,至此,整个过程到此结束。
最后的最后开启防火墙,给档案系统添加1521和8080端口
#/sbin/iptables-A INPUT -p tcp -m state --state ESTABLISHED -m tcp --dport 8080 -j ACCEPT
#/sbin/iptables-A INPUT -p tcp -m state --state ESTABLISHED -m tcp --dport 1521 -j ACCEPT
保存更改
#/etc/init.d/iptables save