oracle 还原点

正常还原点
创建正常还原点是给一个SCN或指定时间点指定一个还原点名称。因此,还原点实际上可以看作是SCN的标记或别名。在执行任何操作之前你可能想要撤消该操作,你可以创建一个正常还原点。控制文件会存储还原点名称与SCN,创建还原点可以消除提前记录SCN或在使用闪回时需要判断正确的SCN操作。

如果使用闪回或按时间点恢复,那么你可以使用还原点名称来代夫时间表达式或SCN。下面的命令支持使用还原点:
1.RMAN中的recover database与flashback database命令
2.SQL中的flashback table语句

正常的还原点是轻量级的。控制文件可以维护上千个正常还原点而不会影响数据库性能。正常还原点如果不手动删除,当执行恢复不再需要它们时会从控制文件中将其删除。
下面举例说明:
1.创建正常还原点

SQL> create restore point insert_point;

Restore point created.


SQL> set long 200
SQL> set linesize 200
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUA STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- --- ------------
INSERT_POINT            1187948 23-APR-15 05.18.21.000000000 PM                                                                 3 NO             0

SQL> alter system checkpoint;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1187983 2015-04-23 17:18:59

2.新创建一个表test:

SQL> create table test as select * from dba_objects;

Table created.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1188096 2015-04-23 17:20:20

3.将数据库闪回到创建正常还原点的时间点

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to scn 1187983;

Flashback complete.

SQL> alter database open read only;

Database altered.

4.检查表test是否存在,因为表test是在创建还原点之后所创建,当将数据库闪回到还原点后表test也就不存了:

SQL> select count(*) from test;
select count(*) from test
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

受保护还原点
像正常还原点一样,受保护的还原点也是恢复操作中所指定SCN的一个别名。唯一的区别是受保护的还原点除了显式删除之外是不会从控制文件中删除的。通常来说,使用正常还原点执行的命令也可以使用受保护还原点来作为SCN的别名,除了另有说明之外,使用正常还原点与受保护还原点的使用方法是一样的

即使生成闪回日志被禁用,受保护还原点确保你能使用闪回数据库将数据文件恢复到还原点SCN所对应的状态。如果启用闪回日志,那么受保护的还原点会强制保留将数据库闪回到在最早创建的受保护还原点后的任意SCN所需要的闪回日志。因此,如果启用了闪回日志,可以将数据库闪回到受保护还原点后的任意SCN而不只是单个SCN。如果禁用了闪回日志,那么在执行flashback database命令时不能直接指定受保护还原点与当前时间之间的SCN。然后可以先闪回到受保护还原点再恢复到受保护还原点与当前时间之前的SCN。

闪回数据库的命令是flashback database to PIT,PIT可以是SCN、时间或还原点,顾名思义,就是将整个数据库回退到指定的一个时间点,实际上是数据库不完全恢复的另一种方式。真正的不完全恢复需要消耗的时间与数据库的大小有密切联系,数据库越庞大,需要的时间就越多。

闪回数据库技术改变了这个窘境,其处理问题方式可以着重于如何将相对较短的时间内发生的变更去除,而不是如何还原足够旧的备份(很花时间了),再利用归档日志前滚至指定时间。.

闪回数据库需要使用两种日志:闪回日志和重做日志。其中重做日志已为大家所知,而闪回日志就像是重做日志的反作用力,闪回日志的记载正好与重做日志的记载相反。比如,逻辑上重做日志记录insert命令的重做记录,闪回日志就记录delete命令的重做记录(当然实际上没那么简单)。在发起闪回操作时,只要根据写入闪回日志的相反顺序,即后写先读的顺序,将闪回记录从闪回日志读出并执行其记录的变更就能够将数据库在时间轴上倒推。

闪回日志的保存路径一定是快速恢复区的子目录,保存的期限则由参数db_flashback_ retention_target控制(单位为分钟),凡是超出保存期限的闪回日志将会在快速恢复区空间紧张的时候被自动删除。比如,指定数据库保留两天的闪回日志和归档日志:

SQL> alter system set db_flashback_retention_target=2880;

System altered.

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

SQL> select flashback_on from v$database;

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

在确保启用了归档模式之后,使用以下命令可以启用闪回日志,即闪回数据库功能:

SQL> alter database flashback on;

Database altered.

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

SQL> select flashback_on from v$database;

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

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

