简介 数据库
Flashback数据库是一种时点(PIT)数据库恢复的方式。这种不彻底的恢复策略能够用于恢复因为人为错误致使逻辑损坏的数据库。在10g中引入以后,它的设计目标就是以缩减恢复时间而得到最大的可用性。这篇文章将会探索Flashback数据库,将其与传统的恢复方法相比较,而且演示一下如何配置和执行重现恢复。
缓存
传统恢复vs.重现数据库服务器
致使停机的第一个缘由就是人为错误致使的逻辑损坏,这一点已经被普遍认可。关于逻辑损坏的例子,从用户不正确的更新数据和截取表,到批处理任务错误运行2次或者打乱顺序,比比皆是。结果都是相同的——数据库损坏,而且范围广阔且难以辨认。Oracle经过了两种策略来将数据库返回到先前的某个时点上:传统恢复和重现数据库。oracle
不彻底的恢复是数据库恢复到先前某个状态的恢复。这个过程有两个步骤:从新存储数据,并向前恢复事务活动到某个你想要的时间。传统恢复和重现数据库之间的主要区别就是,传统恢复从从新存储全部的数据文件开始,而后才恢复到某个想要的恢复时间,而重现数据库则是在损坏以后经过从新存储被改变的块来向后操做。从这个角度考虑问题的话,让咱们想一想在一个10TB的数据库上,有1MB的数据损坏了。传统的恢复从开始从新存储10TB的应用程序数据开始,而重现数据库则是取回这1MB的应用程序数据,从而达到损坏前的那个点。如今咱们分别看看每一种策略。app
传统恢复ide
在Oracle 10g以前,将因为人为错误致使问题的数据库恢复到先前某个时点的惟一选项就是传统恢复。这个策略包括了从备份中取出并从新存储全部的数据库数据文件,而后再执行向前恢复到某个想要的时间点。媒体恢复能够基于服务器(RMAN),也能够基于用户(操做系统工具)。函数
下图演示了这个复杂的、成本高昂的、效率极低的多步骤恢复策略。工具
如今咱们看一下用户执行了SQL而且损坏了数据库的状况。用户通知了命令中心而且报告了错误。系统分析师经过与公司不一样部门的另一些人协商管理此次事件。恢复经过从备份中从新存储全部的数据文件而且向前回滚redo日志到但愿的时间点而完成。恢复时间与数据库的规模成正比,而不是须要恢复的更改的数量。这就意味着恢复时间(MTTR)实际上随着数据库的规模增加而不断增长。性能
重现数据库测试
在Oracle 10g中,一项新的重现技术特性,称为Flashback Database(重现数据库)的,做为传统恢复的替代品引入了。重现数据库可让你快速恢复整个数据库到先前的某个时间点,而不须要从备份中从新存储数据库。在数据库中常常被描述为倒转按钮,它只是将那些被修改的数据块恢复到你但愿的恢复时间以前。而后应用Redo更改记录来达到但愿的恢复时间点。这个被修改的数据块就叫作重现日志。
重现数据库提供了相对于传统数据库很是明显的优点。对于分析型数据库则没有这么明显的优点。在数据仓库中,块的操做一般是以不记录日志的模式执行的。在重现数据库中,只要数据库运行的是 归档日志模式,它就能够返回到块操做以前的某个状态,由于被修改的块能够经过恢复而撤销执行的操做。
注意:虽然重现数据库是集成到数据库中的,可是它在Oracle的 Express Edition (XE)中是不可用的。
这里咱们看一下用户执行了SQL而且损坏了数据库的状况。用户通知了应用程序数据库管理员,他执行了重现数据库命令,数据库自动恢复到损坏以前的某个点。重现数据库很快,使由于它只针对被修改的数据进行操做。重现的时间与犯错误的数量有关,而与数据库的规模无关。
配置重现数据库
如下的例子演示了命令行配置。这也能够用企业管理器来完成。
在咱们配置重现数据库以前,咱们须要照顾如下一些先决条件。
Flash Recovery Area
首先,咱们须要配置一个Flash Recovery Area (FRA)。在10g中,这是个新东西,FRA只不过是一个恢复相关文件的磁盘定位。对于重现数据库,一个新的后台进程,名为Recovery Writer (RVWR),在来自SGA的数据库重现缓存的映像以前,阶段性地写入磁盘,做为FRA中的重现日志。重现日志是在FRA中由Oracle数据库自动管理的。
重现日志的成本是以空间和性能来衡量的。空间是数据库写密度的一个因素。一个24小时运行的,以5%的数据块写入做为重现日志的方式必然会致使磁盘总体空间的5%的增加。由于块是以规律的间隔写入的,而不是事务的一部分,因此对性能的影响是能够忽略不计的。
要配置FRA,你须要设置以下的初始化参数:
alter system set db_recovery_file_dest=
'C:\oracle\product\10.2.0\flash_recovery_area' scope=both;
alter system set db_recovery_file_dest_size = 10G scope=both;
归档
接下来,咱们须要配置归档。再一次,咱们须要使用FRA做为咱们的文档日志目的地。与传统恢复相似,重现数据库须要存档以向前恢复提交的事务,在重现日志从新存储了但愿时间以前的时点以后。
要最小化配置存档,执行以下的命令,按照顺序:
SQL> startup mount
ORACLE instance started.
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 2
Next log sequence to archive 4
Current log sequence 4
重现数据库
配置了这些先决条件以后,咱们准备好配置重现数据库了。
首先,咱们须要设置重现保持目(db_flashback_retention_target)标。这个初始化参数,以分钟来计算,表明咱们能够把数据库返回到多长时间以前。它的值决定了FRA中重现日志的数量和时间段。下面咱们的例子将其设置为24小时。要理解这个保持时间段并非保证是很是重要的。若是FRA须要空间,重现日志将会自动删除目标保持时间点以前的记录。稍后咱们会看到,咱们保证重现日志的方式在FRA中进行维护。有了保持时间段设置,重现数据库能够激活。
SQL> startup mount;
ORACLE instance started.
Database mounted.
SQL> alter system set db_flashback_retention_target = 1440 scope=both;
System altered.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
重现数据库示例
下面的例子用于演示,它想要描述单个表以外的损坏。
45. 监控FRA
46. select name,space_limit,space_used, space_reclaimable from v$recovery_file_dest;
47.
48. NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE
49. --------------------------------------------
50. C:\oracle\product\10.2.0/flash_recovery_area 2147483648 166646272 0
51.
52.
53. select * from v$flash_recovery_area_usage;
54.
55. FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
56. ------------ ------------------ ------------------------- ---------------
57. CONTROLFILE 0 0 0
58. ONLINELOG 0 0 0
59. ARCHIVELOG 7.38 0 29
60. BACKUPPIECE 0 0 0
61. IMAGECOPY 0 0 0
62. FLASHBACKLOG .38 0 1
63. 在表的映像以前显示
64. select c1, ora_rowscn from my_table;
65.
66. C1 ORA_ROWSCN
67. ---------- ----------
68. 1 1320954
69. 判断数据库的时间点
在10gR1中,你有两种选择来捕捉你的数据库的PIT:时间戳和系统修改号码(SCN)。这个信息是做为重现操做的一部分要求的。捕捉到提交的SCN或者稍后的很是重要,而不是数据管理语言操做。Oracle提供了一种比较笨拙的方式来捕捉提交的SCN,经过userenv('commitscn')函数。咱们的示例在发生损坏的数据管理语言操做以前捕捉到了这个信息。
select current_scn from v$database;
CURRENT_SCN
-----------
1321065
or
select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')
"Recover Time" from v$database;
Recover Time
-------------------
2006-09-23:20:13:48
在10gR2中,Oracle经过从新存储点简化了这个过程。一个从新存储点就是一个用户定义的与数据库PIT相关连的名字,能够在时间戳或者SCN中使用。能够认为从新存储点是一个redo历史的参考标记。从新存储点保留在控制文件中,直到从新存储点被删除或者重现日志被删除。第二个例子保证了重现数据库对于恢复是可用的。
create restore point my_restore_point;
Operation 206 succeeded.
或者建立从新存储点my_restrore_point来保证重现数据库;
注意:从新存储点并不会保证全部的事务都在那个时间点上提交。它不该该与DB2的关系型数据库管理系统中的静默点混淆了。
模拟数据库损坏
70. 模拟数据库损坏
71. insert into my_table values (2);
72.
73. 1 row created.
74.
75. commit;
76.
77. 提交完成
78. 判断数据库是否因为人为错误致使逻辑损坏。
79. select c1, ora_rowscn from my_table;
80.
81. C1 ORA_ROWSCN
82. ---------- ----------
83. 1 1320954
84. 2 1321231
注意:在默认状况下,Oracle在时钟级别上检索SCN。固然,时钟当中的全部行都有同样的SCN。激活行级别的SCN检索,能够在CREATE TABLE命令中使用ROWDEPENDENCIES关键字。
检验重现数据库是可能的。 判断你能够重现的最先的时间。
SELECT OLDEST_FLASHBACK_SCN
,to_char(OLDEST_FLASHBACK_TIME,'YYYY-MM-DD:HH24:MI:SS')
"OLDEST_FLASHBACK_TIME"
FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1319629 2006-09-23:19:51:56
判断你是否有从新存储点。
select name, scn, time from v$restore_point;
NAME SCN TIME
---------------- ---------- ----------------------------
MY_RESTORE_POINT 1321136 23-SEP-06 08.16.24.000000000 PM
这里是一些你感兴趣的视图。
重现数据库
你能够在SQL*Plus 或者 RMAN中执行重现数据库。重现数据库能够是基于修改和从新存储点的时间。RMAN提供了额外的基于选项的日志顺序。
使用先前建立的从新存储点来重现数据库。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Database mounted.
SQL> flashback database to restore point my_restore_point;
Flashback complete.
在警告日志中检查重现数据库消息
Sat Sep 23 20:38:11 2006
flashback database to restore point my_restore_point
Sat Sep 23 20:38:12 2006
Flashback Restore Start
Flashback Restore Complete
Flashback Media Recovery Start
parallel recovery started with 2 processes
Sat Sep 23 20:38:14 2006
Recovery of Online Redo Log: Thread 1 Group 2 Seq 33 Reading mem 0
Mem# 0 errs 0:
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
Sat Sep 23 20:38:16 2006
Incomplete Recovery applied until change 1321137
Flashback Media Recovery Complete
Completed: flashback database to restore point my_restore_point
验证你的数据库恢复到你想要的状态若是你不满意,你能够再次重现,把数据库向前恢复,直到或者执行了彻底恢复:recover database.注意:重现数据库能够经过RESETLOGS执行。
SQL> alter database open read only;
Database altered.
SQL> select c1, ora_rowscn from my_table;
C1 ORA_ROWSCN
---------- ----------
1 1321002
为通常用途打开数据库
对咱们的恢复满意了以后,为了通常用途打开数据库。
SQL> shutdown;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Database mounted.
SQL> alter database open resetlogs;
Database altered.
结论
重现数据库将会成为我最喜欢的Oracle10g特性之一。不管你是否纠正了用户的错误,只是看看先前的数据库状态,或者在衰退测试以后回到测试环境中,这个特性都是减小恢复时间的最好策略。咱们看到这项技术很容易使用,比传统的恢复更快,而且最好的是,它是免费的!我但愿你也会认为重现数据库是可用性体系结构中的一项主要组件。
oracle视频教程请关注:http://down.51cto.com/4202939/up