Oracle数据库备份、恢复与迁移 第五章 数据库的FLASHBACK技术
在数据库服务器正常运行过程中,用户可能在数据库中执行了一些误操作,比如删除了一个重要的表,或者对某个表执行了TRUNCATE操作,也可能向数据库中写入了错误的数据。为了让这些重要的表或者数据重新回到数据库中,或者让表中错误的数据消失,管理员希望把数据库恢复到过去的某个时刻,在这些情况下,FLASHBACK是一种非常好的选择。具体来说,利用FLASHBACK可以完成一下任务:
查询一个表在过去某个时刻的数据
查询一个表在过去一段时间内数据的变化
从回收站中恢复一个被删除的表
把一个表恢复到过去的某个时刻或者某个SCN
把整个数据库恢复到过去某个时刻或者某个SCN
利用FLASHBACK,可以知道一行数据在过去某个时刻的样子,还可以把这行数据恢复到过去的某个时刻,也可以针对一个表,或者整个数据库进行相同的操作。总之,利用FLASHBACK可以找回过去的数据,同时把由此对数据库带来的影响减到最小。
由此可见,FLASHBACK最主要的功能,是对数据库进行“基于时间点”的恢复,或者“基于SCN”的恢复。为此,FLASHBACK需要读UNDO表空间、归档日志文件和重做日志文件、位于快速恢复区的FLASHBACK日志等数据。
5.1快速恢复区的设置
快速恢复区是硬盘设备上的一段存储空间,它可能是一个目录,或者一个文件系统,或者一个ASM磁盘组。Oracle数据库服务器在这段存储空间中存放一些与数据库的备份和恢复有关的文件。具体来说,快速恢复区有以下用途:
多元化控制文件的一个默认存储路径
多元化重做日志文件的一个默认存储路径
控制文件和参数文件的自动备份结果的默认存储路径
对数据库所做任何备份所产生的备份结果的默认存储路径
归档日志文件的默认存储路径
数据库的FLASHBACK日志文件的唯一存储路径
快速恢复区中的文件要么是永久性的,要么是临时性的。永久性意味着数据库实例在正常运行时,需要读写这种文件。临时性意味着这种文件具有有效期,只要过了有效期,文件就可以被手工或自动删除。如果其中一个控制文件,或者某个重做日志组中的其中一个重做日志文件存储在快速恢复区中,那么一旦这样的文件不可用,数据库服务器将无法正常运行。实际上,快速恢复区中的永久性文件只有这样的控制文件和重做日志文件,其他文件都是临时性的,Oracle数据库服务器或者RMAN工具将自动对这些文件进行维护。
在RAC环境中,快速恢复区必须是一个集群文件系统,或者一个ASM磁盘组,或者是通过NFS设置的共享目录,而且在所有的数据库实例中,与快速恢复区有关的初始化参数的设置必须是相同的。也就是说,在RAC环境中,所有的数据库实例使用相同的快速恢复区。
与快速恢复区有关的两个初始化参数是:
DB_RECOVERY_FILE_DEST_SIZE
DB_RECOVERY_FILE_DEST
其中第一个初始化参数用于指定快速恢复区的大小,以MB为单位,第二个参数用于指定快速恢复区的路径。在创建数据库的同时,可以对快速恢复区进行设置。如果当时没有设置,在数据库服务器正常运行时,可以通过上述两个初始化参数对快速恢复区进行设置。需要注意:首先通过第一个初始化参数指定快速恢复区的大小,然后通过第二个参数指定快速恢复区的路径。例如:
随着数据库服务器的运行,在快速恢复区中不断产生新的文件,而有些文件由于过期而被删除。一旦快速恢复区被写满,数据库中的所有事务将无法继续执行,对用户来说,事务表现为挂起现象。实际上,只有数据库的FLASHBACK日志文件必须存放在快速恢复区,其他文件都可以存放在快速恢复区以外的其他地方。例如,通过初始化参数为归档日志文件指定其他的存储路径:在备份数据库时,在BACKUP命令为备份结果指定其他的存储路径。
故障案例:某市机要局的密钥管理系统承担着为市委办公网产生密钥的重要任务,这个系统的数据库曾经发生一个故障,导致市委办公网瘫痪。经过排查发现,数据库中的事务全部被挂起,数据无法写入数据库。当进一步查看数据库服务器的状态时发现,数据文件、控制文件和重做日志文件的状态以及各个后台进程的状态都正常,但在查看各个后台进程的跟踪文件时发现,ARCH进程无法对重做日志文件进行归档。通过查看初始化参数发现,归档日志文件的存储路径为快速恢复区,而当时的数据库版本对这个存储区域的大小默认限制为2GB,而且几乎已经被写满了。于是数据库出现故障的原因确定为:因为快速恢复区被写满,归档日志文件无法产生,从而导致数据库中的事务被挂起,解决这个故障的方法是:为归档日志文件指定另外一个存储路径,同时吧快速恢复区的空间扩展到20GB,以防止它被再次写满而导致其他问题的产生。
5.2回收站在防止误删除方面的作用
如果你不小心对一个重要的表执行了DROP操作,或者一个非法用户恶意地删除了一个重要的表,你一定会感到非常痛心。在过去的Oracle数据库中,为了解决这类问题,需要对数据库进行“基于时间点”的恢复,也就是说,利用数据库的备份,把数据库恢复到DROP操作执行之前的时刻,通过这种办法虽然能够找回重要的表,但由此带来的负面影响可能不是管理员能够承受的,因此整个数据库都回到过去,而且这样的恢复需要用到整个数据库的备份,如果没有这样的备份,这样的恢复不可能进行。
目前的Oracle版本提供了回收站的功能。当用户删除一个表时,这个表并没有被真正删除,而是放到了回收站中,回收站实际上是一些系统表,当一个表被删除时,表的相关信息被移到这些系统表中,而表中的数据并没有被真正删除,只是用户无法对其进行访问而已。通过查询相关的数据字典视图,可以确定回收站中有哪些表。
如果数据库没有开启回收站功能,那么当一个表被删除是,这个表占用的存储空间将立即被释放,它就真正不存在了。如果数据库开启了回收站功能,被删除的表所占用的存储空间并没有立即释放,而是保留尽量长的时间,知道空间紧张时,这样就为表的恢复提供了最大的可能性。
回收站功能是通过初始化参数RECYCLEBIN来实现的,如果这个参数的值是ON,说明当前数据库开启了回收站功能,如果是OFF,则说明当前数据库关闭了回收站功能,为了能够使用回收站,一方面,作为SYS用户,可以修改初始化参数RECYCLEBIN的值为ON,然后重新启动数据库服务器,这样数据库中的所有用户都可以使用回收站,例如:
另一方面,普通用户可以选择在当前会话中开启或关闭回收站功能。例如:
在SQL*Plus中,用户可以通过执行下面的命令来查看回收站中所有的表:
另外,SYS用户可以从数据字典视图DBA_RECYCLEBIN中查询数据库中所有被删除的、且位于回收站中的表和索引,而普通用户可以从数据字典视图USER_RECYCLEBIN中查询当前模式中被删除的且位于回收站中的表和索引。例如:
从上述查询结果可以看出,当一个表被删除时,这个表以及表上的索引将一起被放到回收站中,而且被重新指定新的名称。重新命名的目的是为了防止同名的表或索引在回收站中引起名称冲突。
通过上述方法可以了解回收站中的表或索引在被删除之前的名称、在回收站中的名称、数据库对象类型、被删除时间等信息。
如果管理员关闭了数据库的回收站,那么当用户删除一个表时,这个表连同表上的索引等数据库对象将一起被删除,表和索引所占用的存储空间将被立即释放。如果开启了回收站功能,被删除的表连同这个表上的索引将被放到回收站中,它们所占用的空间并没有释放,也就是说,它们所对应的段并没有被删除。当管理员从相关的数据字典视图中查询这些段的信息时,将发现段的名称被改为和回收站中的名称一致。例如,当用户删除表STU时,这个表以及表上的索引STU_ID_PK被放入回收站。如果从数据字典视图USER_SEGMENTS中查询它们对应的段的信息,将得到类似以下的结果:
既然表被删除时它所占用的存储空间并没有立即释放,那么表中的数据还是可以查询的,只不过在SELECT语句中需要指定这个表在回收站中的名称。例如:
既然表和索引对应的段并没有被真正删除,那么利用FLASHBACK命令,管理员就可以从回收站中恢复一个表,在命令中需要指定这个表在回收站中的名称。例如:
如果上述FLASHBACK命令执行成功,那么这个表连同表上的索引可以再次正常使用,它们的名称还是被删除之前的名称。
在FLASHBACK命令中也可以指定一个表的被删除之前的名称。如果这个名称在回收站中也是唯一的,那么这个表也可以被正常恢复。例如:
如果用户将一个表删除之后,又创建一个同名的表,那么当用户希望从回收站中恢复这个表时,将遇到名称冲突的问题,为了解决这个问题,在从回收站中恢复一个表时,可以同时修改这个表的名称。例如:
现在考虑到一种特殊情况,用户多次创建一个同名的表,又多次删除这样的表,虽然这些表被放入回收站时都被重新命名,但它们被删除之前的名称在回收站中是重复的。例如:
这样在回收站中将有三个DEPT表,它们被删除之前的名称在回收站中是相同的。如果通过下面的命令恢复表DEPT:
那么最后被删除的那个DEPT表将被恢复。
如果再次执行上面的FLASHBACK命令,那么回收站中稍晚被删除的那个DEPT表将被恢复,但命令的执行将产生错误。为避免名称冲突,在恢复另外两个DEPT表时,需要为它们指定其他名称。例如:
如果确定一个表不再需要,可以通过PURGE命令把它从回收站中删除,这个表以及表上的索引所占用的空间将被释放,这时表以及索引将被真正删除。PURGE命令可用于删除回收站中所有的表,也可以删除一个指定的表,例如:
由于一个表在回收站中的名称是唯一的,所以在PURGE命令中指定这个名称时,将删除一个确定的表。在PURGE命令中也可以指定一个表删除之前的名称。如果回收站中有多个表,它们在删除之前的名称时相同的,那么PURGE命令中指定这样的名称时,将按照时间顺序,删除最早被放入回收站的那个表。
当用户删除一个表时,可以同时指定是否将这个表放入回收站。如果在DROP语句中指定了PURGE关键字,那么这个表将被彻底删除,而不是放入回收站。例如:
5.3表的FLASHBACK查询
在数据库服务器正常运行时,表中的数据不断被更新。在一般情况下,用户通过SELECT语句只能看到表中目前的数据。利用FLASHBACK技术,可以查询一个表在过去某个时刻的数据,或者在某个SCN的数据。例如:
或者:
SELECT语句中的时间是以时间戳的形式指定的。为此需要通过函数TO_TIMESTAMP将指定的时间转换为时间戳。
如果通过WHERE子句限定了一行特定的数据,那么利用SELECT语句可以查询这行数据在过去某个时刻的样子。例如:
在一般情况下,管理员对表中数据的修改是很难跟踪的。在某个时刻,用户可能向表中写入了错误的数据,即使用户后来能够发现数据错误,也无法判断这样的数据是什么时候出现错误的。比如,公司财务人员本来应该为员工增加100元工资,但由于疏忽,为员工增加了1000元工资,在此基础上,财务人员又对这样的数据进行了数次其他修改,这种情况将导致表中最终的数据是错误的。利用FLASHBACK查询,可以从目前的时刻向过去的时间进行跟踪,以确定表中数据的变化,一直跟踪到准确的数据,以及当时的时间。假设表EMP中员工7788的工资和奖金在2015年12月1日12点时的数据是准确的,而此后的数据是错误的,那么利用类似下面的UPDATE语句,可以把这样的数据恢复为最后的准确的样子:
至此,这行数据被恢复为它最后一次准确的状态,在此基础之上,管理员再对这行数据执行后续的其他修改,直到把数据修改为现在应该呈现的状态。
除此之外,利用FLASHBACK查询可以了解表中的某行数据在过去一段时间内的变化,以及引起这些变化的事务的情况。例如:
从上面的查询结果可以看出,在指定的5min这段时间内,在DEPT表中发生过一个事务,他把表中这行数据中的LOC列的值从"BOSTON"修改为"BEIJING"。VERSION_XID列是一个伪列,它代表的是对这样数据进行了这样修改的事务的ID。
5.4表的FLASHBACK
如果用户发现从某个时刻起,表中的许多行数据都被错误地修改,那么利用刚才提到的UPDATE语句一行一行地把数据改为那个时刻的样子,这种方法虽然是可行的,但效率太低。利用表的FLASHBACK技术,可以把整个表恢复到过去的某个时刻,在此基础之上,对表中的数据再执行后续的其他修改,直到把数据修改为目前应该呈现的样子。
为了能够利用FLASHBACK技术将表恢复到过去某个时刻,需要对表执行下面的操作,其中DEPT是表的名称。
下面的FLASHBACK语句用于将表DEPT恢复到过去的某个时刻:
需要强调的是,FLASHBACK技术的使用是有条件的。无论用FLASHBACK查询一个表在过去某个时刻的数据,还是把表恢复到过去某个时刻,都有以下限制:
不能针对外部表、视图和临时表进行FLASHBACK
FLASHBACK需要读UNDO表空间中的数据
表上的FLASHBACK查询和恢复是利用UNDO表空间中的数据完成的。当用户执行一个事务时,表中与该事务有关的最初的数据将被拷贝到UNDO表空间中,当用户提交事务时,UNDO表空间中的相关数据就可以被删除了,但不是立即删除,而是要保留一段时间,保留时间通过初始化参数UNDO_RETENTION来指定。
如果表的FLASHBACK查询和恢复所涉及的时刻在相关UNDO数据的保留期内,那么这次FLASHBACK操作可能顺利完成。比如,初始化参数UNDO_RETENTION的值为900(单位为秒,即15min),而管理员需要查询一个表在14min之前那个时刻的数据,那么有可能得到查询结果。如果要查询16min之前的数据,那么可能得到一条错误信息。
在刚才的描述中,多次用到“可能”一词,这是因为,FLASHBACK操作能否成功,并不严格受到UNDO数据保留期的限制。如果数据库中的事务很少,数据库对UNDO表空间的需求并不大,那么以前的事务所产生的UNDO数据在UNDO表空间中可以保留更长时间,超出初始化参数UNDO_RETENTION指定的时间,这时用户利用FLASHBACK技术可以查询一个表在过去更远时刻的数据,或者把表恢复到过去更远的时刻。相反,如果数据库中的事务很多,UNDO数据产生的速度很快,那么以前已提交的事务所产生的UNDO数据可能很快被覆盖,无法保留管理员期望的时间,也就是通过初始化参数UNDO_RETENTION指定的那么长时间,这时FLASHBACK操作只能达到更近的某个时刻。
为了保证FLASHBACK操作的顺利执行,一方面,需要通过初始化参数UNDO_RETENTION为UNDO数据设置适当的保留期,另一方面,还要保证UNDO数据在保留期内不会被覆盖。例如,下面的语句将UNDO数据的保留期设置为30min:
此外,利用FLASHBACK对表进行恢复的操作不能跨越DDL操作,也就是说,如果希望把一个表恢复到过去某个时刻,但从那个时刻开始到目前时刻这段时间内,用户对表执行DDL操作,比如通过ALTER命令修改了表的结构,或者通过TRUNCATE命令清空了表中的数据,那么最多只能把表恢复到DDL命令执行之后的某个时刻。
5.5更久远的FLASHBACK——Total Recall
为了使用户能够查询一个表在过去更远一个时刻的数据,或者把表恢复到过去更远的一个时刻,同时为了使表的FLASHBACK查询或恢复不受DDL语句的影响,Oracle引入了一项技术——Total Recall。
Total Recall也叫FLASHBACK数据归档(FLASHBACK Data Archive,简称FDA),用于跟踪用户对表中数据所做的修改。如图5-1所示,当用户执行事务时,服务器进程在数据库缓冲区缓存中将产生脏缓冲区,而且将修改之前的数据拷贝到UNDO表空间中。实例中的FBDA后台进程在一定的时机下将这些被跟踪的数据从UNDO表空间拷贝到FDA中。简单地说,FDA中的数据是这样产生的:只要用户修改表中的数据,修改之前的数据将被拷贝到FDA中,保留指定的时间,而且用户对表中数据的每次修改都被记录在FDA中。也就是说,表中一行数据的连续变化,都将被记录在FDA中。例如,假设表中有一行数据100,在T1时刻,用户把这行数据改为200,在T2时刻把它改为300,在T3时刻把它改为400,此后在没有对这行数据进行过修改,那么表中目前这行数据就是400,而过去的100、200和300这样的历史数据就被记录在FDA中。此后通过查询FDA可知,这行数据在T1时刻之前是100,在T1和T2时刻之间是200,等等。
FDA中的数据将被保留指定的时间,这样的时间远远大于UNDO数据在UNDO表空间中的保留时间。利用FDA中的数据,通过FLASHBACK技术可以查询一个表在保留期内任何一个时刻的数据。利用FDA中的数据,通过FLASHBACK技术可以查询一个表在保留期内任何一个时刻的数据。也可以把表恢复到保留期内任何一个时刻,而且这样的恢复不会受到表上DDL操作的影响。