受保护还原点与存储快照
在实践中,受保护还原点可以替代存储快照。存储快照通常被用来在执行危险操作之前来保护数据库,比如大范围的数据库更新或应用打补丁或升级。相对于创建快照或复制一个数据库进行测试操作来说,你可以在主库或物理备库中创建一个受保护还原点。

闪回数据库与受保护还原点日志
闪回数据库日志与受保护还原点调用改变之前的数据文件块镜像,flashback database命令可以使用这些镜像来将数据文件还原到之前的状态。正常闪回日志与受保护还原点日志最主要的差别是当闪回区出现空间压力时是否这些日志会被删除。这种差异会影响日志的空间使用和数据库性能。你的恢复目录部分决定了是否启用闪回日志或者还原点,或都两者都使用。当单独或一起使用这些功能时对空间使用和性能的影响是需要考虑的。

受保护还原点与闪回区空间之关的系
当创建,保留,覆盖与删除闪回区中的闪回日志时存在以下规则:
1.如果闪回区有足够空间,那么当需要满足闪回保留目标时生成闪回日志。
2.如果闪回日志过旧不再满足闪回保留目标,那么可以重用这些闪回日志。
3.如果数据库必须创建闪回日志并且闪回区已经被使用完或者没有磁盘空间,那么旧的闪回日志会被重用。重用旧的闪回日志会缩短闪回数据库窗口。如果因为空间压力问题有过多的闪回日志被重用,那么闪回保留目标可能不会被满足。
4.如果闪回区填满,那么概括闪回区规则当闪回区要为其它文件提供空间时会自动删除归档重做日志来回收空间。在这种情况下,flashback database命令需要使用的重做日志的任何闪回日志也会被删除。概括闪回区规则,当出现以下情况下文件使用的空间会被回收。
a.文件被报告为过期并且闪回数据库不需要该文件。例如该文件保留的时间超过了db_flashback_retention_target参数设置
b.文件已经备份磁带
5.如果为了满足受保护还原点闪回区中没有文件满足删除条件。因为,闪回日志和其它为了满足受保护还原点的其它文件,额外的为了满足备份保留策略所需要的文件都可能会造成闪回区被填满。

当创建受保护还原点可以考虑不完全启动闪回日志,但需要监控闪回区的可用空间。如果为了满足你的保留策略和受保护还原点,闪回区中没有满足删除条件的文件,如果遇到磁盘空间被填满的情况时,数据库会执行删除。

禁用闪回日志与受保护还原点
假设在数据库禁用闪回日志的情况下创建了受保护还原点。在这种情况下,在受保护还原点创建时第一次被修改的数据文件块,数据库会将被修改前的数据块镜像存储在闪回日志中。因此闪回日志保留了每一个被修改的数据块在创建受保护还原点时的内容。后面对相同数据块的修改将不会被捕获除非在数据块最后被之前之前又创建了一个受保护还原点。

这种记录日志方法有以下重要的结果:
1.flashback database可以通过使用数据块镜像重新构造在创建受保护还原点时数据文件中的内容。
2.对于反复修改相同的数据,相比对正常的闪回日志受保护还原点所要使用的空间更少,因为每一个被修改的数据块只会被记录一次。应用程序有较少插入操作可能从节省磁盘空间中受益。当应用程序有大量插入或批量插入操作时这种优势就没有了。受保护还原点的日志开锁在禁用闪回日志时是很小的。

假如你的主要目标是要能将数据库恢复到受保护还原点所创建的时间点,那么在这种情况下,禁用闪回日志而只使用受保护还原点更有效。例如假设要对数据库执行升级,可以在启动升级之前创建一个受保护还原点,如果升级失败,那么可以执行flashback database来恢复数据库。

启用闪回日志与受保护还原点
如果启用闪回日志并定义一个或多个受保护还原点,那么数据库会执行正常的闪回日志操作。在这种情况下,闪回区将会保留将数据库恢复到受保护还原点与当前时间之间任何时间点所需要的所有闪回日志。闪回日志如果满足受保护还原点的要求在出现空间压力时是不会被删除的。启用闪回日志会占用一些性能开销。依赖于数据库的工作负载,可能会对闪回区造成极大的空间压力。因此应该要监控闪回区的空间使用情况。

