问题现象:
同事反馈客户机房断电,来电后,启动数据库服务器,发现数据无法启动。
登录应用系统,输入用户名和密码登录后报错。
解决过程:
猜 测 : 服务器启动后, 数据库或监听没有 自动 启动 。
远程 登录数据库服务器,切换到oracle 用户,发现没有 sqlplus 命令 ???
猜测: 没配置环境变量,还是 数据库用户不是oracle?
查看用户只有oracle 用户
[root@zjltdb home]# ls
oracle
无法找到数据库警告日志
[root@zjltdb home]# find / -name alert_*
空
查看数据库环境变量
发现Oracle 家目录没有文件
和客户沟通,数据库服务器数据存储在磁盘柜,停电时,数据库服务器和磁盘柜均异常断电;
猜测:来电启动时,磁盘柜启动速度慢于数据库服务器启动速度,导致数据库服务器启动时无法成功挂载磁盘,导致目录丢失?
查看自动挂载情况
[oracle@zjltdb oracle]$ mount
/dev/sda 2 on / oracle type ext4 (rw)
卸载/oracle ,重新手动挂载
[oracle@zjltdb oracle]$ u mount /dev/sda2
[oracle@zjltdb oracle]$ mount /dev/sda2 /oracle
/oracle 仍然没有文件
让客户重启数据库服务器,启动之后发现/oracle 目录仍然没有文件
结论:/oracle 目录下文件并不是没有挂载,而是真 没了
查看三大核心文件( 控制文件,日志文件,数据文件 ) 还在,是否有丢失个别文件还不确定。
[root@zjltdb home]# find / -name *.ctl
/oradata/ncdb/control01.ctl
/oradata/ncdb/control02.ctl
/oradata/ncdb/control03.ctl
[root@zjltdb home]# find / -name redo*
/oradata/ncdb/redo01.log
/oradata/ncdb/redo02.log
/oradata/ncdb/redo03.log
[root@zjltdb home]# find / -name *.dbf
/oradata/ncdb/nnc_data01.dbf
/oradata/ncdb/nnc_index01.dbf
/oradata/ncdb/system01.dbf
/oradata/ncdb/undotbs01.dbf
查看参数文件,监听文件等已经丢失
[root@zjltdb home]# find / -name init*
空
root@zjltdb home]# find / -name listener*
空
丢失的文件有:参数文件,监听文件,TNS 文件, Oracle 安装目录 ( 包括 Oracle 命令等 )
客户 反馈 数据库没有启动归档,没有RMAN 备份, 没有 expdp 逻辑备份 。 总之一句话,没有任何有效的备份。
解决方案:
在服务器本地 重新生成Oracle 软件 或直接将数据文件迁移到其他服务器上,客户希望能直接在服务器本地进行恢复。
客户没有安装介质, 也 不知道oracle 10g 具体哪个 版本,但客户反馈正式数据库和 测试 数据库是 一起搭建的,推测两个数据库版本相同,可以复制 测试 服务器 上 Oracle_home 目录到正式数据库服务器上。
一: 将测试库上的oracle 软件拷贝到正式服务器上
[root@zjltdb ~]# scp -r 192. 100 . 100 . xxx :/oracle/* /oracle
[root@zjltdb ~]# cd /oracle
[root@zjltdb oracle]# ls
orainventory
admin
product
由于两个数据库的SID 和目录名不同,需要更改相应的目录名和实例名
二:禁用spfile 参数文件
[ oracle@zjltdb dbs] $ mv spfileerpdb.ora spfileerpdb.ora.bak
三:重命名pfile 参数文件
[ oracle@zjltdb dbs] $ mv initerpdb.ora initncdb.ora
四:修改参数文件
[ oracle@zjltdb dbs] $ vim initncdb.ora
五:修改监听文件
[ oracle@zjltdb admin] $ vim listener.ora
六:启动数据库
分析启动报错原因: 参数文件记录的数据库版本和控制文件记录的数据库版本不一致,原库版本是10.2.0.3.0 ,但是拷贝过来的数据库软件属于 10.2.0.4.0 , 没有时间再去找 10.2.0.3.0 的安装包了,只能继续恢复了。
解决方案: 修改参数compatible 版本为 10.2.4.0
[ oracle@zjltdb dbs] $ vim initncdb.ora
七:再次启动数据库
可以成功挂载数据库,但是无法open 数据库,原因还是因为数据库版本不匹配 。
查看警告日志
[oracle@zjltdb trace ]$ vim alert_ncdb.log
数据库必须以UPGRADE 方式启动
八:以UPGRADE 方式启动数据库
此时数据库状态为OPEN MIGRATE
数据库OPEN MIGRATE 状态下无法连接 生产 用户,只允许sysdba 用户连接 。
猜测: 必须 将数据库升级到10.2.0.4.0 后应该可以启动数据库
九:执行数据库升级脚本( 重新创建数据字典和视图 )
升级之前备份所有的数据文件,控制文件,日志文件到本地
SQL > @/oracle/product/10.2/rdbms/admin/catu p grd.sql
过程比较漫长,大概1 小时
十 再次启动数据库,可以正常open
十一 :启动监听后,进入NC 系统,发现 NC 数据一切正常
十二:让客户尽快做备份
1 expdp 对所有用户做逻辑备份
2 备份 /oracle 目录到本地
第二天早上,用户发来消息,NC 再次出现无法登录,登录到 /oracle 目录又变空了,并且用户昨天晚上并没有来得及做任何备份,他说太晚了,想早上在做备份。用户希望可以再做一次恢复。
猜测问题可能原因:
1 人员恶意删除
2 /oracle 所在磁盘出现问题
解决方案:
1 重复昨天的恢复操作
2 修改 oracle 环境变量,将 oracle_home 指向其他磁盘
3 全库备份,备份文件拷贝到其他服务器上
4 启动数据库,启动监停, 客户 登录 系统 ,查看 系统 数据,一切正常
建议用户 联系 服务器硬件厂商尽快检查磁盘健康情况;
欢迎关注我的公众号:IT小Chen