还原点和闪回数据库
闪回数据库和还原点是两种与数据恢复相关的功能,它们用来替代按时间点恢复来撤消对数据库的改变。闪回数据库能让你将整个数据库进行回滚,使用指定时间窗口来撤消对数据库的改变。这类似于数据库的按时间点恢复。
还原点提供了与闪回数据库相关的能力它是另一种恢复操作。受保护的还原点,在特定的情况下,提供了闪回数据库完整的功能,允许你选择一个SCN并强制要求闪回数据库对这个SCN是可用的。
还原点和闪回数据库可以单独使用也可以一起使用。在这两种情况下,RMAN的flashback database命令或者flashback database语句实际上将数据库还原到一个指定的SCN所对应的状态,例如:
flashback database to restore point 'before_upgrade';
flashback databasae to scn 202381;
闪回数据库
闪回数据库,可以通过RMAN的flashback database命令和SQL*Plus的flashback database语句来完成。能够将数据库快速的从逻辑数据错误或用户错误中进行恢复。
它类似于传统的按时间点恢复一样,能够将数据库还原到过去某个时间点的状态。闪回数据库比按时间点恢复来快很多,因为闪回数据库不需要从备份中还原数据文件和从归档重做日志文件中应用相应的改变。
闪回数据库能被用来撤消对数据库不需要的改变。而数据文件完好无损。这包括将数据库还原到之前数据库化身对应的状态。这将撤消open resetlogs操作。
闪回数据库使用它自己的日志机制,它会在闪回区中创建闪回日志。只有在闪回日志是可用时才能使用闪回数据库。因此如果要使用这个功能就必须对数据库进行设置让其创建相关的闪回日志。
为了启用闪回数据库,需要设置闪回区和设置闪回保留策略目标来指定能够将数据库还原到过去某个时间点。
从启用闪回数据库开始,在定期的时间间隔内,数据库将会把每个数据文件中发生改变的数据块复制到闪回日志中。这些数据块镜像以后可用来重构数据文件的内容。
当数据库使用闪回数据库将数据库还原到过去的某些目标时间点时,自从还原时间点开始发生改变的每个数据块将从闪回日志中复制目标时间点对应的数据块。然后应用自数据块被复制到闪回日志时间点开始的重做日志。
注意:在整个时间跨度对于闪回日志相应的重做日志必须都是可用的。
闪回数据库窗口
在一定范围SCN之间有足够的闪回日志数据来支持flashback database命令这就叫闪回数据库窗口。如果闪回区的空间太小,通过设置保留策略当为了给新生成的闪回日志文件分配空间可能会删除过期的闪回日志。根据闪回区的大小,必须被保留的其它备份和需要的闪回日志数据,这可能造成闪回数据库窗口比闪回保留目标的时间要短。
注意:闪回保留目标是一个目标,不是一个绝对受保护能执行闪回数据库的目标。
如果闪回区的大小不能存储为了满足保留策略所需要的闪回日志和其它文件,比如归档重做日志和其它备份。那么为了存储其它文件从最早的SCN开始的闪回日志可能因为空间问题而被删除。
闪回数据库窗口不能对可用闪回日志中的最早SCN进行向前的扩展。闪回日志不能备份到闪回区之外的目录。因此为了增加可用的闪回日志来满足闪回数据窗口,所以要给闪回区可用的最大存储空间。
这里也有一些操作比如删除表空间或收缩数据文件,这些是不能通过闪回数据进行撤消的。在这些操作执行之后,闪回窗口就会立即从这些操作之后重新计算。
如果因为闪回数据库窗口不满足flashback database的要求,按时间点恢复可以最大程度的完成相似的任务。
使用受保护的还原点是唯一能保证你使用闪回数据库能将数据库还原点指定时间点或闪回窗口的方法。
正常还原点
通过指定时间点或SCN来作为还原点的名称来创建还原点,在执行有restore point子句的命令时使用这种标签或别名来指定SCN。
如果可能对你执行的任何操作执行撤消,那么可以创建一个正常的还原点。还原点名称和SCN会被记录到控制文件中。如果后面需要使用闪回数据库,闪回表或按时间点恢复,可以使用还原点名称来指示这个目标时间来代替一个时间表达式或SCN。在可能被撤消的操作执行前定义一个正常的还原点来消除需要手工记录SCN的需要,或在执行闪回查询时查找正确的SCN的需要。
正常还原点是非常轻量级的。控制文件可以包含上千个正常还原点而不会影响数据库的性能。正常还原点最终从控制文件中移除,而不是手工删除,那么它们将不再需要进行维护。
支持还原点的命令
在下面的上下文中还原点用来指定目标SCN:
1.RMAN的recover database和flashback database命令
2.SQL*Plus中的flashback database语句
注意:通常来说,受保护的还原点可以在任何使用正常还原点的操作中作为SCN的别名来使用。除非另有说明,否则正常还原点的使用方法也适用于受保护的还原点。
受保护的还原点
与正常还原点一样,受保护的还原点在恢复操作中也能作为SCN的别名。然而,它们也对闪回数据库提供了特定的功能。
在一个特定的SCN创建一个受保护的还原点可以强制通过执行闪回数据库能将数据库还原到这个SCN所处的状态,即使数据库没有启用闪回日志也能保证。如果闪回日志被启用,创建受保护的还原点强制闪回日志保留策略能满足将数据库闪回到创建受保护还原点后的任意时间点。
受保护还原点能用于将整个数据库还原到一个已知的状态良好的时间点,前提条件是闪回区有足够的空间来存储闪回日志。使用闪回数据库,受nologging操作影响的直接路径插入也能使用受保护的还原点来进行还原操作。
受保护的还原点替代存储快照
在实践中,受保护的还原点能够有效地替代存储快照,它通常用来在一些危险操作之前来保护数据库,比如大范围的更新,应用程序打补丁,或者升级。与创建快照或复制数据库再进行这些操作的相比,可以创建一个受保护的还原点然后执行这些危险操作,只要确只保留必要的闪回日志就行。
闪回数据库和受保护还原点的日志
闪回数据库和受保护还原点的日志是基于在改变应用前被捕获的数据块镜像,因此这些镜像能用来在执行flashback database命令时将数据文件还原到之前时间点所对应的状态。
正常闪回日志和受保护还原点的日志的主要差别就是日志是否会因为闪回区可用空间的压力而被删除。这些差别影响日志可用空间的使用和数据库的性能。
是否对闪回数据库,受保护的还原点启用日志都依赖于你的恢复目标,以及对性能的影响和这些功能对空间的使用。
受保护还原点和闪回区的空间使用
当创建一个受保护的还原点,不管有没有启用完全闪回数据库日志,你都必须监控闪回区可用空间的状态。如果为了满足受保护的还原点而需要的文件是不会满足从闪回区删除的条件。因此,闪回日志的保留策略和为了满足受保护的还的所需要的其它文件,就是满足备份保留策略一样,可能会让闪回区完全被使用掉。
注意:当因为保留策略不能删除任何文件而又遇到空间被使用完的情况时,在许多情况下数据库会被hang住。
闪回日志禁用时受保护还原点日志
如果当闪回数据库日志禁用时创建了受保护的还原点,那么,在受保护还原点创建之后第一次数据文件的数据块更改,在更改之前数据块的镜像会被存储到闪回日志中。闪回日志因此能还原被修改的数据块回到受保护还原点创建时的状态。然而后续对相同数据块的修改不会被记录在日志中,除非在这些修改之前创建另外的受保护还原点。
这种方式的日志有以下重要的影响:
1.可用的块镜像可以在使用flashback database时将数据文件的内容还原到受保护还原点所对应的状态但不能使用flashback database将数据库还原到受保护还原点与当前时间之间的某个时间点。只有当对闪回数据库启用日志才行。如果你需要将数据库还原到一个中间时间点,你只能使用数据库按时间点恢复。
2.因为每个数据块的改变只会被记录一次,当闪回日志被禁用时受保护还原点的日志所使用的空间要比正常闪回日志所使用的空间小。可以按天或周来维护受保护的还原点而不必关注当闪回数据库启用后闪回日志的增长。记录受保护的还原点的日志所产生的性能在禁用闪回数据库日志的情况下影响是很小的。
如果你主要是将数据库还原到受保护还原点所创建的时间点,那么通常关闭闪回数据库日志只使用受保护还原点更有效。例如当正计划在生产数据库服务器上对应用进行升级,在升级开始之前创建一个受保护的还原点,如果升级过程最终失败,可以使用flashback database撤消改变,而不用从备份中进行还原。
使用受保护还原点的闪回数据库日志
如果闪回数据库被启用并且定义了一个或多个受保护的还原点,那么数据库执行正常闪回日志时,会对性能有些影响。根据数据库的工作模式闪回区可能会产生较大的空间压力。然而,不像正常的闪回数据库日志,闪回区总是要保留为了使用flashback database将数据库还原到最早的当前受保护还原点时所需要的闪回日志。闪回日志如果要求满足受保护还原点恢复就不会因为空间压力而被删除。
在这种情况下对于flashback database可以将数据库恢复到闪回窗口中的任意时间点和特定的受保护的还原点所对应的状态,但你必须监控制闪回区的空间使用。
使用正常和受保护还原点
使用受保护还原点的要求
为了支持使用受保护还原点,数据库必须满足下面的要求:
1.compatible参数必须设置为10.2或更高版本
2.数据库必须运行在归档模式下。flashback database操作将数据库还原到受保护的还原点时要求使用一直到还原点以来的归档重做日志。
3.必须设置闪回区.受保护的还原点使用了一种类似于闪回日志的机制,Oracle必须在闪回区存储所要使用的日志
4.如果没有启用闪回数据库,当创建第一个受保护的还原点心(或者如果所有之前创建的受保护的还原点已经被删除后)那么数据库必须处于mount状态,不能是open状态。
注意:在使用正常的还原点没有特殊的要求。
创建正常和受保护还原点
为了创建正常或受保护还原点,使用create restore point语句,并给还原点提供了一个名称并指定它是受保护还原点还是正常还原点(默认值)。
在创建还原点时数据库可以处于open或mount状态。如果是mount状态,那么必须已经完全关闭(物理备库除外)。
下面的命令用来创建一个正常还原点
SQL> create restore point before_truncate;
Restore point created.
下面的命令用来创建一个受保护还原点
SQL> create restore point before_truncate guarantee flashback database;
create restore point before_truncate guarantee flashback database
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'BEFORE_TRUNCATE'.
ORA-38787: Creating the first guaranteed restore point requires mount mode when flashback database is off.
根据错误提示可以看出当数据库没有启用flashback database时想要创建受保护的还原点只能在mount状态下创建。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 327155712 bytes
Fixed Size 1273516 bytes
Variable Size 138412372 bytes
Database Buffers 184549376 bytes
Redo Buffers 2920448 bytes
Database mounted.
SQL> create restore point before_truncate guarantee flashback database;
Restore point created.
SQL> col name for a20
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
2 GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
3 FROM V$RESTORE_POINT;
NAME SCN TIME DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE STORAGE_SIZE
-------------------- ---------- ----------------------------------- --------------------- ---------------------------- ------------
BEFORE_TRUNCATE 2849315 27-JAN-15 02.40.56.000000000 PM 2 YES 8192000
显示还原点
为了查看当前定义的还原点,可以使用v$restore_point控制文件视图:
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
FROM V$RESTORE_POINT;
SQL> col name for a20
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
2 GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
3 FROM V$RESTORE_POINT;
NAME SCN TIME DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE STORAGE_SIZE
-------------------- ---------- ----------------------------------- --------------------- ---------------------------- ------------
BEFORE_TRUNCATE 2849315 27-JAN-15 02.40.56.000000000 PM 2 YES 8192000
可以看到每个还原点的名称,SCN,时间和还原点创建时的数据库对应化身的序列号,是正常还原点还是受保护还原点,以及为了提供足够的信息来支持闪回数据库操作该还原点在闪回区所使用的空间大小。
可以使用只查询受保护的还原点信息:
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
FROM V$RESTORE_POINT
WHERE GUARANTEE_FLASHBACK_DATABASE='YES';
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
2 GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
3 FROM V$RESTORE_POINT
4 WHERE GUARANTEE_FLASHBACK_DATABASE='YES';
NAME SCN TIME DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- ------------------------------ ------------
BEFORE_TRUNCATE 2849315 27-JAN-15 02.40.56.000000000 PM 2 YES 8192000
对于正常还原点,storage_size为0。对于受保护的还原点storage_size指示了为了保证能对还原点执行flashback database操作所要保留日志所消耗的闪回区的空间大小。
下面的正常还原点的storage_size确实为0:
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
2 GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
3 FROM V$RESTORE_POINT
4 WHERE GUARANTEE_FLASHBACK_DATABASE='YES';
NAME SCN TIME DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- ------------------------------ ------------
BEFORE_TRUNCATE 2849315 27-JAN-15 02.40.56.000000000 PM 2 YES 8192000
SQL> select count(*) from tt;
COUNT(*)
----------
51281
SQL> truncate table tt;
Table truncated.
SQL> select count(*) from tt;
COUNT(*)
----------
0
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 327155712 bytes
Fixed Size 1273516 bytes
Variable Size 138412372 bytes
Database Buffers 184549376 bytes
Redo Buffers 2920448 bytes
Database mounted.
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY
SQL> flashback database to restore point before_truncate;
Flashback complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
Database altered.
SQL> select count(*) from tt;
COUNT(*)
----------
51281