使用闪回数据库与受保护还原点的条件
为了能成功执行闪回数据库和受保护还原点操作,必须首先设置一些关键的数据库选项。在启用闪回数据库之前进行以下数据库设置:
1.你的数据库必须运行在archivelog模式下,因为闪回数据库需要使用归档重做日志。
2.必须设置了闪回区,因为闪回日志只能存储在闪回区中。
3.对于RAC数据库,闪回区必须是集群文件系统或ASM

为了使用受保护还原点,数据库必须满足compatible参数必须设置为10.2.0或更高版本。但在使用正常还原点之前没有任何特定要求。

下面是举例来说明:
在启用闪回日志的情况下,创建受保护还原点
1.创建受保护还原点

SQL> select flashback_on from v$database;

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

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1187919 2015-04-23 17:17:26

SQL> create restore point  create_point guarantee flashback database;

Restore point created.

SQL> set long 200
SQL> set linesize 200
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUA STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- --- ------------
CREATE_POINT            1187948 23-APR-15 05.18.21.000000000 PM                                                                 3 YES     52428800

SQL> alter system checkpoint;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1187983 2015-04-23 17:18:59

2.新建表test

SQL> create table test as select * from dba_objects;

Table created.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1188096 2015-04-23 17:20:20

因为我们启用了闪回日志,所以可以将数据库闪回到受保护还原点(create_point)SCN:1187948与当前时间2015-04-23 17:20:20 SCN:1188096之间的任意SCN所对应的状态。那么我们将数据库闪回到SCN为1187983,这时表test是还没有创建的。

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to scn 1187983;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from test;
select count(*) from test
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

在确认之前不要以resetlogs选项open数据库,这样可以多次执行闪回数据库操作,也可以撤消闪回数据库操作,下面是撤消闪回数据库操作是通过执行完全恢复来实现的:

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> recover database;
Media recovery complete.
SQL> alter database open;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
     86741

下面我们在禁用闪回日志的情况下执行闪回数据库操作:
1.禁用闪回日志并创建受保护还原点

SQL> select flashback_on from v$database;

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

SQL> alter database flashback off;

Database altered.

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.

SQL> create restore point delete_point guarantee flashback database;


Restore point created.

SQL> alter database open;

Database altered.


SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
RESTORE POINT ONLY



SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUA STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- --- ------------
DELETE_POINT            1192464 23-APR-15 07.36.16.000000000 PM                                                                 3 YES     52428800

SQL> alter system switch logfile;

System altered.

SQL> alter system checkpoint;

System altered.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1192860 2015-04-23 19:37:51

2.删除表test

SQL> delete from test;

86743 rows deleted.

SQL> commit;

Commit complete.

SQL> select count(*) from test;

  COUNT(*)
----------
         0

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1193268 2015-04-23 19:38:57

现在我们来测试看在禁用闪回日志的情况下能不能将数据库闪回到受保护还原点(delete_point)scn:1192464与当前时间SCN:1193268之间的任意SCN,这里我们闪回到SCN:1192860,这里表test的记录还没有被删除

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to scn 1192860;
flashback database to scn 1192860
*
ERROR at line 1:
ORA-38726: Flashback database logging is not on.

错误提示已经说明了没有闪回日志,所以不能将数据库闪回到受保护还原点与当前时间之间的任意SCN。

下面将表test闪回到受保护还原点SCN:1192464

SQL> flashback database to restore point delete_point;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
     86743

从执行结果可知,已经恢复到受保护还原点所对应的状态,表test的数据恢复回来了。

从上面的执行结果可以看到在没有启用闪回日志的情况可以将数据库闪回到受保护还原点。如果要想在没有启用闪回日志的情况下将数据库闪回到受保护还原点与当前时间点之间的SCN:1192860,可以先将数据库闪加到受保护还原点,再执行恢复将数据库恢复到SCN:1192860。

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to restore point delete_point;

Flashback complete.

SQL> alter  session  set  nls_date_format  =  'yyyy-mm-dd  hh24:mi:ss';

Session altered.

因为SCN:1192860,对应的时间就是2015-04-23 19:37:51,这里如果直接用SCN:1192860执行恢复会报以下错误 :

SQL> recover database until scn 1192860;
ORA-00277: illegal option to the UNTIL recovery flag SCN



SQL> recover database until time '2015-04-23 19:37:51';
Media recovery complete.
SQL> alter database open read only;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
     86743

从执行结果可知,已经恢复到受保护还原点所对应的状态,表test的数据恢复回来了。

发表评论

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