FDA实际上也是一些表,他位于指定的表空间中。每个FDA都有一个保留期,表中的数据保留内都存储在FDA中,一旦超出保留期,FDA中的数据将被删除。在一般情况下,FDA位于单独创建的一个表空间中。管理员在创建FDA时,需要指定它在表空间中的空间配额,以及数据的保留期。不同数据如果需要不同的保留期,就要创建多个FDA,并为每个FDA指定不同的保留期。保留期的单位是DAY、MONTH或者YEAR。例如,下面的两条CREATE语句用于创建一个表空间和一个FDA。
下面的DROP语句用于删除一个FDA:
在一般情况下,创建和删除FDA的任务是由SYS用户完成的。如果一个普通用户具有系统权限“FLASHBACK ARCHIVE ADMINISTER”,那么他也可以执行这样的任务。以下几条语句分别用于为用户SCOTT指定这样的权限,以及从这个用户回收这个权限。
当数据库中至少有一个FDA存在时,用户就可以使用这些FDA来存储自己的表中的历史数据了。为此,用户还需要具有使用FDA的权限,这样的权限是由SYS用户,或者具有“FLASHBACK ARCHIVE ADMINISTER”系统权限的用户指定的。例如,下面的语句用于为用户SMITH和KING指定对某个FDA的使用权限:
下面的语句用于从用户SMITH和KING回收对某个FDA的使用权限:
当用户获得了对某个FDA的使用权限之后,就可以指定自己的表来使用这个FDA的空间了。例如:
此后,DEPT表中数据的任何变化都会被记录在这个FDA中。如果数据被多次修改,那么每次修改都会被记录在FDA中。如果用户要查询一个表在过去某个时刻的数据,或者把表恢复到过去某个时刻,那么这样的操作可以达到数据在FDA中的保留期内的任何一个时刻,而且这样的操作不会受到过去在表上执行的DDL的影响。也就是说,用户在表上的下列操作都可以引用FDA中的数据:
如果对一个表取消了跟踪,那么用户以后在对这个表执行上述操作时,只能依靠UNDO表空间了。例如,下面的ALTER语句执行成功之后,表DEPT不再使用任何FDA。
管理员在一个数据库中可以创建多个FDA,它们可以位于相同或者不同的表空间中,管理员可以选择其中一个作为数据库默认的FDA。例如,下列语句通过“DEFAULT”关键字将创建的FDA指定为当前数据库默认的FDA。
如果在创建FDA时没有指定“DEFAULT”关键字,那么在FDA创建成功之后,管理员可以通过下面的语句将它指定为数据库默认的FDA;
指定默认FDA的好处在于,当一个用户在使用FDA时,不用关心数据库到底有哪些FDA,只要使用默认FDA就可以了。例如,用户可以通过下面的方式指定自己的表使用默认的FDA:
当用户指定自己的表使用某个FDA之后,只要表中的数据被修改,之前的数据就会被拷贝到指定的FDA中。根据FDA保留期的规定,数据将在FDA中保留一段时间,到达保留期的数据将从FDA中被删除。随着用户对表的访问的进行,新的数据不断进入FDA,超出保留期的数据不断地从FDA中被删除。
通过上面的描述可以知道,任何一个FDA都位于一个或多个确定的表空间中,它们需要使用表空间的存储。一般来说,FDA的保留期越长,用户在表上执行的DML语句越多,FDA对存储空间的需求越大。一旦FDA在表空间上的存储配额用完,数据将无法被写入这个FDA中,随之带来的影响是,用户在表上的事务将被阻塞。
无论是FDA的保留期,还是他在表空间上的存储配额,都是可以改动的。例如,下面的SQL语句用于修改FDA在表空间上的空间配额(可以增加,也可以减少);
下面的SQL语句用于在另外一个表空间上为FDA指定空间配额:
下面的SQL语句用于修改FDA的保留期(可以延长,也可以缩短):
FDA中的数据将根据保留期的规定被自动删除。另外,通过下面的SQL语句,可以把FDA中某个时间点之前产生的数据手工删除。
需要强调的是,对FDA保留期的修改、空间配额的修改,以及数据的手工删除,都是以SYS用户,或者具有“FLASHBACK ARCHIVE ADMINISTER”系统权限的用户身份完成的。
5.6数据库的FLASHBACK
利用FLASHBACK技术,还可以把整个数据库恢复到过去某个时刻,这种恢复不是利用数据库所做的备份,而是利用FLASHBACK日志。数据库的FLASHBACK主要用于取消最近一段时间内用户对数据库中的数据所进行的错误修改,或者恢复一个被误删除的表,或者恢复一个表被TRUNCATE命令删除的数据。
为了对数据库进行FLASHBACK,数据库需要满足以下三个条件:
数据库的日志模式必须是归档模式
必须配置了快速恢复区
开启了FLASHBACK日志
其中前两个条件在这里不再赘述,想必读者已经熟练掌握了两种结构的配置方法。FLASHBACK日志是一种特殊的文件,用于跟踪用户对数据库中数据所做得修改,这种文件位于快速恢复区中,而且不能位于其他存储路径中。
开启数据库的FLASHBACK日志的方法是,在数据库服务器处于MOUNT或者OPEN状态时,在SQL*Plus中执行下面的命令:
当这条命令执行成功时,在数据库的快速恢复区中将产生FLASHBACK日志文件。关闭数据库的FLASHBACK日志的方法是执行下面的命令:
如果希望了解数据库是否开启了FLASHBACK日志,可以执行下面的SQL语句,查询的结果是YES或NO。
FLASHBACK日志用于跟踪用户对表中数据的修改。当启用FLASHBACK日志时,在数据库的快速恢复区中将产生FLASHBACK日志文件。从这一时刻起,数据库中数据的变化将被记录在这些日志文件中。当关闭FLASHBACK日志,这些日志文件将被自动删除。
FLASHBACK日志产生的过程如图5-2所示。当数据库中有事务发生是,在SGA的重做日志缓存区中将产生重做日志,然后在数据库缓冲区缓存中将产生脏缓冲区。当事务修改数据库高速缓存中的缓冲区时,这个缓冲区中的内容将首先被拷贝到FLASHBACK缓冲区中。这样在数据库缓冲区缓存中将保留事务修改之后的数据,而在FLASHBACK缓冲区中则保留修改之前的数据。FLASHBACK缓冲区是共享池的一部分,它的大小可以通过查询动态性能视图V$SGASTAT获得。实例中的RVWR后台进程将把FLASHBACK缓冲区中的数据写入FLASHBACK日志文件。通过这样的方法,就可以把数据库中任何一行数据的连续变化保存在FLASHBACK日志文件中,利用数据库的FLASHBACK,就能够得到一行数据在过去某个时刻的样子。

