还原点和闪回数据库

闪回数据库和还原点是两种与数据恢复相关的功能,它们用来替代按时间点恢复来撤消对数据库的改变。闪回数据库能让你将整个数据库进行回滚,使用指定时间窗口来撤消对数据库的改变。这类似于数据库的按时间点恢复。

还原点提供了与闪回数据库相关的能力它是另一种恢复操作。受保护的还原点,在特定的情况下,提供了闪回数据库完整的功能,允许你选择一个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

删除还原点
当不再需要已经存在的还原点时或者想用已经存在的还原点名称来创建一个新的还原点时就可以删除该还原点,下面使用dorp restore point语句还删除还原点:

SQL> drop restore point before_truncate;

Restore point dropped.

drop restore point用于删除正常还原点受保护还原点。

注意:正常还原不管有没有被显式删除最终都会从控制文件中删除。控制文件中还原点保留规则如下:
1.在控制文件中总是会保留最近的2048个还原点
2.只有还原点比比control_file_record_keep_time值所保留的还原点更新,而不管定义还原点的个数

正常还原点只要不满足上述条件就会从控制文件中删除。
受保护还原点从不会因为自动地从控制文件中删除,除非显式删除它们。

监控受保护还原点的空间使用情况
当在数据库中定义受保护还原点后,应该监控为了满足还原点而被存储的相关文件在闪回区中的空间使用情况。可以使用下面的查询语句查看storage_size列来判断每个受保护还原点相关文件的大小。

SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
FROM V$RESTORE_POINT;

为了查看闪回区的使用大小可以查询v$recovery_file_dest和v$flash_recovery_area_usage视图:

SQL> select * from v$recovery_file_dest;

NAME                                                                             SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------------------------------------------------------------------- ----------- ---------- ----------------- ---------------
/u01/app/oracle/flash_recovery_area                                               2147483648    9699328           9699328               1
SQL> select * from v$flash_recovery_area_usage;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE                   0                         0               0
ONLINELOG                     0                         0               0
ARCHIVELOG                    0                         0               0
BACKUPPIECE                   0                         0               0
IMAGECOPY                  0.45                      0.45               1
FLASHBACKLOG                  0                         0               0

Oracle闪回数据库的设置与维护

闪回数据库的限制
因为阀回数据库是用来撤消某一时刻对数据文件所做的改变,因此它有以下限制:
1.闪回数据库只能撤消对数据文件的改变。它不能用于修复介质故障或者对意外删除的数据文件进行恢复。

2.不能使用闪回数据库来撤消对数据文件的收缩操作

3.如果数据库的控制文件从备份中进行了还原或者重新创建了控制文件,那么之前所累积的闪回日志信息将会被废弃。不能使用flashback database将数据库还原到还原控制文件或重新创建控制文件之前的某个时间点。

4.使用闪回数据库还原到某个时间点时,如果在这个时间点数据库正在执行nologging操作,那么在闪回数据库完成之后,受nologging操作影响的对象和数据文件可能存在坏块。例如,如果在2015-01-27的9:00到9:15正在以nologging模式执行直接路径插入操作,而后来你需要使用闪回数据库将数据库还原到2015-01-27的9:07分所对应的状态,那么在闪回数据库操作完成之后,由直接路径插入操作相关的对象和数据文件可有坏块。

如果可能要避免闪回数据库将数据库还原有nologging操作的时间点。也可以在任何nologging操作之后为了确保能恢复到该操作之后某个时间点可以执行全备或增量备份。如果你期望使用闪回数据库将数据库还原到某个操作执行的时间点,比如直接路径插入,可以考虑在logging模式下执行这些操作。

启用闪回数据库的条件
启用闪回数据库需要满足以下条件:
1.数据库必须运行在archivelog模式下,因为在执行闪回数据库操作时需要归档重做日志

2.必须设置闪回区,因为闪回日志只能存储在闪回区中

3.对于RAC环境中的数据库,闪回区必须是可以共享访问的集簇文件系统或者ASM

启用闪回日志
为了对闪回数据库启用闪回日志,要设置db_flashback_retention_target初始化参数并执行alter database flashback on语句。下面是启用闪回日志的过程:
1.确保数据库处于mount状态而不是open状态。例如:

SQL> shutdown immediate

SQL> startup mount

2.可选操作,可以将db_flashback_retention_target参数的值设置为你所期待的闪回窗口以分钟为单位

SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=4320; # 3 days

db_flashback_retention_target的默认值是一天(1440分钟)

3.使用v$database.FLASHBACK_ON可以查看闪回日志是否已启用,现在是“NO”,表示尚未启用:

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO
4.对整个数据库启用闪回数据库功能:
SQL> ALTER DATABASE FLASHBACK ON;

从此,在快速恢复区的flashback子目录下将会出现扩展名为.flb的文件,它们就是闪回日志。

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

闪回数据库命令的语法很简单:在进入MOUNT状态后执行flashback database to scn xxx 或flashback database to timestamp xxx 。

一次闪回数据库操作可能由两种方式进行。比如,令当前时间点为T_C,数据库闪回的目标时间点为T_1(T_C大于T_1),使用的命令为“flashback database to timestamp T_1”,该命令会自动选择以下两种方式的其中一个进行闪回操作。

