一、出现的问题
2024年09月11日,早上8:30数据库异常,有用户报告核心数据库异常,不能审批、存储数据,但部分业务能够进行查询和登录。
在oracle数据库上报数据块损坏(文件号11,块号1980768),(文件号29,块号49143)。问题紧急。初步判断是前段时间机房停电导致的大面积服务器、存储停机导致坏块。庆幸的是数据库能够启动,并且做过虚拟机备份,归档也在!但是,通过oracle dataguard进行的备份因为停电没有启动,数据库恢复是有希望的,可能会丢数据。(最后是一个数据没有丢。)
二、解决办法
首先,尝试通过主库进行坏块恢复。通过下面命令查询发现有200多个坏块。
select * from v$database_block_corruption
并尝试通过文件ID和块ID进行数据的恢复。
select * from dba_extents where file_id = &AFN and &BL between block_id AND block_id + blocks - 1;
blockrecover datafile 14 block 56,107,276,517;
没有成功!
然后,梳理思路看能否通过备份的虚拟机,进行恢复后,再配合开发人员从前台将核心表拷贝出来,尽量减小数据丢失。因为是核心数据库,所以共享业务相对也比较多,如果失败丢失数据也不少,建议是备用方案。
最后,想到通过data guard做过同步。数据库没停,是否能够通过灾备数据库进行恢复呢?如果恢复成功应该不会丢失任何数据。
1)通过命令检查主库datafile文件的完整性,时间比较长(如果太长可以不做直接恢复):
rman target /
backup validata datafile 11;
2)通过命令查看主库日志:(确认有大量坏块)
tail -20f /oracle/newlog/diag/rdbms/ncserver/nc/trace/alert_nc.log
3)在灾备数据库上操作
查看当前灾备库状态mount:
select name,SWITCHOVER_STATUS,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
4)先强制手动切换:(当前灾备数据库不在线,丢文件无法归档文件丢失无法切换启动)
alter database recover managed standby database finish force;
发现丢归档文件175741,
(在灾备环境恢复过程中发现,有大量归档文件丢失,一个是因为系统运行不稳定,再一个的确没有生成,没有传递到灾备环境,不要慌,可以通过主库生成归档文件。)
5)取消灾备状态,并进行恢复数据操作:
alter database recover managed standby database cancel;
alter database recover managed standby database disconnect from session;
同时,确认数据库日志报错信息如下:(日志文件路径:/oracle/diag/archive/)
tail -20f alert_nc.log
确认丢失:175741的归档日志文件。文件名如:1_175741_946051481.dbf
文件路径:/oracle/archive/
6)在主库恢复归档日志文件,然后拷贝到灾备库的文件路径下,重复上面的第5步,直到恢复完成。
6.1先登录主库生成归档日志文件:
alter system switch logfile;
rman target /
restore archivelog all; 还原全部归档日志文件
restore archivelog from logseq 27 ; 还原log sequence为27之后的所有归档日志
restore archivelog from logseq 27 until logseq 29; 还原log sequence为27到29这几个归档日志
restore archivelog from time 'sysdate-7'; 还原七天以内的归档日志
restore archivelog until logseq 29; 还原到seqence 为29的日志文件为止
set archivelog destination to '/u01/database/sybo5/arch';设定还原日志文件到新路径,如
run{
set archivelog destination to '/u01/database/sybo5/arch';
restore archivelog low logseq 27;}
6.2将归档文件拷贝到灾备数据库的制定目录,然后,再通过rman将归档文件加入到灾备数据库,继续恢复。最终恢复成功。
cd /orabak/archive/
三、数据库优化
主要是会话数优化、进程数优化、pga、sga优化等等。
感谢梁,希望能够帮到兄弟姐妹们。
oracle数据库备份恢复常用命令: