Oracle 数据块损坏与恢复详解

1.什么是块损坏:

所谓损坏的数据块,是指块没有采用可识别的 Oracle 格式,或者其内容在内部不一致。通常情况下,损坏是由硬件故障或操作系统问题引起的。Oracle 数据库将损坏的块标识为“逻辑损坏”或“介质损坏”。如果是逻辑损坏,则是 Oracle 内部错误。Oracle 数据库检测到不一致之后,就将逻辑损坏的块标记为损坏。如果是介质损坏,则是块格式不正确;从磁盘读取的块不包含有意义的信息。

通过恢复块,或者删除包含损坏块的数据库对象(或同时采用这两种方式),可以修复介质损坏的块。如果介质损坏是由硬件故障引起的,则只有修复了硬件故障后,才能彻底解决问题。

只要对块执行读或写操作,就会执行下列一致性检查:

--块版本

--高速缓存中的 DBA(数据块地址)值与块缓冲区中的 DBA 值比较的结果

--块校验和(如果启用)

损坏的块被标识为以下类别:

--介质损坏

--逻辑(或软件)损坏

2.块损坏故障现象:ORA-01578

ORA-01578 错误:“ORACLE data block corrupted (file # %s, block # %s)”:

--发现损坏的数据块时生成此信息

--始终返回相对文件号和块号

--返回到发出查询的会话(该查询在发现损坏时执行)

--显示在 alert.log 文件中

一般情况下,ORA-01578 错误是由硬件问题引起的。如果 ORA-01578 错误始终返回相同的参数,则最可能的原因是块介质损坏。

如果返回的参数每次都有变化,则可能存在硬件问题。应检查内存和页面空间,并检查 I/O 子系统,以便查找有问题的控制器。

注:ORA-01578 会返回相对文件号,但随之出现的 ORA-01110 错误会显示绝对文件号。

3.如何处理损坏

--检查预警日志和操作系统日志文件。

--使用可用的诊断工具,找出损坏的类型。

--多次运行检查功能,确定错误是否持续存在。

--根据需要,从损坏的对象中恢复数据。

--解决硬件问题:

内存条、

磁盘控制器、

磁盘

--根据需要,从损坏的对象中恢复或还原数据。

始终尝试确定错误是否持续出现。多次运行 ANALYZE 命令;如果可能,可执行关闭再启动操作,然后再次尝试早先发生故障的操作。查找是否有其它损坏。如果发现一个损坏的块,则可能还存在其它损坏的块。

硬件故障必须立即解决。遇到硬件问题时,应与供应商取得联系,在检查并修复了计算机后再继续工作。此时应运行一次全面的硬件诊断会话。

硬件故障的类型可能会有很多种:

--I/O 硬件或固件故障

--操作系统

--I/O 或高速缓存问题

--内存或分页问题

--磁盘修复实用程序

4.实时验证块完整性:DB_BLOCK_CHECKING :

可通过将 DB_BLOCK_CHECKING 初始化参数设置为 TRUE 启用数据库块检查。只要修改了数据块或索引块,此项检查就会检查数据块和索引块的内部一致性。DB_BLOCK_CHECKING 是一个动态参数,可使用 ALTER SYSTEM SET 语句修改此参数。对于系统表空间,将始终启用块检查。块检查通常会产生 1% 到 10% 的开销,具体取决于工作量。正在执行的更新或插入操作越多,执行块检查的开销就会越高。DB_BLOCK_CHECKING 有以下四个可能的值:

--OFF:除 SYSTEM 之外的所有表空间都不执行块检查。

--LOW:在内存中块的内容发生更改之后(例如,在执行 UPDATE 或 INSERT 语句以及在执行磁盘上读取后),执行基本的块头检查。

--MEDIUM:执行所有 LOW 检查, 对所有不是按索引组织的表块执行语义块检查。

--FULL:执行所有 LOW 和 MEDIUM 检查, 对索引块执行语义检查。

初始化参数 DB_BLOCK_CHECKING:

--在对每个块执行自我一致性检查时,控制检查的处理程度

--可防止内存和数据损坏

--可使用 ALTER SESSION 命令或 ALTER SYSTEM DEFERRED 命令进行设置

5.块介质恢复

大多数情况下,第一次遇到损坏时,数据库会将块标记为介质损坏,然后将其写到磁盘上。在该块得到恢复之前,不能对其执行任何后续读取操作。只能对标记为损坏或者未通过损坏检查的块执行块恢复。可使用 RMAN RECOVER...BLOCK 命令执行块介质恢复。默认情况下,RMAN 会在闪回日志中搜索好的块副本,然后在完全备份或 0 级增量备份中搜索块。如果 RMAN 找到了好的副本,则会还原这些副本,并对块执行介质恢复。块介质恢复只能将重做日志用于介质恢复,不能使用增量备份。

V$DATABASE_BLOCK_CORRUPTION 视图显示由数据库组件(如 RMAN 命令、ANALYZE、dbv、SQL 查询等)标记为损坏的块。对于以下类型的损坏此视图会增加相应的行:

--物理/介质损坏:数据库无法识别块:校验和无效、块内容全部为零或者块头不完整。默认情况下,物理损坏检查处于启用状态。

--逻辑损坏:块的校验和有效,块头和块尾也匹配,但是内容不一致。块介质恢复不能修复逻辑块损坏。默认情况下,逻辑损坏检查处于禁用状态。通过指定 BACKUP、RESTORE、RECOVER 和 VALIDATE 命令的 CHECK LOGICAL 选项,可以启用逻辑损坏检查。

块介质恢复:

--降低平均恢复时间 (MTTR)

--提高介质恢复期间的可用性

--恢复期间数据文件保持联机状态

--只有正在恢复的块是不可访问的

--使用 RMAN RECOVER...BLOCK 命令调用

--使用闪回日志以及完全备份或 0 级备份还原块

--使用重做日志执行介质恢复

--V$DATABASE_BLOCK_CORRUPTION 视图显示标记为损坏的块

6.块介质恢复的先决条件

--目标数据库必须处于 ARCHIVELOG 模式

--包含损坏块的数据文件的备份必须是完全备份或 0 级备份。

--要使用代理副本,必须先将它们还原到非默认位置

--RMAN 只能使用归档的重做日志进行恢复

--要使用闪回日志,必须启用闪回数据库

以下先决条件适用于 RECOVER ... BLOCK 命令:

--目标数据库必须以 ARCHIVELOG 模式运行,并且必须是打开的,或是使用当前控制文件装载的。

--包含损坏块的数据文件备份必须是完全备份或 0 级备份,不能是代理副本。如果只存在代理副本备份,则可将它们还原到磁盘上的非默认位置;在这种情况下,RMAN 会认为它们是数据文件副本,在块介质恢复过程中会在其中搜索块。

--RMAN 只能使用归档的重做日志进行恢复。RMAN 不能使用 1 级增量备份。块介质恢复不能恢复丢失或无法访问的归档重做日志,但有时可以恢复丢失的重做记录。

--必须在目标数据库上启用闪回数据库,这样 RMAN 才能在闪回日志中搜索损坏块的好副本。如果启用了闪回事件记录,并且此事件记录包含损坏块的较旧但未损坏的版本,则 RMAN 可以使用这些块,因而可能会提高恢复的速度。

7.RECOVER...BLOCK 命令

--确定包含要进行恢复的块的备份

--读取备份并将请求的块累积到内存缓冲区

--必要时,通过从备份中读取归档日志来管理块介质恢复会话

RECOVER DATAFILE 6 BLOCK 3;  Recover a single block

RECOVER                   Recover multiple blocks

DATAFILE 2 BLOCK 43   in multiple data files

DATAFILE 2 BLOCK 79

DATAFILE 6 BLOCK 183;

RECOVER CORRUPTION LIST;         Recover all blocks logged in                     V$DATABASE_BLOCK_CORRUPTION

恢复单个块:

在进行块恢复之前,必须确定损坏的块。一般情况下,会在以下位置中报告块损坏:

--LIST FAILURE、VALIDATE 或 BACKUP ...VALIDATE 命令的结果

--V$DATABASE_BLOCK_CORRUPTION 视图

--标准输出中的错误消息

--预警日志文件和用户跟踪文件(在 V$DIAG_INFO 视图中标识)

--SQL ANALYZE TABLE 和 ANALYZE INDEX 命令的结果

--DBVERIFY 实用程序的结果

例如,可能会在用户跟踪文件中发现以下消息:

ORA-01578: ORACLE data block corrupted (file # 7, block # 3)

ORA-01110: data file 7: ‘/oracle/oradata/orcl/tools01.dbf‘

ORA-01578: ORACLE data block corrupted (file # 2, block # 235)

ORA-01110: data file 2: ‘/oracle/oradata/orcl/undotbs01.dbf‘

--确定了块以后,在 RMAN 提示符下运行 RECOVER ...BLOCK 命令,指定损坏块的文件号和块编号。

RECOVER

DATAFILE 7 BLOCK 3

DATAFILE 2 BLOCK 235;

时间: 2024-10-02 19:00:07

Oracle 数据块损坏与恢复详解的相关文章

Oracle数据块损坏的恢复实例

测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test conn jingyu/jingyu drop table t_test purge; create table t_test (id number, name char(2000)); --Insert data insert into t_test values(1, 'alfred 1');

Oracle 数据块损坏与恢复具体解释

1.什么是块损坏: 所谓损坏的数据块,是指块没有採用可识别的 Oracle 格式,或者其内容在内部不一致. 通常情况下,损坏是由硬件故障或操作系统问题引起的.Oracle 数据库将损坏的块标识为"逻辑损坏"或"介质损坏". 假设是逻辑损坏,则是 Oracle 内部错误. Oracle 数据库检測到不一致之后,就将逻辑损坏的块标记为损坏.假设是介质损坏,则是块格式不对:从磁盘读取的块不包括有意义的信息. 通过恢复块,或者删除包括损坏块的数据库对象(或同一时候採用这两种

oracle ora-01578 ORACLE 数据块损坏 (文件号 4, 块号 840339)

ORA-01578是 数据块物理坏块/损坏的一种,不同于逻辑损坏/坏块,一般 会伴随ORA-1110出现,一旦ORACLE读取到存在损坏的块就会报出Caused by: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 840339)ORA-01110: 数据文件 4: 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' 解决方法如下:1.使用DBV检查数据文件,在cmd目录下直接输入d

Oracle数据块损坏篇之10231内部事件

实验:某个分区数据块损坏,不完全恢复此分区表数据背景:数据库没有有效备份,某个分区中有数据块损坏.要求:最大限度恢复此分区数据.环境:RHEL 6.4 + Oracle 11.2.0.4 1. 初始化实验环境 2. 模拟分区中有数据块损坏情景 3. 尝试使用Oracle内部事件10231进行不完全恢复 Reference 1. 初始化实验环境 初始化创建模拟实验环境用到的表空间.业务用户.表,并导入测试数据.本次实验用到表空间DBS_D_JINGYU, 业务用户JINGYU, 分区表T_PART

ORA-01578: ORACLE 数据块损坏 (文件号 13, 块号 2415081) ORA-01110: 数据文件XXXXXX

1.使用DBV检查数据文件,在cmd执行:dbv file='E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' blocksize=8192:然后等待检测结果2.检查损坏相关的表: Select owner, segment_name, segment_type from dba_extents where file_id = 13 and 2415081 between block_id and block_id + blocks - 1; 查到相关

检测ORACLE数据块损坏的方法汇总

1:使用初始化参数 使用初始化参数db_block_checksum\db_block_checking可以设置数据库对块的物理一致性和逻辑一致性检查. Db_block_checksum:物理一致性检查,默认开启.始终对system表空间数据进行检查,如果开启还会对日志进行检查,开启后会有1-2%的性能影响,建议开启. Db_block_checking:逻辑一致性检查,默认未开启.始终对system表空间进行检查,如果开启会有1-10%的性能影响.DML越频繁,性能影响越大.不建议开启. 有

oracle 数据块介绍 1

ORACLE DATA BLOCK oracle data block是数据库管理数据文件的最小单元. 在物理层面,oracle data file保存在操作系统上,最小i/o单元是操作系统块,oracle data block是oracle db逻辑最小i/o单元,其结构和系统块不同,大小是系统块的整数倍,如图: DATA BLOCK SIZE oracle db都会配置db_block_size参数,在建库时确定oracle db的默认data block size的大小.建库后数据库默认数

Oracle中用exp/imp命令参数详解【转】

Oracle中用exp/imp命令参数详解 [用 exp 数 据 导 出]:1  将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中   exp system/[email protected]   rows=y  indexes=y compress=n buffer=65536   feedback=100000full=y  file=d:\daochu.dmp  log=d:\daochulog.txt   owner=(ECC_BIZ,

Oracle 建表常用数据类型的详解

创建表时,必须为表的各个列指定数据类型.如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存.如为学生指定出生日期为"1980-13-31". 在Oracle中,常见的数据类型有: 字符串:字符串分为定长类型char和变长类型varchar2. 数字:整数 number(整数位),小数 number(总长度,小数位),只写number,表示无限制. 日期:date类型,可以保存年月日时分秒. 问题:Oracle中为什么字符串类型为varchar2,它与varchar有什么关系?