记录一次oracle 11G R2数据库文件坏块后的修复过程

一、出现的问题

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数据库备份恢复常用命令:

RMAN Commands

主要功能点: 不需要运行Oracle数据库软件,ODU直接读取数据库文件解析数据。 支持ASM,能够直接从ASM磁盘中导出数据,即使相关的磁盘组不能成功mount 支持从ASM中直接抽取出数据文件和其他任意存储在ASM中的文件(包括控制文件、日志文件和归档日志等),即使相关的磁盘组不能成功mount 支持的Oracle数据库版本包括7,8i,9i,10g,11g 支持多种平台的数据库,包括AIX、LINUX、HPUX、SOLARIS、WINDOWS等。能够在一个平台上导出其他平台的数据,比如在Windows 32位系统上,使用AIX系统上的数据文件导出数据。 支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 全面支持LOB字段: 支持CLOB、NCLOB和BLOB CLOB支持Big Endian和Little Endian字节序 支持LOB分区,子分区 支持同一个表中,不同LOB列使用不同CHUNK SIZE的情况 CLOB数据可以导出到与其他列相同的文件中,或存储到单独的文件 LOB列在没有SYSTEM表空间的情况下仍然能够导出 LOB列在相关的lob index损坏的情况下依然能够导出 支持各种表,包括普通的HEAP表,IOT表和聚簇(CLUSTER)表 支持IOT表: 支持普通IOT表的导出 支持压缩IOT表的导出 支持IOT表溢出段 支持IOT表分区(包括子分区) 只能在有SYSTEM表空间时才能导出IOT表 支持压缩表 支持表被truncate后的数据恢复 支持表被drop后的数据恢复 在有SYSTEM表空间的情况下,自动获取数据字典信息 支持在没有SYSTEM表空间和数据字典损坏的情况下恢复数据,在没有数据字典可用时,ODU能够自动判断数据的类型 支持10g及以上的大文件(BigFile)表空间 全面支持64位系统,支持超过4G大小的数据文件。 支持复制操作系统命令不能复制的坏文件 支持同一个库中不同块大小的数据文件。 支持多种字符集之间的转换,能够正确的转换CLOB、NCLOB、NVARCHAR2列类型的数据到指定的字符集。 自动检测数据文件的表空间号和文件号 导出的数据格式包括纯文本和DMP文件两种。以纯文本导出时,能够自动生成建表的SQL语句和SQL*Loader导入所需的control文件 模拟Oracle的dump块功能,能够dump数据文件中的数据块 支持DESC表,以显示表的列定义 支持列出表的分区和子分区
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值