方式一:

(1)第一阶段:利用闪回日志将数据库从T_C回退至较T_1更旧的某一时刻T_2。
(2)第二阶段:利用重做日志将数据库从T_2前滚至T_1。

方式二:

(1)第一阶段:确定一个比T_1更旧的某一时刻T_2。
(2)第二阶段:对于闪回日志根本无法恢复的对象或数据,把当初此类对象第一次产生的时间为T_3,首先利用T_3到T_2的重做日志将其重新产生并恢复。
(3)第三阶段:利用闪回日志将数据库从T_C回退至T_2。
(4)第四阶段:利用重做日志将数据库从T_2前滚至T_1(途中经过T_2)。

究竟采用哪种方式执行取决于目标时间点T_1与当前时间点T_C之间执行过什么命令,如果是在闪回日志中有对应反向操作的命令(如insert、update、delete)就采用方式一;如果在闪回日志中找不到对应反向操作的命令(比如:truncate命令)则采用方式二。方式二较方式一可能会索要更多的重做日志才可以完成闪回。

比如,若有任何对象发生过截断操作(truncate table xxx),那么方式二中的T3就是当初创建被截断的表的时刻,这意味着整个闪回操作需要从T3至T1的所有的重做日志,否则闪回数据库不可能成功。这样,可能会发生这样的问题:即使只是在10秒前错误地截断了一张表,现需要回到10秒之前,但是闪回数据库时flashback database命令向管理员索要几年前的归档日志!

如果T_1和T_C之间只是发生过类似update那样的DML,若是想回到10秒前,那么会采用方式一,差不多只是需要10秒的闪回日志和归档日志,闪回会很快,这也是闪回的真谛。

无论哪种方式,都可能遇到重做日志不充分的问题,下面来模拟这种情况:

1.检查数据库是否启用了闪回数据库,从下面的查询结果可知当前数据库没有启用闪回数据库

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

2.创建一个测试表,该表共有51282条记录

SQL> create table jy as select * from dba_objects;

Table created.

SQL> select count(*) from jy;

  COUNT(*)
----------
     51282

3.查询一下当前数据库的SCN号

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
    2879920

4.重启数据库并启用闪回数据库

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> alter database flashback on;

Database altered.

SQL> alter database open;

Database altered.

5.向表jy中增加一倍的记录

SQL> insert into jy select * from jy;

51282 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from jy;

  COUNT(*)
----------
    102564

6.查询当前数据库的SCN号

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
    2880218

7.执行闪回数据库,将表jy的记录恢复到只有51282条记录

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> flashback database to scn 2879920;
flashback database to scn 2879920
*
ERROR at line 1:
ORA-38754: FLASHBACK DATABASE not started; required redo log is not available
ORA-38762: redo logs needed for SCN 2879811 to SCN 2879920
ORA-38761: redo log sequence 19 in thread 1, incarnation 2 could not be accessed

也可能遇到闪回日志不够的问题,报错信息如下所示:

SQL> flashback database to scn 2879920;
flashback database to scn 2879920
*
ERROR at line 1:
ORA-38729: Not enough flashback database log data to do FLASHBACK.

这里之所以不能闪回到SCN为2879920的时间点,是因为那时数据库没有启用闪回。

8.查看一下v$flashback_database_log视图,检查最远可以回到哪里

SQL> select oldest_flashback_scn,
  2  to_char(oldest_flashback_time,'YYYY-MM-DD HH24:MI:SS')
  3  from v$flashback_database_log;

OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FLAS
-------------------- -------------------
             2880101 2015-01-27 23:32:18

从查询结果可以看到数据库最远可以闪回到SCN号为2880101的时间点

9.在MOUNT状态发起闪回操作后,管理员可以反复地以任何顺序执行这3个命令:flashback database to xxx,recover database和alter database open read only

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> flashback database to scn 2880210;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from jy;

  COUNT(*)
----------
    102564

从上述结果可以看到现在将数据库闪回到SCN为2880210的时间点,表jy的记录数为102564不是我们期待的51282

10.再次将数据库闪回到SCN号为2880150的时间点

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.


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> flashback database to scn 2880150;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from jy;

  COUNT(*)
----------
     51282

从上述结果可以看到将数据库闪回到SCN为2880150的时间点时表jy的记录为51282达到我们期待的结果。

11.完成闪回数据库的最后操作。

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> alter database open resetlogs;

Database altered.

SQL>  select count(*) from jy;

  COUNT(*)
----------
     51282


默认情况下对于所有永久表空间都会生成闪回日志。你也可以通过对指定的表空间来禁用闪回日志来减少开销:
SQL> ALTER TABLESPACE users FLASHBACK OFF;

可以使用下面的命令对表空间重新启用闪回日志:
SQL>alter tablespace users flashback on;

注意如果对一个表空间禁用了闪回数据库,那么在执行flashback database之前要确保该表空间的数据文件处于脱机状态。

对整个数据库禁用闪回日志:
SQL>alter database flashback off;

发表评论

电子邮件地址不会被公开。