本章阐述如何还原和恢复数据文件中个别的数据块。
1.块介质恢复概述
块介质恢复通过恢复损坏的数据块提供更短的平均恢复时间(MTTR)。
1.1.块介质恢复的目的
使用块介质恢复来恢复数据文件中一个或多个损坏的数据块。
块介质恢复相比数据文件介质恢复提供以下优势:
1)降低平均恢复时间因为只有需要恢复的数据块被还原和恢复
2)在恢复过程中让受影响的数据文件保持联机
没有块介质恢复的话,即使一个块损坏,也必须将数据文件脱机和还原数据文件的备份,在备份还原后,必须应用所有为数据文件产生的redo。整个文件不可用直到介质恢复完成。使用块介质恢复,则只有实际被恢复的块在恢复过程中不可用。
块介质恢复对于涉及少的已知数量的块的物理损坏问题是最有用的。块级别的数据丢失通常是由于间歇的随机的不会导致大范围的数据丢失的I/O错误和写到磁盘的内存损坏造成。块介质恢复不能用于数据丢失的范围或损坏是未知的和整个数据文件需要恢复的情况。在这些情况中,数据文件介质恢复是最佳解决方案。
1.2.块介质恢复的基本概念
通常,当第一次遭遇损坏时,数据库作为介质损坏标记块和将它写到磁盘。接下来对块的读取都是不成功的直到块被恢复为止。可以只对标记为损坏或损坏检查失败的块执行介质恢复。
典型地,块损坏报告在以下位置:
1)命令LIST FAILURE,VALIDATE或BACKUP … VALIDATE的结果
2)视图V$DATABASE_BLOCK_CORRUPTION
3)标准输出中的错误信息
4)alert日志
5)用户跟踪文件
6)SQL命令ANALYZE TABLE和ANALYZE INDEX的结果
7)DBVERIFY工具的结果
8)第三方介质管理输出
例如,你可能在用户跟踪文件中发现以下信息:
ORA-01578: ORACLE data block corrupted (file # 7, block # 3)
ORA-01110: data file 7: '/oracle/oradata/trgt/tools01.dbf'
ORA-01578: ORACLE data block corrupted (file # 2, block # 235)
ORA-01110: data file 2: '/oracle/oradata/trgt/undotbs01.dbf
1.2.1.关于介质恢复和备数据库
块介质恢复的行为取决于数据块损坏是在主数据库还是物理备数据库上被发现。
如果损坏发生的数据库是与一个实时查询的物理备数据库相关联,那么数据库自动尝试执行块介质恢复。主数据库在备数据库上搜索块的好的副本,如果找到的话,修复块而对遭遇损坏块的查询没有影响。只有如果数据库不能修复损坏时,才会显示Oracle数据库物理块损坏消息(ORA-1578)。
不管何时块损坏被自动检测到,可以使用RECOVER … BLOCK命令手动执行块介质恢复。缺省情况下,RMAN首先搜索实时查询物理备数据库中的好块,然后是闪回日志,最后是在完全或级别0的增量备份中的块。
注:为了让介质恢复自动运行,物理备数据库必须运行在实时查询模式中。需要购买Oracle Active Data Guard授权。
如果损坏的数据块是在实时查询物理备数据库上被发现,数据库尝试从主数据库上获取块的副本来修复损坏。修复在后台执行,如果修复是成功的会让接下来的查询成功。如果在备数据库上配置了以下数据库初始化参数,那么数据库会自动尝试块修复:
1)配置LOG_ARCHIVE_CONFIG参数为DG_CONFIG列表和使用DB_UNIQUE_NAME属性配置一个LOG_ARCHIVE_DEST_n参数为主数据库
或
2)配置了FAL_SERVER参数,它的值包含主数据库的Oracle网络服务名称
注:如果在验证过程中检测到的损坏块,比如RMAN的VALIDATE命令,那么恢复不会自动发起。
1.2.2.关于鉴别损坏块
视图V$DATABASE_BLOCK_CORRUPTION显示被数据库组件比如RMAN,ANALYZE和SQL查询标记为损坏的块。
以下损坏类型导致增加行到这个视图:
1)物理损坏(有时称为介质损坏)
数据库不能识别块:校验和是无效的,块包含的全是0或块头是损坏的。
缺省情况下物理损坏检查是启用的。可以通过指定BACKUP命令的NOCHECKSUM选项关闭校验和检查,但其它物理一致性检查,比如块头和块脚检查不能被禁用。
2)逻辑损坏
块有有效的校验和,头和尾都匹配,等等,但内容是逻辑不一致的。块介质恢复可能不能修复所有的逻辑块损坏。在这些情况中,候补的修复方法,比如表空间时间点恢复,或删除和重建受影响的对象可以修复这个损坏。
缺省情况下逻辑损坏块检查是禁用的。可以通过指定命令BACKUP,RESTORE,RECOVER和VALIDATE的CHECK LOGICAL选项来打开它。
数据库可以通过验证块和段之间的关系来检测某些损坏,但不能通过检查个别的块来检测到它们。视图V$DATABASE_BLOCK_CORRUPTION不会记录这个粒度级别的损坏。
1.2.3.关于块介质恢复过程中缺失Redo
块介质恢复只需要要恢复的块的一组完整的redo更改。这个与需要从恢复开始到结束的一序列完整的redo更改的数据文件恢复不同。
像数据文件介质恢复一样,块介质恢复一般不能通过缺失或不可访问的归档日志,虽然当查找归档redo日志文件的可用副本时会尝试还原切换(restore failover)。因此,块介质恢复不能通过会导致校验和失败的物理redo损坏。然而,块介质恢复可以通过redo流中的缺口如果缺失或损坏的redo记录不会影响要恢复的块。
注:在块介质恢复的过程中每个块是独立恢复的,所以恢复块的子集可能会成功。
当RMAN在块介质恢复过程中首次检测到缺失或损坏的redo记录时,它不会立即报错,因为在经历恢复的块可能迟些会在redo流中重建。当块被重建时,块之前的所有redo会变成不相关的,因为这些redo应用到块的旧转生。例如,当用户删除或清空表,然后使用块来存储其它数据时,数据库创建一个新块。
假设介质恢复在块13上执行。
在块恢复开始之后,RMAN发现更改120在redo流中缺失,因为日志块损坏或是日志不能被找到。RMAN继续恢复如果块13后来在redo流中重建。假设在更改140中用户删除存储在块13中的表employees,分配一个新表在这个块中,插入数据到这个新表。在这个点,数据库格式化块13作为一个新块。现在可以继续这个块的恢复即使某些在重建操作之前的redo缺失。
2.块介质恢复的前提条件
通过使用RECOVER … BLOCK命令执行块介质恢复之前必须满足某些前提条件。
前提条件包括以下:
1)目标数据库必须运行在ARCHIVELOG模式,使用当前的控制文件打开或挂载。
2)如果目标数据库是备数据库,那么它必须在一致的状态,恢复不能在会话中,备份必须比损坏的文件更旧。
3)包含损坏的块的数据文件的备份必须是完全或级别0的备份。它们不可以是代理副本或增量备份。
如果只有代理副本备份存在,那么可以还原它们到非缺省的磁盘位置,在这种情况中,RMAN将它们视为数据文件副本,在块介质恢复过程中搜索它们来寻找块。
4)RMAN只能使用归档redo日志来恢复。
RMAN不能使用级别1的增量备份。块介质恢复不能通过缺失或不可访问的归档redo日志,虽然它某些时候能通过缺失的redo记录。
5)为了让RMAN搜索闪回日志寻找损坏块的好副本,闪回数据库必须在目标数据库上启用。
如果闪回日志已启用,包含损坏块的旧的未损坏的版本,那么RMAN可以使用这些块,可能加快恢复的速度。
6)目标数据库必须与实时查询的物理备数据库相关联让RMAN搜索数据库寻找损坏块的好副本。
3.恢复个别块
使用RECOVER … BLOCK命令恢复数据文件中的个别损坏块。
3.1.使用RECOVER … BLOCK命令恢复个别块
鉴别需要恢复的块,然后使用任何可用的备份来还原和恢复这些块。
恢复特定的数据块:
1) 获取数据文件序号和损坏块的块号。
最简单的定位跟踪文件和alert日志的方式是连接SQL*Plus到目标数据库,执行以下查询:
SELECT NAME, VALUE FROM V$DIAG_INFO;
2)启动RMAN,连接到目标数据库,它必须是挂载或打开的。
3)运行SHOW ALL命令来确认预配置了合适的通道。
4)在RMANr提示符下运行RECOVER … BLOCK命令,指定文件和损坏块的块号。
以下示例恢复2个块。
RECOVER
DATAFILE 8 BLOCK 13
DATAFILE 2 BLOCK 19;
也可以指定各种选项来控制RMAN的行为。以下示例指示只使用标签为mondayam的备份来搜索块。可以使用FROM BACKUPSET选项来限制RMAN搜索的备份的类型,或EXCLUDE FLASHBACK LOG选项限制RMAN搜索闪回日志。
RECOVER
DATAFILE 8 BLOCK 13
DATAFILE 2 BLOCK 199
FROM TAG mondayam;
3.2.使用数据恢复顾问恢复个别块
可以使用数据恢复顾问来诊断和修复数据块损坏导致的故障。在这个示例中,损坏块在执行VALIDATE DATABASE命令时被发现。
产生自动修复选项和使用数据恢复顾问修复故障:
1)启动RMAN,连接到目标数据库。
2列出数据恢复顾问记录的故障:
LIST FAILURE;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
5720 HIGH OPEN 24-APR-14 Datafile 14:
'/home1/oracle/dbs/tbs_32.f' contains one or more corrupt blocks
3)为步骤2列出的故障生成修复选项。
以下命令生成修复选项和创建一个修复脚本来执行自动修复任务。
ADVISE FAILURE;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
5720 HIGH OPEN 24-APR-14 Datafile 14:
'/home1/oracle/dbs/tbs_32.f' contains one or more corrupt blocks
analyzing automatic repair options; this may take some time
using channel ORA_DISK_1
analyzing automatic repair options complete
Mandatory Manual Actions
========================
no manual actions available
Optional Manual Actions
=======================
no manual actions available
Automated Repair Options
========================
Option Repair Description
------ ------------------
1 Perform block media recovery of block 20 in file 14
Strategy: The repair includes complete media recovery with no data loss
Repair script: /home1/oracle/log/diag/rdbms/db12/hm/reco_287949467.hm
4)执行数据恢复顾问建议的自动修复。
RMAN使用ADVISE FAILURE命令生成的修复脚本来执行需要的修复。
REPAIR FAILURE;
Strategy: The repair includes complete media recovery with no data loss
Repair script: /home1/oracle/log/diag/rdbms/db12/hm/reco_287949467.hm
contents of repair script:
# block media recovery recover datafile 14 block 20;
Do you really want to execute the above repair (enter YES or NO)? yes
executing repair script
Starting recover at 24-APR-14
using channel ORA_DISK_1
channel ORA_DISK_1: restoring block(s)channel
ORA_DISK_1: specifying block(s) to restore from backup setrestoring blocks
of datafile 00014
channel ORA_DISK_1: reading from backup piece /backups/DB121/backupset/
2014_04_24/o1_mf_nnndf_TAG20140424T213309_9omsd7vb_.bkp
channel ORA_DISK_1: piece handle=/backups/DB121/backupset/2014_04_24/
o1_mf_nnndf_TAG20140424T213309_9omsd7vb_.bkp tag=TAG20140424T213309
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01
starting media recovery
media recovery complete, elapsed time: 00:00:03
Finished recover at 24-APR-14repair failure complete
当LIST FAILURE命令显示多于一个故障时,可以只为特定的故障执行修复操作。使用ADVISE FAILURE命令输出的Automated Repair Options部分中显示的选项序号来执行待定的修复选项。
以下命令只执行Automated Repair Options部分的选项2下列出的修复操作。
REPAIR FAILURE USING ADVISE OPTION 2;
4.恢复V$DATABASE_BLOCK_CORRUPTION中的所有块
RMAN可以自动修复列在视图V$DATABASE_BLOCK_CORRUPTION视图中的所有块。
恢复记录在视图V$DATABASE_BLOCK_CORRUPTION中的所有块:
1)启动SQL*Plus和连接到目标数据库。
2)查询V$DATABASE_BLOCK_CORRUPTION来确认损坏坏是否存在。
SQL> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
3)启动RMAN和连接到目标数据库。
4)修复V$DATABASE_BLOCK_CORRUPTION中所有标记为损坏的块。
以下命令修复记录在视图中的所有物理损坏块:
RMAN> RECOVER CORRUPTION LIST;
块在被修复之后,数据库从V$DATABASE_BLOCK_CORRUPTION中移除它们。
来源:《Oracle Database Backup and Recovery User’s Guide,19c》