由此可见,在FLASHBACK日志中记录的是数据块被修改之前的内容。当一个数据块中的数据不断地被修改时,在FLASHBACK日志中分别记录这个数据块在过去不同时刻的内容。如果希望把数据库恢复到过去某个时刻,那么那个时刻的数据块将从FLASHBACK日志被拷贝到原来的数据文件中。当然了,如果一个数据块没有被修改过,那么这个数据块在FLASHBACK日志中就不存在,也不需要进行恢复。数据库可以被恢复到过去的哪个时刻,取决于初始化参数DB_FLASHBACK_RETENTION_TARGET的设置。这个初始化参数的值以分钟为单位,用于指定数据块在FLASHBACK日志中保留的时间,超出保留期的数据块将从FLASHBACK日志中删除。这个参数的默认值是1440,即24小时。也就是说,利用FLASHBACK技术,默认可以把数据库从目前时刻恢复到过去的最近一天内的任何一个时刻。如果希望把数据库能够恢复到过去更远的某个时刻,那么需要把这个初始化参数的值设置的足够大。例如,下面的SQL语句用于把FLASHBACK日志的保留时间设置为3天:
如果数据库真的出现了需要恢复到过去某个时刻的情况,管理员最关心的情况往往是:数据库最远能够恢复到过去哪个时刻,或者哪个SCN。通过执行下面的查询语句,管理员可以知道数据库能够恢复到哪个SCN,以及哪个时间点。
数据库的FLASHBACK需要在数据库服务器处于MOUNT状态时进行。例如:
数据库的这种恢复往往不是一次就能完成的。在对数据库进行一次FLASHBACK恢复之后,可以把数据库以只读方式打开,然后查询数据库中的数据,确定数据库的恢复是否打到目标,如果没有,再把数据库服务器切换到MOUNT状态,再次执行FLASHBACK命令,把数据库恢复到过去更远的一个时刻,如此反复,直到数据库的恢复达到管理员设想的目标。以只读方式打开数据库的命令是:
如此经过多次FLASHBACK,如果确定数据库的恢复已经达到目标,那么吧数据库服务器切换到MOUNT状态,然后以下面的方式打开数据库:
需要注意的是,在下列情况下,数据库的FLASHBACK会遇到问题:
当控制文件被恢复或重新创建时
当表空间或数据文件被删除时
当数据文件的大小被减小时
当控制文件被恢复或重新创建时,FLASHBACK日志被关闭。如果某个表空间或者数据文件被删除,那么在对数据库进行FLASHBACK之后,虽然从数据字典视图中能够查询到这些表空间或数据文件的信息,但是数据文件并不真正存在,也就是说,利用FLASHBACK技术并不能重新创建被删除的数据文件。如果数据库中的某个数据文件被减小大小,则不能利用FLASHBACK吧数据库恢复到此前的时刻。

