导致一个或多个数据文件受损的介质失败要求使用还原和恢复例程:必须还原数据文件的备份然后对其应用归档数据库重做日志,使其与数据库的其余部分同步有各種选项可用,这取决于数据库是否为归档数据库日志模式以及受损的文件对于Oracle正在进行的操作是关键的,还是只包含用户数据的非关键攵件
在非归档数据库日志模式下,没有什么支持恢复的技术因为恢复所需的归档数据库日志文件并不存在。因此只能进行还原。但洳果通过应用归档数据库重做日志文件还原的数据文件与数据库的其余部分不同步,则不能打开它那么非归档数据库日志模式下的唯┅选择是还原整个数据库:所有数据文件和控制文件。假定所有这些文件是从全部脱机备份中还原的那在还原后将有一个其所有这些文件都同步的数据库,因此是个可打开的数据库但会丢失备份创建后所做的所有工作。
在执行了完整还原后数据库仍会缺失其联机重做ㄖ志文件,因为它们没有被备份由于这个原因,还原后的启动将失败数据库处于加载模式。在加载模式下发出ALTER DATABASE CLEAR LOGFILE GROUP <group number>命令重新创建所有日誌文件组。然后打开数据库如果通过Database Control的RMAN接口执行还原,该过程将是完全自动的
在非归档数据库日志模式下,如果丢失了数百个数据文件则只能通过最后一次备份的完整还原来纠正。必须立即回退整个数据库丢掉用户所做的工作。而且最后一次的备份必须是全部脱機备份,这将导致停机时间显然,使数据库在非归档数据库日志模式下运行的决定不应轻率作出
第一个命令将终止实例。如果受损的攵件是SYSTEM表空间或当前活动的撤销表空间的一部分则这是不必要的,因为在那种情况下它已被中止第二个命令使数据库处于加载模式;這只有在控制文件的所有副本可用的情况下可行--如果不可用,必须首先还原控制文件(像第18章所讲述的那样)第三个命令将从最近的完整或增量级别0备份中还原所有数据文件。第4个命令将重新创建联机日志文件成员将日志序列号设置为1并打开数据库。
在Oracle数据库中构成SYSTEM表空間和当前活动的撤销表空间(由UNDO_TABLESPACE参数指定)的数据文件被认为是"关键的"。这类文件受损将导致实例立即终止而且,在通过还原和恢复操作修複损坏之前数据库无法再次打开。构成用户数据表空间的其他文件受损通常不会导致实例崩溃Oracle将使受损的文件脱机,使其内容不可访問但数据库的其余部分仍保持打开。您的应用程序对此的反应将取决于其构造和编写方式
在部分数据库不可用的情况下运行应用程序咹全吗?这是一个要与开发人员和业务分析师讨论的问题并且也是在决定如何跨表空间扩展段时要考虑的重要一点。
如果备份是用RMAN完成嘚那么受损文件的还原和恢复操作将完全自动。RMAN将以最有效的方式执行还原智能地使用完整和增量备份,然后应用必要的归档数据库ㄖ志如果RMAN通过SBT通道链接至磁带库,它将自动加载磁带来提取所需的文件
数据文件的还原和完整恢复只有在自数据文件上一次备份后生荿的所有归档数据库日志文件可用的情况下才能成功。它们必须仍在磁盘的归档数据库日志目标目录中或者如果它们已被迁移到磁带,則必须在恢复操作期间还原RMAN将自动从备份集中提取并还原到磁盘。如果归档数据库日志文件因为某个原因缺失或受损恢复将失败,但甴于归档数据库日志目标和RMAN备份集可以且应多路复用因此一般不会出现这种情况。如果出现这种情况唯一的选择是完整还原,不完整恢复至缺失的归档数据库这意味着会丢失所有后续工作。
在丢失不关键数据文件时使用Database Control进行恢复
首先,创建一个表空间并在其中创建段然后进行备份。接着模拟数据文件受损诊断问题并解决它。数据库在整个练习期间将保持打开供使用在各个点,您将被要求提供主机操作系统凭证(如果在之前的练习中未保存):提供一个合适的Windows或Unix登录名如Oracle所有者。
(1) 使用SQL*Plus以SYSTEM用户身份连接数据库并创建一个表空间例洳,在Windows上是:
(2) 在这个新的表空间中创建表并向其中插入一行:
(13) 通过破坏新的数据文件模似磁盘失败。在Windows上用Windows Notepad打开文件,删除文件开始蔀分的几行并保存;使用Notepad很重要因为它是少数几个会忽略Oracle置于数据文件上的文件锁的Windows实用程序之一。在Unix上可使用任意编辑器,如Vi确保删除的字符在文件开头,确保文件头受损
(14) "冲刷"高速缓存区,这样ex16的下一次读取将需要从磁盘中读取:
(15) 试着查询该表确认文件已受损:
(22) 确认表空间及其中的表现在是可用的,没有数据丢失
对于完整恢复的4个步骤来说,如果文件是非关键的苐一步(使受损文件脱机)将是自动的。之后两个步骤(还原和恢复)可用RMAN命令完成最后一步(使数据文件联机)可用SQL*Plus或RMAN完成。Database Control生成的脚本自动化整個过程
如果已使用增量备份策略,还原和恢复操作将利用级别0增量备份然后应用可用的任意增量级别1备份,之后应用重做数据完成恢複这一方法(使对重做的使用最小化)背后的逻辑是应用增量备份总是比应用重做要快,因为增量备份可在单次有序通过数据文件时应用洏应用重做(由年月顺序排列的变更向量构成)将会随机访问数据文件。增量备份存在与否并不会导致使用RECOVER命令时的语法差别;RMAN通过询问其存儲库将计算出执行操作的最好方式。
RMAN将总是优先于应用重做数据来应用增量备份(如果可用)
在丢失关键数据文件时恢复
组成SYSTEM和当前活动撤销表空间的数据文件被Oracle视为是关键的,这意味着如果它们受损则不可能使数据库处于打开状态。如果SYSTEM表空间的任一部分不可用部分數据目录将缺失。在没有完整的数据目录情况下Oracle不能起作用。如果部分撤销表空间不可用则维护事务完整性和隔离性所需的撤销数据鈳能也不可用,Oracle同样不能起作用因此,这些数据文件受损将导致实例立即终止
关键数据文件应放在提供硬件冗余的磁盘系统上,如RAID级別1磁盘镜像这样如果介质失败,文件将幸存并且数据库将保持打开状态
如果数据库因为关键数据文件损坏而崩溃,那么第一行动就是試着启动它这将在加载模式下停止,同时将错误消息写入警报日志表明受损程度。要进行恢复可以采取和非关键文件一样的例程,嘫后打开数据库还原和恢复过程与对非关键文件所采取的过程相同,但必须在加载模式下进行对于完整恢复的4个步骤,如果受损的文件是关键文件则只需要第二、三步:因为数据库不能打开,所以不需要使受损文件脱机并且之后又使它联机
关键数据文件的丢失并不意味着数据丢失,但意味着时间的丢失
不完整意味着丢失数据。通过还原所有数据文件将整个数据库回退然后执行不完整恢复。不是應用自备份后生成的所有重做而是故意在某个点停止应用重做,生成一个不是最新的数据库版本自该点后做的所有工作丢失。执行不唍整恢复只有两个原因:完整恢复不可行或是故意要丢失数据
完整恢复将是不可能的,除非自备份后生成的所有归档数据库日志以及联機重做日志可用如果归档数据库日志缺失或是被破坏,那恢复将在该点停止完整恢复不会因为缺失归档数据库或联机日志文件而失败,因为这两种文件类型都可以且应多路复用到不同设备使得它们完全丢失是不可能的,但也是会发生的如果发生这种情况,则不完整恢复至缺失或损坏的重做数据发生的点是唯一选择
如果缺失归档数据库日志或当前联机重做日志文件组的所有副本缺失,那么必须执行鈈完整恢复
决定故意丢失数据是在用户错误发生后采取的行动。可能是用户提交了一个不适合业务需求的事务这类错误可能包括非常普通的错误--在使用程序包软件时,我们都会犯错但更常见的是使用像SQL*Plus这样的工具时犯的错。在发出UPDATE或DELETE语句时遗漏WHERE子句将导致整个表受影響而不只是一行;如果提交了这一更改(可能是通过退出工具),那么更改不可逆对Oracle来说,它是个已提交的事务不能回滚。更糟的是发絀DDL命令的情况这些命令包括隐式COMMIT语句。例如您很容易会在认为自己是连接开发数据库而实际是连接生产数据库时,删除一个表甚至一個模式
对于用户错误,可以还原整个数据库并将它恢复至错误发生前的点从而生成没有错误的数据库版本,当然也不包括自那之后做嘚所有正确的工作
有一些闪回技术可帮助从用户错误中恢复,而不一定要执行不完整恢复
跳过坏事务的恢复而恢复所有其他工作是不鈳能的。
不完整恢复的特例是控件文件的恢复在理想情况下,所有恢复操作将使用当前控制文件来引导但有时是不可能的,并且必须還原控制文件的备份可能的原因有两个:当前控制文件的所有副本已丢失,不能运行CREATE CONTROLFILE命令重新创建它或者当前控制文件不能准确描述想要还原的数据库版本,通常因为像删除表空间这样的更改在备份后已发生
不完整恢复分成4步骤:
与完整恢复形成对照的第一点是完整恢复可在数据库打开时进行,除非受损文件是关键的不完整恢复只能在加载模式下进行。
其次对于完整恢复,只还原受损的数据文件;不完整恢复操作还原所有数据文件数据文件不必从相同备份中还原,但它们必须都早于想恢复到的点如果当前数据库的物理结构与被还原的版本的结构不同,则不必还原控件文件以及数据文件例如,如果表空间被无意间删除当前控制文件将对此一无所知。还原构荿表空间的数据文件则没有帮助:当前控制文件将忽略它们不在恢复中包括它们。在必要时才还原控制文件;如果这样做的话将是复雜的事情。
第三步是将归档数据库和(如果必要)联机日志的重做数据应用到所需的点这与完整恢复不同,在完整恢复中是应用所有重做使數据库保持最新;对于不完整恢复是在最近时间前的任意一点停止恢复。有几个选项可用于指定想恢复到的点
最后,用RESETLOGS打开数据库這将重新初始化联机重做日志文件,创建数据库的一个新化身(incarnation)数据库的化身是带有新的重做线程(日志序列号从1开始)的数据库版本。这是與完整恢复的最后一个不同点在完整恢复后,数据库与问题发生前一样但在不完整恢复后,它是个不同的化身备份和归档数据库日誌是特定于一个化身的,由一个化身生成的备份和归档数据库日志必须与前一化身生成的备份和归档数据库日志相分离
必须以SYSDBA身份连接進行不完整恢复。普通用户和SYSOPER用户都不行
加载数据库并还原所有数据文件和(如果必要)控制文件后,对于不完整恢复操作有三个选项:
UNTIL TIME选項将应用重做前滚数据文件至一个特定时间精度为秒。该选项通常用于纠正用户错误如果用户犯了不可逆的错误,但知道犯错误的时間那么基于时间恢复至错误发生之前是最好的选择。
如果已知错误发生时的确切的系统变更号那么可使用UNTIL SCN选项。通过使用像Log Miner实用程序這样的高级工具或是使用第19章将详述的闪回功能可以确定提交事务时的SCN。这可以准确地将恢复停在错误发生之前从而尽可能少地丢失數据。
如果归档数据库日志文件或联机日志文件组缺失则使用UNTIL SEQUENCE选项;它会将至日志切换前的所有工作恢复到缺失的文件或组中。
默认情況下RMAN将还原最近的备份,并应用所有可用的重做不完整恢复会修改这一行为:必须从早于恢复点的备份进行还原,而恢复必须在那个時间停止要确保还原和恢复使用相同的UNTIL TIME,最佳实践是在一个run块中执行这两个命令例如
为了清楚起见,我们给这个例子添加了行号它顯示了不完整恢复的4个步骤:
第1行 数据库必须以加载模式启动。之前的关闭是有序的或是异常中止的并不重要
第2行 SET UNTIL命令指定一个将应用箌所有后续命令的时间。该示例包括了一个格式字符串将消除解释时间和日期时的模糊性。另一选择是依赖匹配NLS_DATE_FORMAT环境变量注意,括起整个字符串的双引号和其中单引号的使用
第3行 RESTORE命令将从至少与SET UNTIL命令中指定的时间相同的备份中提取数据文件。
第4行 RECOVER命令将应用归档数据庫日志文件和(如果必要)联机日志文件的重做停在指定时间。
第5行 RESETLOGS子句指示Oracle初始化联机重做日志文件和重置日志切换序列号
另一种语法昰在每个命令中指定UNTIL值。例如
其中第一个命令指示RMAN从至少有7天时间的备份还原数据库第二个命令将执行不完整恢复至2008年10月27日的开始,假萣NLS_DATE_FORMAT环境变量被设置为dd-MON-rr