16.Oracle10g服务器管理恢复--RMAN恢复(练习27.28.29)
1、还原(restore)
还原(restore)是指从RMAN所创建的备份中还原文件。这些还原文件可以通过增量备份以及重做等进行恢复。在前面练习中解释了RMAN将备份控制文件和归档重做日志所有数据块,对于数据文件则只备份使用过的数据块或者只备份根据定义的增量级别的最近一次备份以来所更改过的数据块。当使用RMAN还原文件后,这个数据文件都会与该文件备份时的原始状态一样,对于控制文件和归档重做日志,则需要对所有的数据块进行还原。
如果使用“RMAN备份(练习21.22.23)中RMAN的部署”的增量备份策略,那么restore命令将只还原基准文件,例如:在每个星期天进行增量级别0的备份而每个星期进行增量级别为1和2的备份,则RMAN将还原最近一次级别为0的备份,后续的增量备份需要在恢复(recover)命令中应用。
Restore命令使用的RMAN基准备份可以是以下这些数据文件备份类型的一种:映像拷贝、完全备份以及增量级别为0的备份。具体选择哪种数据文件基准很大程度上决定于文件的创建时间以及需要恢复到的时间。当还原数据文件时,RMAN可以还原一个单个数据文件、一个或多个数据表空间的所有数据文件,或者数据库中的所有数据文件。当指定RMAN还原一个数据文件时,RMAN将会寻找最适合的备份或拷贝来还原该数据文件。
当还原数据库文件时,数据库应该处于什么状态?下表提供了快速解答。其基本原则是:当一个文件正在还原时,该数据库文件不能被实例使用,因为当一个数据库文件正在被还原时,该实例不能对其进行写入操作。在任何数据库文件还原期间,目标数据库的实例必须已经启动,当从备份集中还原任何非系统数据文件时,为了确保成功还原,这些数据文件必须处于脱机状态。如果还原任何系统表空间文件,则数据库必须以加载模式启动。当还原一个控制文件时,实例必须以非加载模式启动,归档日志在目标数据库加载或打开时都可以进行还原。
数据库文件 |
数据库状态 |
任何非系统数据文件 |
加载或者打开,但这些文件或表空间必须脱机 |
系统数据文件 |
加载 |
数据库(所有数据文件) |
加载 |
归档日志 |
非加载、加载或打开 |
控制文件 |
非加载 |
为什么RMAN要求数据库在数据文件和归档日志还原期间处于加载状态?因为RMAN备份和数据库结构信息保存在控制文件中,而且RMAN需要访问它们。
2、恢复(recover)
一旦数据文件还原以后,就可以进行恢复(recover)命令将数据库回退到以前的状态。RMAN将使用来自恢复目录或目标控制文件的信息来确定需要哪种增量备份以及应用哪些重做日志。
RMAN应用恢复操作需要经过四个独立的阶段,分别是:
1、 更新目标控制文件来反映存储在恢复目录中最新的信息;
2、 应用所有可以被应用的增量备份;
3、 检查所有还原的数据文件是否存在以及是否可以恢复。不应该出现的数据文件将从数据库删除。在磁盘上查找需要的重做日志,应用并将数据库回退;
4、 磁盘上不存在的或需要应用恢复重做日志文件都将还原到磁盘上,并应用到数据文件上。
每个增量备份都建立在前一个增量备份之上,所以只需要更改替换的数据块。如果可以这样操作,则RMAN会选择还原增量备份,而不是从归档日志文件中应用重做操作(应用增量备份比应用重做操作速度快)。一旦没有更多的增量备份可以应用,则需要应用重做操作将数据库文件返回到恢复的状态。恢复操作一直持续到所有的重做信息都应用到指定的数据文件的停止点上。默认情况下,RMAN执行完全恢复(所有数据文件都回退到当前联机重做日志文件中最后一次改变的时间),如果控制文件还原了,则RMAN不能应用联机重做文件,也就不能进行不完全恢复。
为了便于理解还原、恢复和增量备份,参看下图,该图描述了前面所讨论的增量备份策略,假设在星期六早晨级别为2的增量备份执行之前有一个数据文件丢了,当RMAN还原并恢复该丢失的数据文件时,需要执行下列步骤进行完全恢复:
1、 还原数据文件 应用备份集120,RMAN可以从星期天进行的整个数据库增量级别为0的备份中还原整个丢失的数据文件。这个基准备份包括了该数据文件所使用过的数据块,该级别为0的备份作为后续还原工作的基准;
2、 恢复数据文件 一旦通过了基准备份还原了数据文件,RMAN将使用适当的增量备份来恢复该数据文件。第一个应用的增量备份是备份集124(星期四的增量备份,级别为1)。备份集121、122和123并不需要,因为这些备份集中所有更改过的数据块都包含在备份集124中。然后,RMAN发现备份集125包含的数据块可以应用到这个已经还原的数据文件上,并能使其恢复到当前状态。如果备份集125中没有该数据文件的任何更改过的数据块,则该备份集不能应用,接下来,RMAN发现不再需要其他的增量备份,则查找需要的重做日志文件;如果这些文件在磁盘上,则从磁盘上读取;如果没有找到任何归档文件,则RMAN将查找包含所需要重做文件的映像拷贝或备份集,并将其还原到磁盘上。还原完成以后,通过当前联机重做日志文件,这些文件就可以完全恢复了。
(图1)
默认情况下,RMAN将会把所有数据文件还原到文件备份时的初始位置,例如RMAN将把D:\oracle\PRACTICE\users01.dbf还原到目录D:\oracle\PRACTICE,文件名为users01.dbf。归档日志在默认情况下还原到归档转储目的的路径下,控制文件则还原到数据库初始化文件(inin.ora)中的CONTROL_FILES参数规定的路径下。可以在运行块中通过set属性来更改还原文件的位置,set属性将在一个运行块中为命令定义数值,set属性也可以指定恢复的时间点以及归档日志文件被还原以及恢复期间读取的位置。下表提供了运行块set属性用于还原和恢复选项的快速一览表,注意,set命令与运行块set属性不同,在RMAN提示符下的set命令可以在表空间时间点恢复和复制数据库命令中定义文件名和其他事项。
Set关键字 |
描 述 |
为数据文件设置新名称 |
为特定的数据文件指定新的文件名和路径,如果没有定义该项,则RMAN将文件还原到当前的路径和文件名 |
设置归档日志路径 |
为还原和恢复命令的归档日志文件定义不同的路径,如果没有定义该项,RMAN使用目标init.ora文件定义的第一个归档存储目的的路径作为定义 |
Set until |
为恢复定义停止点,不完全恢复可以完成到特定时间、日志序列号或者SCN。如果没有定义该项,RMAN将还原基准备份,并用增量备份和重做将所有数据文件恢复到当前状态 |
当使用RMAN进行还原和恢复时,环境变量起了重要的作用,有时需要设置环境变量使会话的字符集和数据库的字符集保持一致,设置NLS_LANG环境变量使它与目标数据库的字符集匹配。如果在RMAN的LIST、REPORT、SET UNTIL等命令中要使用特定的时间,则应该设置NLS_DATE环境变量与命令的日期字符串匹配,也可以在脚本中使用TO_DATE函数指向特定的日期。
2 WIN>set NLS_LAND=AMERICAN_AMERICAN.WE8ISO8859P1;
以下练习将使用练习21中的备份脚本生成两个新的备份,通过使用这些备份,RMAN可以恢复PRACTICE数据库。
练习27:还原整个数据库
当遇到灾难性事故,丢失了数据库中所有的数据文件,但控制文件和联机重做日志却完整无缺,那么如何使用RMAN备份从这样的失效中恢复呢?下面这个练习将讲述如何进行RMAN还原与恢复。在该练习中,要执行两个整体数据库备份,然后在PRACTICE数据库中删除所有数据文件,通过整体数据库备份,可以还原并恢复PRACTICE数据库的所有数据文件。
步骤一:执行整个数据库备份
用练习21中生成的脚本创建两个PRACTICE数据库备份,第一个进行的备份是一个整体数据库增量级别为0的备份,其中包含了当前的控制文件。在进行第二个备份之前,打开一个SQL*Plus会话更改数据库中一个表的数据。提交该更改后,返回到RMAN提示符下,运行第二个备份操作。第二个备份是整理数据库增量级别为1的备份,只拷贝自刚才级别为0的备份以来更改过的数据块,输入如下命令:
2 RMAN>connect target sys/practice@practice
3 RMAN>connect catllog rman1010/rman@rcat
4 RMAN>@D:\oracle\CODE\chap12\b_whole_inc0.rcv
(图3)
2 WIN>sqlplus /nolog
3 SQL>connect system/system@practice
4 SQL>DELETE FROM tina.date_log WHERE create_date > SYSDATE;
5 SQL>INSERT INTO tina.date_log VALUES (SYSDATE + (365*14));
6 SQL>COMMIT;
7 SQL>exit;
8 WIN>exit
9 RMAN>@D:\oracle\CODE\chap12\b_whole_inc1.rcv;
(图5)
(图7)
当这些命令运行结束时,将得到一下备份和数据,这些备份片将位于D:\oracle\CODE\chap12目录下:
- 备份:增量级别0 第一个备份是运行练习21名为b_whole_inc0的备份文件得到的。这个备份为PRACTICE数据库生成一个独立的备份集,其备份片包含了所有数据文件中使用过的数据库和当前的控制文件。这个备份集的备份集号为738和739,备份片的键值为742和743;
- 表数据 当第一个备份完成后,TINA.DATE_LOG表将做如下修改,在create-date列中插入一行表示未来14年日期的记录,表数据的更改引起了TOOLS表空间数据文件中数据块的改变,被更改的数据块将在后续的增量备份中选中;
- 备份:增量级别1 第二个备份是运行练习21名为b_whole_inc1的备份脚本文件得到,这个备份生成一个独立的备份集,其备份片包含了所有数据文件使用过的数据块和自上次备份以来更改过的当前控制文件。TINA.DATE_LOG表更改过的数据块写入到这个备份中,这个备份集的编号为759和760,备份片键值为763和764。第二个备份是运行练习21名为b_whole_inc1的备份脚本文件得到,这个备份生成一个独立的备份集,其备份片包含了所有数据文件使用过的数据块和自上次备份以来更改过的当前控制文件。TINA.DATE_LOG表更改过的数据块写入到这个备份中,这个备份集的编号为759和760,备份片键值为763和764。
步骤二:模拟PRACTICE失效
在操作系统中从D:\oracle\PRACTICE目录下删除除联机重做日志和控制文件外所有的数据文件。在Window系统中需要关闭数据库才能够删除数据库文件,删除数据文件的方式可以使用命令行删除或者直接在窗口浏览器选中文件删除。
2 RMAN>connect target system/system@practice
3 RMAN>connect catalog rman1010/rman@rcat
4 RMAN>shutdown abort
5 RMAN>host;
6 WIN>del D:\oracle\PRACTICE\*.dbf
7 RMAN>exit;
(图9)
既然数据库文件已经删除,那么在启动数据库时就会发生错误,当实例启动后并加载了控制文件后,该实例将查找编号为1的数据文件(system01.dbf)。因为该文件不存在,所有RMAN将显示一个错误消息,这个消息与视图用Sql*Plus启动数据库得到的消息是一样的:
(图11)
此时,实例启动了,数据库控制文件加载了,但数据库没有打开;
步骤三:还原与恢复数据库
在RMAN提示符下,列出步骤一中生成的两个备份,使用tag和时间(最近1天)选项,执行下列list命令列出两个增量备份:
2 RMAN>list backup completed after 'sysdate-1' tag=WHOLE_INC1;
(图13)
(图15)
请注意列出的备份级别、set数以及备份片的名称。应用RMAN,使用以下脚本还原并恢复PRACTICE数据库:
2 shutdown abort;
3 startup mount;
4 run {
5 allocate channel d1 type disk;
6 restore database;
7 recover database;
8 }
恢复脚本内容不多,但每一行都完成许多工作。下面将详细解释这些命令,在还原整个数据库时,数据库必须处于没有打开的状态。Shutdown abort是有意义的,因为磁盘上不再有数据文件:
- Run restore还原与恢复recover命令必须位于运行块之内,该块内的所有命令都在功能上加以分组;
- Allocate 分配的通道将在restore命令中读取备份片文件并重新生成数据文件,在应用增量备份和重做进行恢复数据文件时也需要这个通道;
- Restore 通过RMAN目录可以知道整个数据库有哪些文件存在,通过这个信息,restore database命令会找到最新的基准备份(完全备份、映像拷贝或级别为0的增量备份);
- Recover 当数据文件还原之后,recover命令将寻找并应用任何后续的增量备份。备份片中的数据块将被写入到已经从基准备份还原的数据文件中,因为这个练习场景中包括了级别为0的备份和级别为1的备份,所以级别为1的备份将被用于回退包含在其备份片中的更改的数据块。当应用了增量备份后,需要进行重做应用,以便使数据文件返回到当前包含有控制文件的状态。RMAN将将寻找并应用(如果需要)所需要的归档日志文件,然后使用当前使用的联机重做日志文件。很可能第一次恢复时只需要当前联机重做日志文件,这是因为PRACTICE数据库上没有发生更多的动作。
当RMAN完成还原与恢复后,RMAN将释放d1磁盘通道,最后就可以为用户打开数据库。运行前面讲述脚本中的命令,并观察RMAN如何工作,下面是RMAN命令的输出:
(图17)
- channel d1:sid=160 devtype=DISK 当分配了一种磁盘类型的通道时,该通道将产生一个连续目标数据库实例的连接,当连接在目标实例上获得一个目标标识(SID),这个标识可以通通过SQL*Plus连接后在v$session中查询得到;
- db_PRACTICE_25_1_737458836备份集单一备份片包含了还原需要的所有数据块,这个操作系统文件将被查询、读取,并用于重新构建每一个数据文件;
- resotre complete 基准备份完毕后,完成还原;
- db_PRACTICE_27_1_737460224 通过通道d1从该文件中读取数据块并应用到刚才还原的数据文件中;
- restore complete 当第二个备份集应用后,RMAN将会通知这个增量数据块的还原工作已经完成,一旦还原完成,这个数据文件将会拥有与b_whole_inc1备份集脚本运行时一样的数据;
- starting media recovery 当所有最近的增量备份应用后,需要进行重做以将数据库恢复到知道的恢复停止的状态。将要读取重做日志,并应用到还原的数据文件上,重做工作包括前滚数据库修改操作,回退没有提交的修改操作。
- media recovery complete 当介质恢复将数据库的当前状态输入到控制文件中时,RMAN将会通知:数据库已经准备好,可以打开。
步骤四:验证还原与恢复的数据库
检查还原的数据文件是否存在于操作系统上,在操作系统提示符下查找D:\oracle\PRACTICE目录下的内容。其中的数据文件应该与步骤而中删除这些数据文件之前一样。打开一个SQL*Plus会话,检查TINA.TIME_LOG表,在表中查找最大的create_date以确认最新的修改是否存在。
2 SQL>SELECT max(create_date) FROM tina.date_log;
如果看到一个未来14年的日期记录,验证该表已经进行了最新的数据更改。
(图19)
练习28:还原并恢复数据库
如果个别数据文件发生丢失或损坏,则数据库处于打开状态时可以用RMAN轻松地恢复该文件(只要该文件不属于系统表空间并不包含有激活的回退段),RMAN可以对一个或多个表空间中的数据文件进行还原与恢复。
步骤一:模拟PRACTICE失效
在中断数据库之前,需要向SCOTT的一个表增加一行记录:用插入语句在department表中增加一个部门,然后再增加一个部门,但回退该更改。一旦还原与恢复完成,将出现Support部门却没有MIS部门。
2 SQL>INSERT INTO scott.dept(deptno, dname, loc) VALUES (50, 'SUPPORT', 'ATLANTA');
3 SQL>COMMIT;
4 SQL>INSERT INTO scott.dept(deptno, dname, loc) VALUES (60, 'MIS', 'DENVER');
5 SQL>ROLLBACK;
6 SQL>ALTER SYSTEM SWITCH LOGFILE;
7 SQL>ALTER SYSTEM SWITCH LOGFILE;
8 SQL>ALTER SYSTEM SWITCH LOGFILE;
(图21)
接下来,从USERS表空间中删除第一个数据文件,在操作系统中删除该文件,由于Window操作系统对于联机的数据文件加锁,所以该数据文件在删除之前应先脱机。
2 SQL>host;
3 WIN>del D:\oracle\PRACTICE\users01.dbf;
4 WIN>exit;
5 SQL>ALTER TABLESPACE USERS ONLINE;
(图23)
步骤二:还原并恢复数据库文件
当需要恢复一个数据文件时,可以用下面的命令来恢复单个数据文件。包含该数据文件的表空间需要先脱机,然后还原并恢复该数据文件,然后再将表空间联机。
2 run {
3 allocate channel d1 type disk;
4 restore datafile 4; #specify the datafile number of name
5 recover tablespace users;
6 sql 'alter tablespace users online';
7 }
下面是对这个恢复情况各命令做简要的解释:
- Restore RMAN应用目录或者目标控制文件查找最新的映像拷贝、完全或已经还原的增量级别为0的备份的数据文件。通过使用适当的备份片,还原该数据文件。
- Recover 一旦通过增量级别为0的备份片文件还原了丢失的数据文件,该文件必须被恢复到数据库的当前状态。恢复命令首先确定是否从增量备份中向数据文件拷贝了任何数据块,当向还原的数据文件还原数据块时,RMAN读取重做日志,并将这些重做应用到USERS表空间的数据文件上。除了当前还原的数据文件外,其他的数据文件都是当前状态,所有只有对刚才还原的D:\oracle\PRACTICE\users01.dbf文件和D:\oracle\PRACTICE\users02.dbf文件应用重做。增加的Support和MIS部门并没有包含在RMAN备份中,这些记录包含在重做日志文件中。因此,通过重做操作将进行插入Support部门的操作,而插入MIS部门和后续的回退操作也将应用。
为了将表空间或数据局文件恢复到脱机之前,最好先检查这样操作将影响哪些对象已经短时间的不连续性。下面两个SQL语句可以完成该工作:
2 SQL>SELECT owner , segment_name, segment_type
3 FROM dba_extents
4 WHERE tablespace_name = 'users'
5 ORDER BY owner, segment_type, segment_name;
6 SQL>rem For offlining a datafile;
7 SQL>SELECT owner, segment_name, segment_type, count(*) extents
8 FROM dba_extents
9 WHERE file_id = <file number being offlined>
10 GROUP BY owner, segment_name, segment_type;
与前面的练习类似,可以把前面恢复的脚本保存成r_datafile.rcv,然后在RMAN命令提示符下运行列出的脚本文件:
2 SQL>connect target system/system@practice;
3 SQL>connect catalog rman1010/rman@rcat;
4 SQL>@D:\oracle\CODE\chap14\r_datafile.rcv;
当还原与恢复脚本运行时,其输出类似于前面屏幕上的输出结果,以下摘录几个片段说明脚本运行时RMAN进行的操作:RMAN为还原与恢复数据文件分配通道,RMAN自动选择备份集来还原USER01.DBF数据文件:
(图25)
当数据文件还原后,恢复命令继续进行,RMAN选择所有最新的增量备份应用到数据文件中, RMAN读取这个备份片文件并为这个新建的还原文件应用所有更改过的数据块。
(图27)
一旦RMAN向还原的数据文件应用了所有需要的增量备份之后,介质恢复就开始工作。接下来,通过介质恢复能将还原的数据文件返回到数据库其他部分的当前状态。在恢复期间,必须要读取并应用重做日志文件使还原的数据文件保持一致。在这个过程中增加了三个日志切换命令,确保在恢复期间能获得归档日志文件;当最后一部分备份被应用之后,需要当前重做日志文件序列号的重做操作。
RMAN将找到磁盘上的这些归档日志文件,一旦所有的日志文件被应用后,将出现介质恢复完成的消息。这些工作完成之后,该表空间就成功地恢复到联机状态。
当然也可以还原丢失一个数据文件的整个表空间,还原这个表空间将导致RMAN覆盖该表空间所有已经存在的数据文件。
2 run {
3 allocate channel d1 type disk;
4 restore tablespace users;
5 recover tablespace users;
6 sql 'alter tablespace users online';
7 }
步骤三:验证表空间恢复
成功对丢失USERS表空间数据文件进行还原与恢复后,可以在操作系统下检查RMAN还原的文件,同样也可以查询SCOTT的department表,这时应该看到Support部门而找不到MIS部门。
2 SQL>select * from dept;
(图31)
步骤四:用备份的归档日志还原与恢复
在前面三个步骤中,介绍了如何使用增量备份和磁盘上已经存在的归档日志文件还原和恢复一个单一的数据文件。如果在恢复期间有一些恢复所需要的归档日志文件并没有在磁盘上找到,又如何处理呢?如果归档日志文件存在于可用的备份或映像拷贝中,则RMAN为了恢复工作将还原并应用这些所需的归档日志。
为了试验RMAN如何向磁盘上还原日志文件和在恢复期间使用还原的文件,本步骤将重复步骤1-3并恢复一个丢失数据文件。但这次需要绕一个小弯路,在几个日志切换命令之后向磁盘备份归档日志文件,备份之后重新命名这些最新归档日志文件。当RMAN进行恢复操作时,将在磁盘上查找这些重命名的归档日志文件。如果RMAN没有找到,则将从磁盘上的备份还原这些归档文件。通过使用这些还原的归档文件,RMAN就完成了恢复还原users01.dbf数据文件的任务。(本步骤中只重新命名而不删除这些文件是防止某些错误的发生)
2 RMAN>connect catalog rman1010/rman@rcat
3 RMAN>@D:\oracle\CODE\chap12\b_archive_2days.rcv
4 RMAN>host;
5 WIN>cd D:\oracle\PRACTICE\ARCHIVE
6 WIN>rename ARC00031_0735213562.001 ARC00031_0735213562.001.bak
7 WIN>rename ARC00032_0735213562.001 ARC00032_0735213562.001.bak
8 WIN>rename ARC00033_0735213562.001 ARC00033_0735213562.001.bak
9 RMAN>exit;
在练习24中创建了名为b_archive_2days.rcv的脚本,这个脚本主要是为了备份最近两天之内生成的备份日志文件。在该脚本的执行过程中,会出现以下的消息:
(图33)
(图35)
这意味着位于归档转储目的路径的归档日志拷贝到备份集中,当备份这些文件时,会显示他们的重做日志文件序列。
备份完成之后,将删除归档日志。RMAN在磁盘上找不到这些文件,为响应r_datafile.rcv中的恢复命令,RMAN必须使用执行脚本文件b_archive_2days.rcv产生归档文件的备份。由于Window操作系统对联机数据文件都加锁,删除数据文件之前需要将表空间脱机,然后删除USERS表空间的第一个数据文件。
2 SQL>host;
3 WIN>del D:\oracle\PRACTICE\users01.dbf;
4 WIN>exit;
5 SQL>ALTER TABLESPACE USERS ONLINE;
(图37)
已经备份的归档文件和磁盘上的归档文件都被删除,RMAN恢复时就不能使用这些文件了,运行本练习步骤二中的恢复命令:
2 RMAN>connect target system/system@practice
3 RMAN>connect catalog rman1010/rman@rcat
4 RMAN>@D:\oracle\CODE\chap14\r_datafile.rcv;
在还原过程中,因为在最近一次步骤中没有其他新的备份,所以恢复将使用与前面相同的数据文件的增量备份。与前面的恢复不同的是:恢复所需要的归档日志文件需要从备份中还原,这时将出现一个说明归档日志文件正在被还原到默认路径的消息,并读取名为AR_PRACTICE_29_1_737486414的备份片,并应用于创建D:\oracle\PRACTICE\ARCHIVE目录下的归档日志文件ARC00031_0735213562.001、ARC00032_0735213562.001以及ARC00033_0735213562.001.arc。一旦还原部分完成,还原的归档日志文件将被用于恢复已被还原的数据文件。
(图39)
(图41)
RMAN知道备份及其名为AR_PRACTICE_29_1_737486414的备份片文件。作为恢复的一个步骤,这个归档文件将被还原到默认的归档转储路径下。一旦所需要的归档日志还原后,归档日志文件将应用于还原的数据文件使其前滚,这样RMAN才能在出现归档文件在磁盘上的情况下进行恢复操作。
因为RMAN在归档存储路径下还原了重新命名的归档日志文件,所以可以删除前面重新命名的原始归档日志文件:
(图43)
练习29:不完全数据库恢复
为了恢复用户或开发者偶然删除的表,可以执行练习4、练习8中的不完全数据库恢复,如果使用RMAN则在数据库关闭时通过发布还原与恢复数据库的命令就可以恢复数据库的命令并可以恢复所有的数据文件。通过指定时间、日志序列号或者SCN都可以设置RMAN恢复停止点。根据停止点,RMAN将选择合适的备份以及映像拷贝将数据库还原到与停止点要求最新的状态。重做操作也持续到定义的停止点,当RMAN完成这些工作后就是重置日志并打开数据库。
在本练习中,将演示RMAN如何将数据库恢复到过去某一个时间点。
步骤一:模拟PRACTICE失效
在本步骤中,将从PRACTICE数据库中删除一个名为SCOTT.EMP的表。为确认能如期进行不完全恢复,需要对TINA.DATE_LOG表进行清理和设置,在PRACTICE数据库的TINA表中插入日期标识时间。为了演示在该表中插入未来的日期记录,在删除employee表之前,删除这些未来的日期记录,只保留过的日期记录,当删除employee表之后,在TINA.DATE_LOG表中插入一行表示14年的记录,最后进行三次日志切换。这些日志切换确保稍后进行恢复操作使用归档的重做日志。
2 SQL>SET TIME ON
3 SQL>ALTER SESSION SET nls_date_format='yyyy-MM-dd HH24:mi:ss';
4 SQL>DELETE FROM tina.date_log WHERE create_date > SYSDATE;
5 SQL>COMMIT;
6 SQL>DROP TABLE SCOTT.EMP;
7 SQL>INSERT INTO tina.date_log VALUES (SYSDATE+(365*14));
8 SQL>COMMIT;
9 SQL>SELECT MAX(create_date) FROM tina.date_log;
(图45)
在07:28:58时DATE_LOG表中任何有关未来时间的记录将被删除,在07:29:06时employee表删除,当删除表之后,在DATE_LOG表中插入一个未来的日期记录。在PRACTICE数据库恢复到删除表语句之前的时间点,找不到一个未来14年的CREATE_DATE的记录(最新插入的日期记录),恢复操作将在删除表语句之前停止应用重做记录。
步骤二:不完全还原与恢复数据库
不完全恢复首先还原期望恢复时间点之前的备份集,RMAN将自动选择最合适的一个备份。
2 #set time to just before data was lost
3 Set until time "to_date('12/13/2010 07:29:02', 'MM/DD/YYYY HH24:MI:SS')";
4 Shutdown immediate;
5 Startup mount;
6 allocate channel d1 type disk;
7 restore database;
8 recover database;
9 alter database open resetlogs;
10 }
(图47)
(图49)
(图51)
不完全恢复意味这整个数据库必须还原到以前的某个时间点,包括控制文件。有效执行时间点恢复的技巧在于set命令,set until命令通知RMAN用恢复时间最新的备份来还原数据库,这样恢复才能将数据文件返回到指定的时间点。在本示例中,删除employee表的确切时间是知道的,可以将恢复最后时间设置到这个时间点之前,当然也可以选择指定日志序列号或者SCN来设置恢复的停止点。
在删除表的练习中,基于时间的恢复是有意义的,可以用前面讲述过的各种方法来进行不完全恢复。如果恢复到一个日志序列号的停止点,可以修改设置运行的属性如下:
这个set命令将一直应用归档日志文件直到序列号1399为止。
比较少见的不完全恢复选项是基于SCN的恢复,可以修改set的运行属性,指定一个100000的SCN停止点:
如果数据库发生了某些损害而且警告日志在损坏发生时提供一个相关的SCN值,那么可以使用这一种恢复。一旦设置了恢复的停止,就可以将所有的工作交给RMAN来处理。在查看以前的r_whole_incomplete.rcv脚本时,注意下列相关RMAN不完全恢复的几个问题:
- 在还原与恢复之前,关闭数据库;
- 分配通道的语句必须在数据库实例重新启动之后执行,分配通道命令打开一个数据库连接,该连接在数据库关闭时断开;
- 更改数据库打开的命令可以在运行块之外执行
RMAN进行的不完全恢复只有以下两个地方与完全恢复不同:
- RMAN在恢复停止点之前从基准备份还原所有的数据文件,这些还原的文件根据停止点可能是最新的基准备份,也可能不是;
- 恢复一致持续到停止点,RMAN比较智能,能够知道还原并应用哪些增量备份。RMAN将会找到并应用归档重做日志,一直到停止点为止。
不完全恢复的输出结果非常类似练习27中的完全恢复的结果,在输出中并没有什么信息说明是时间点恢复。当以重置日志打开数据库时,RMAN将更新目录中的新纪录,有效地执行RESET DATABASE命令,RESET DATABASE命令从目标数据库控制文件中获取更新RMAN目录新记录的信息。
(图53)
在验证恢复结果之前,也可以用以下命令在其后面使用了一个until语句为还原和恢复增加一个停止点:
2 recover database until time "TO_DATE('01/14/2002 12:02:10', 'MM/DD/YYYY HH24:MI:SS')";
还原和恢复命令中的停止点可以通过日志序列号或SCN当做时间来定义,同样,还原与恢复的停止点不能具有相同的时间。
步骤三:验证表空间恢复
进行重置日志操作之后,得到数据库的一个新的形态,可以使用LIST INCARNATION命令观察该数据库的新形态。
(图55)
注意:在该状态的日期将是重置日志操作的日期,同时也是重置数据库的SCN值。尽管重做日志将被重置,而且日志序列号也从1开始计数,但数据文件的头部以及控制文件的SCN并没有重置,而且继续沿用重置日志操作之后的序列。
当不完全恢复完成之后,检查是否已经恢复了Scott的employee表,打开一个SQL*Plus会话并从该表中查询,看到不完全恢复已经完成。
(图57)
接下来检查DATE_LOG表中最大创建日期的值,查看是否在该表中有一个未来14年日期的记录。这条记录不应该出现在表中,因为恢复停止在删除语句之前,也应该在插入未来14年这个日期记录之前。因此,在DATE_LOG表中插入语句的重做并没有应用。
2 SQL>set linesize 1000
3 SQL>SELECT MAX(create_date) FROM tina.date_log;
(图59)
当PRACTICE数据库恢复之后,还需要完成许多重要的事情,因为日志被重置以确保进行一下的操作:
- 执行新的基准备份 通过重置日志操作并不能轻易地进行数据库恢复;
- 保护或删除任何现存的日志备份 虽然可以使用当前日志备份来恢复数据库,但是要通过重置日志操作来前滚是非常困难的。因此,在重置日志之前至少保留一个基准备份。在一段时间之后,如果没有在重置日志之前恢复数据库的潜在需要,则可以针对以前的数据库状态删除所有备份。使用REPORT OBSOLETE ORPHAN命令可以显示应用到以前数据库形态的备份;
- 在归档存储的路径中清理归档日志文件,只要序列号增长,新的归档重做日志文件将覆盖任何以前存在的归档日志文件。可以将这些已经存在的归档日志文件转移到新的路径下或者删除。
恢复的技巧
下面的恢复技巧是从其他一些方面考虑,或是如何在更复杂的恢复情况下发挥优势作用:
1、还原多个备份集和备份片时,还原数据库应增加多个通道,额外的通道将使数据文件还原以并行方式进行:
2 allocate channel d1 type disk;
3 allocate channel d2 type disk;
4 allocate channel d3 type disk;
5 restore database;
6 recover database;
7 }
2、如果丢失了数据文件需要从映像拷贝中快速恢复,则可以采用如下方式通知RMAN切换到新的数据文件拷贝上:
2 allocate channel d1 type disk;
3 sql 'alter database datafile 5 offline';
4 switch datafile 5 to datafilecopy 'D:\oracle\PRACTICE\tools.dbf';
5 recover datafile 5;
6 sql 'alter database datafile 5 online'
7 }
3、如果丢失了数据库服务器上的文件系统,则需要从原始的位置向其他还原数据文件以恢复数据库。在还原和恢复丢失的数据文件的执行工作中可以使用SET NEWNAME属性,同时也可以使用SWITCH属性通知目标控制文件使用新位置下已经还原的数据文件,可以按如下方式在新的路径中还原与恢复数据文件:
2 allocate channel d1 type disk;
3 set newname for datafile 5 to 'D:\oracle\PRACTICE\tools.dbf';
4 sql 'alter database datafile 5 offline';
5 restore datafile 5;
6 switch datafile 5 to datafilecopy 'D:\oracle\PRACTICE\tools.dbf';
7 recover datafile 5;
8 sql 'alter database datafile 5 online'
9 }
4、如果丢失了当前控制文件的所有拷贝,但还原数据库当前日期的目录,则使用RESTORE CONTROLFILE命令重新生成控制文件,该控制文件与以前的备份类似。RMAN将自动把控制文件存放在init.ora文件指定的路径下。还原与恢复之后,必须重置日志并打开数据库,可以按照如下方式还原控制文件:
2 allocate channel d1 type disk;
3 restore contolfile;
4 }
5、可以从RMAN备份中还原归档日志文件,并手工在SQL*Plus中恢复操作;
6、默认情况下,RMAN将归档日志文件还原到归档转储目的的路径下,可以如下所示,通过SET ARCHIVELOG DESTINATION名了那个在其他路径下还原这些命令:
2 set archivelog destination to 'D:\oracle\CODE\tmp';
3 allocate channel d1 type disk;
4 restore archivelog from logseq 2 until logseq 4;
5 }
7、默认情况下,RMAN使用归档转储目的路径下的归档日志文件来恢复数据库文件,如果通知RMAN在运行期间在其他路径下还原归档文件,则RMAN将在恢复期间自动查找还原的归档日志文件并应用。