神奇的Oracle坏快修复,细节拉满,快来看看...

598 阅读4分钟
作者:IT邦德,Oracle、PostgreSQL ACE
中国DBA联盟(ACDU)成员,10余年DBA工作经验
擅长主流数据Oracle、MySQL、PG、openGauss运维
备份恢复,安装迁移,性能优化、故障应急处理等
•••

@TOC

前言

数据库中的坏块影响了备份,确实很棘手,本文针对这个故障的处理做了详细的说明

1.故障现象

某工厂的核心生产系统,使用的是第三方的备份软件,近期备份一直失败,造成归档无法删除,归档磁盘空间岌岌可危,从备份软件的日志来看,抛出了如下的报错

ORA-19566: exceeded limit of 0 corrupt blocks for file
+INDEX/ods_hist_idx_tbs_07.dbf,rman 无法正常备份

2.排除过程

ORA-19566报错来看,基本定位为坏快造成的,确认当前使用的数据库为Oracle 11.2.0.4.0 RAC,通过以下查询确认坏快信息

可见 260 号数据文件 2023911 块损坏,
这个块是一个 free 块,即没有被其他对象使用。
这种空白坏块的处理方法就是重新格式,
只有重新格式化才可以被重新访问。

首先我们进行逻辑验证,确保数据文件的完整性
RMAN> backup validate check logical datafile 260;

3.处理方法

处理思路,创建一个临时测试表,将表的 extents 扩展到该块,然后插 入数据,用插入的数据格式化该块,之后删除该表

3.1 创建临时测试表

create table test.s (
n number,
c varchar2(4000)
) nologging tablespace HIST_IDX_TBS pctfree 99;

注意这里的表空间就是通过datafile查询出来的

确认创建成功:
select segment_name,tablespace_name 
from dba_segments 
where segment_name='S' ;

3.2 创建触发器

CREATE OR REPLACE TRIGGER test.corrupt_trigger
AFTER INSERT ON test.s
REFERENCING OLD AS p_old NEW AS new_p
FOR EACH ROW
DECLARE
corrupt EXCEPTION;
BEGIN
IF (dbms_rowid.rowid_block_number(:new_p.rowid)=2023911)
and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=260) THEN
RAISE corrupt;
END IF;
EXCEPTION
WHEN corrupt THEN
RAISE_APPLICATION_ERROR(-20000, 'Corrupt block has been formatted');
END;
/

3.3 给表分配 extents

BEGIN
for i in 1..1000000 loop
EXECUTE IMMEDIATE 
'alter table test.s allocate 
extent (DATAFILE '||'''+INDEX/ods_hist_idx_tbs_07.dbf''' 
||'SIZE 64K) ';
end loop;
end ;
/

该步骤是在有 free 坏块的数据文件上分配 extents,
直至分配报错为止,也就是空间满为止。
并确保损坏的块被该表的 extents 覆盖掉:

3.4 向该表插入数据

BEGIN
FOR i IN 1..1000000000 LOOP
INSERT /*+ APPEND */ INTO test.s select i, 
lpad('REFORMAT',3092, 'R') from dual;
commit ;
END LOOP;
END;
该步骤直至插入存储过程抛出异常,如下图

至此说明坏块已经被数据覆盖

4.后续处理

重新验证该数据文件或数据库:
RMAN> validate datafile 260 block 2023911;

重新验证该数据块后,已经查询不到坏块了,
说明该块已经被重新格式化了
清理创建的表和触发器

最后验证rman备份,备份成功

5.CommVault备份软件

无论数据位于何处,通过Commvault备份和恢复的单一操作界面,确保数据的可用性。从此告别成本高昂的数据丢失情况,散落各处的数据孤岛,无法实现的恢复 SLAs 和捉襟见肘的扩展能力。让团队如虎添翼。

1.备份管理服务器(CS):
CommServe服务器是整个备份域的核心,
所有的配置和设置,是在该服务器完成的。
本次测试,使用一台物理机作为备份管理服务器。
2.介质管理服务器(MA):
用来对本地的存储资源进行管理,完成数据的复制、备份功能。
本次测试,该服务器与备份管理服务器为同一台主机,
所有模块合并部署
3.备份客户端(iDA)
客户端是指本次用于测试的Linux、平台上的数据库、
文件,在数据库服务器上安装文件备份模块和数据库备份模块,
非数据库服务器安装文件备份模块,实现对OS、文件目录和数据库进行备份和恢复。

6.总结

保护和恢复数据的能力对于确保业务连续性和减少潜在风险至关重要,尤其生产核心系统的数据库,一定要确保数据备份的正常,也要做一些恢复演练,来确保备份的有效性