Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395559
  • 博文数量: 58
  • 博客积分: 1136
  • 博客等级: 少尉
  • 技术积分: 945
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 10:07
个人简介

彪悍人生无需过多解释!

文章分类

全部博文(58)

文章存档

2013年(4)

2012年(16)

2011年(38)

分类: Oracle

2011-11-05 09:42:57

简介

Flashback数据库是一种时点(PIT)数据库恢复的方式。这种不完全的恢复策略可以用于恢复由于人为错误导致逻辑损坏的数据库。在10g中引入之后,它的设计目标就是以缩减恢复时间而获得最大的可用性。传统恢复vs.重现数据库

导致停机的第一个原因就是人为错误导致的逻辑损坏,这一点已经被广泛承认。关于逻辑损坏的例子,从用户不正确的更新数据和截取表,到批处理任务错误运行2次或者打乱顺序,比比皆是。结果都是相同的——数据库损坏,并且范围广阔且难以辨认。Oracle通过了两种策略来将数据库返回到先前的某个时点上:传统恢复和重现数据库。

不完全的恢复是数据库恢复到先前某个状态的恢复。这个过程有两个步骤:重新存储数据,并向前恢复事务活动到某个你想要的时间。传统恢复和重现数据库之间的主要区别就是,传统恢复从重新存储所有的数据文件开始,然后才恢复到某个想要的恢复时间,而重现数据库则是在损坏之后通过重新存储被改变的块来向后操作。从这个角度考虑问题的话,让我们想想在一个10TB的数据库上,有1MB的数据损坏了。传统的恢复从开始重新存储10TB的应用程序数据开始,而重现数据库则是取回这1MB的应用程序数据,从而达到损坏前的那个点。现在我们分别看看每一种策略。

传统恢复

在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,你需要设置如下的初始化参数:

  1. alter system set db_recovery_file_dest= '/oracle/product/10.2.0/flash_recovery_area' scope=both; alter system set db_recovery_file_dest_size = 10G scope=both;

存档

接下来,我们需要配置存档。再一次,我们需要使用FRA作为我们的文档日志目的地。与传统恢复类似,重现数据库需要存档以向前恢复提交的事务,在重现日志重新存储了希望时间之前的时点之后。

要最小化配置存档,执行如下的命令,按照顺序:

 

  1. SQL> startup mount;
  2. ORACLE instance started. . . . Database mounted.
  3. SQL> alter database archivelog;
  4. Database altered.
  5. SQL> alter database open;
  6. Database altered.
  7. 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

重现数据库

配置了这些先决条件之后,我们准备好配置重现数据库了。

首先,我们需要设置重现保持目标。这个初始化参数,以分钟来计算,代表我们可以把数据库返回到多长时间之前。它的值决定了FRA中重现日志的数量和时间段。下面我们的例子将其设置为24小时。要理解这个保持时间段并不是保证是非常重要的。如果FRA需要空间,重现日志将会自动删除目标保持时间点之前的记录。稍后我们会看到,我们保证重现日志的方式在FRA中进行维护。有了保持时间段设置,重现数据库可以激活。

  1. SQL> startup mount;
  2. ORACLE instance started. . . . Database mounted.
  3. SQL> alter system set db_flashback_retention_target = 1440 scope=both;
  4. System altered.
  5. SQL> alter database flashback on;
  6. Database altered.
  7. SQL> alter database open;
  8. Database altered.
  9. SQL> select flashback_on from v$database;
  10. FLASHBACK_ON

重现数据库示例

下面的例子用于演示,它想要描述单个表之外的损坏。

 

  1. 监控FRA
  2. select name,space_limit,space_used, space_reclaimable from v$recovery_file_dest;
  3. NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE
  4. /oracle/product/10.2.0/flash_recovery_area 2147483648 166646272

在10gR1中,你有两种选择来捕捉你的数据库的PIT:时间戳和系统修改号码(SCN)。这个信息是作为重现操作的一部分要求的。 捕捉到提交的SCN或者稍后的非常重要,而不是数据管理语言操作。Oracle提供了一种比较笨拙的方式来捕捉提交的SCN,通过userenv('commitscn')函数。我们的示例在发生损坏的数据管理语言操作之前捕捉到了这个信息。

select current_scn from v$database;

  1. 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历史的参考标记。重新存储点保留在控制文件中,直到重新存储点被删除或者重现日志被删除。第二个例子保证了重现数据库对于恢复是可用的。

  1. create restore point my_restore_point;
  2. Operation 206 succeeded.

或者创建重新存储点my_restrore_point来保证重现数据库;

注意:重新存储点并不会保证所有的事务都在那个时间点上提交。它不应该与DB2的关系型数据库管理系统中的静默点混淆了。

模拟数据库损坏

  1. insert into my_table values (2);
  2. 1 row created.
  3. commit;
  4. 提交完成.
  5. 判断数据库是否由于人为错误导致逻辑损坏
  6. select c1, ora_rowscn from my_table;
  7. C1 ORA_ROWSCN.

注意:在默认情况下,Oracle在时钟级别上检索SCN。当然,时钟当中的所有行都有一样的SCN。激活行级别的SCN检索,可以在CREATE TABLE命令中使用ROWDEPENDENCIES关键字。

检验重现数据库是可能的。 判断你可以重现的最早的时间。

  1. SELECT OLDEST_FLASHBACK_SCN ,to_char(OLDEST_FLASHBACK_TIME,'YYYY-MM-DD:HH24:MI:SS') "OLDEST_FLASHBACK_TIME" FROM V$FLASHBACK_DATABASE_LOG;
  2. OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
  3. 1319629 2006-09-23:19:51:56

判断你是否有重新存储点。

  1. select name, scn, time from v$restore_point;
  2. NAME SCN TIME
  3. MY_RESTORE_POINT 1321136 23-SEP-06 08.16.24.000000000 PM

这里是一些你感兴趣的视图。

重现数据库

你可以在SQL*Plus 或者 RMAN中执行重现数据库。重现数据库可以是基于修改和重新存储点的时间。RMAN提供了额外的基于选项的日志顺序。

使用先前创建的重新存储点来重现数据库。

  1. SQL> shutdown immediate;
  2. Database closed.
  3. Database dismounted.
  4. ORACLE instance shut down.
  5. SQL> startup mount
  6. ORACLE instance started. . . . Database mounted.
  7. SQL> flashback database to restore point my_restore_point;
  8. Flashback complete.

在警告日志中检查重现数据库消息

  1. . . . 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: /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执行。

  1. SQL> alter database open read only;
  2. Database altered.
  3. SQL> select c1, ora_rowscn from my_table;
  4. C1 ORA_ROWSCN
  5. 1 1321002

为一般用途打开数据库

对我们的恢复满意了之后,为了一般用途打开数据库。

  1. SQL> shutdown;
  2. Database closed.
  3. Database dismounted.
  4. ORACLE instance shut down.
  5. SQL> startup mount;
  6. ORACLE instance started. . . . Database mounted.
  7. SQL> alter database open resetlogs;
  8. Database altered.

特性及操作实例演示

oracle10g的FlashBack包括以下特性;

1〉oracle falshback Database. 特性允许oracle通过Flashback database语句,将数据库会滚到前一个时间点或者scn上,而不需要作时间点的恢复工作!
2〉oracle falshback table. 特性允许oracle通过flashback table语句,将表会滚到前一个时间点或者scn上。
3〉oracle falshback drop. 特性允许oracle把恢复drop掉的table或者索引。
4〉oracle falshback version query. 特性可以得到特定的表在某一个时间段内的任何修改记录!
5〉oracle falshback transaction query 特性可以限制用户在某一个事务级别上检查数据库的修改操作,适用于诊断问题、分析性能、审计事务。

一:oracle falshback table

oracle flashback table即闪回表
可以进行的操作:操作1>flashback table tablename to befor drop;
对于误drop的table此可以使用本操作,还原drop的table!
此操作需要用户有以下的权限:
A:falshback any table的系统权限或者是某一个表的flashback权限。
B:有table的select、insert、delect、alter权限。
C:有table的row Movement权限
SQL> set serveroutput on
SQL> set time on
11:24:37 SQL> set feadback off;
11:24:59 SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
A1 TABLE
A TABLE
----------------------
可以看到本用户下有table A,现在drop它;
-----------------------
11:25:01 SQL> drop table a;
11:26:18 SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
BIN$dFFlS6jJQLShRwRQ+kLJMg==$0 TABLE
A1 TABLE
----------------------
table已经删除,可以看到table并不是真正意义上的删除掉了,而是多了一个"BIN$dFFlS6jJQLShRwRQ+kLJMg==$0"的表,这个表是原来的A表,这是oracle的recyclebin,一个类似垃圾回收站的机制。当用户删除表以后把表放到recyclebin中,而不是删除掉!
----------------------
现在使用命令恢复表A
11:26:29 SQL> flashback table a to before drop;
11:30:45 SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
A1 TABLE
A TABLE
可以看到表A已经恢复!

可以进行的操作:操作2>flashback table tablename to scn/timestamp(a timestamp);
此操作可以利用scn(在后面介绍)或者timestamp将table恢复到某一个时间点!
-----给table row movement权限
11:41:49 SQL> alter table a enable row movement;
----插入一条记录
11:44:16 SQL> insert into a values('www',11);
11:45:15 SQL> commit;
----得到该记录的scn:1576479
11:45:20 SQL> select a.*,ora_rowscn from a;

NAME AGE ORA_ROWSCN
---------- ---------- ----------
500 65 1576479
600 65 1576479
111 10 1576479
222 100 1576479
333 30 1576479
444 40 1576479
555 50 1576479
www 11 1576479
888 34 1573035
---删除一条记录
11:45:55 SQL> delete from a where name ='www';
11:46:19 SQL> commit;
---利用scn命令恢复删掉的纪录!
11:46:20 SQL> flashback table a to scn 1576479;
11:46:49 SQL> select * from a;

NAME AGE
---------- ----------
500 65
600 65
111 10
222 100
333 30
444 40
555 50
www 11
888 34
---利用timestamp命令恢复删掉的纪录!
11:46:54 SQL> flashback table a to timestamp to_timestamp('2007-04-27 11:45:20','yyyy-mm-dd hh24:mi:ss');
11:56:28 SQL> select * from a;

NAME AGE
---------- ----------
500 65
600 65
111 10
222 100
333 30
444 40
555 50
888 34
附:--关于scn的介绍:
SCN:system change numbers,oracle10g的每一个表都有ora_rowscn列!但是desc是看不到改列的。
可以通过select ora_rowscn from table 得到每一条结果集当前的SCN,timestamp_to_scn()将scn转换到stmestamp;scn_to_timestamp()将timestamp转换到scn。
二:flashback drop
利用flashback drop oracle10g可以对DDL操作进行恢复,oracla提供类似回收站的recyclebin来收集被删除的对象,其实对象在删除的时候oracle把对象写到一个数据字典表中,当用户不需要该对象的时候,可以利用purge命令来从回收站进行清除。
--察看用户下所有表
SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
SYS_TEMP_FBT TABLE
A1 TABLE
A TABLE

Executed in 0.078 seconds
--drop 表A1
SQL> drop table a1;

Executed in 0.047 seconds
--再察看此时用户所拥有的所有表;
SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
SYS_TEMP_FBT TABLE
A TABLE
BIN$fPHKLxsBTBq6+bjBLPEJaw==$0 TABLE

Executed in 0.078 seconds

--如上可以看到A1表drop的同时,当前用户下又产生了一个以BIN开头的新表BIN$fPHKLxsBTBq6+bjBLPEJaw==$0,这就是原来的A1表
SQL> set timing off
SQL> set time on
14:25:40 SQL> select t.object_name,t.original_name from recyclebin t;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$fPHKLxsBTBq6+bjBLPEJaw==$0 A1
---采用flashback table命令恢复刚才删除的表A1
14:29:45 SQL> flashback table a1 to before drop;
14:29:49 SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
SYS_TEMP_FBT TABLE
A1 TABLE
A TABLE
--当用户确实不需要该对象时候,可以采用pruge来彻底删除改对象
14:29:55 SQL> drop table a1;
14:31:13 SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
SYS_TEMP_FBT TABLE
A TABLE
BIN$N+i42FTvSSemvMrH6frCQg==$0 TABLE

14:31:32 SQL> purge table "BIN$N+i42FTvSSemvMrH6frCQg==$0";
14:31:49 SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
B TABLE
STEST TABLE
TA TABLE
GROUPINGTEST TABLE
COLTABLE TABLE
ROWTABLE TABLE
COLTABLE1 TABLE
ROWTABLE1 TABLE
SYS_TEMP_FBT TABLE
A TABLE
--用purge命令收站想清空回收站里的别的表
14:31:56 SQL> purge recyclebin;
14:34:02 SQL> select object_name from recyclebin;

OBJECT_NAME
------------------------------
三:oracle falshback version query--闪回版本查询
oracle10g falshback 能将所有做了提交的行进行记录,就类似于审计的功能,通过falshback可以查询什么时候执行了什么操作,非常方便,包括闪回版本的查询和审计等。
1〉闪回版本的查询
14:41:22 SQL> insert into a values('zhao',24);
14:42:01 SQL> commit;
--查询当前版本
14:34:45 SQL> select a.*,ora_rowscn from a;

NAME AGE ORA_ROWSCN
---------- ---------- ----------
500 65 1577059
600 65 1577059
111 10 1577059
222 100 1577059
333 30 1577059
444 40 1577059
555 50 1577059
888 34 1573035

14:41:22 SQL> insert into a values('zhao',24);
14:42:01 SQL> commit;
14:42:03 SQL> select a.*,ora_rowscn from a;

NAME AGE ORA_ROWSCN
---------- ---------- ----------
500 65 1577059
600 65 1577059
111 10 1577059
222 100 1577059
333 30 1577059
444 40 1577059
555 50 1577059
888 34 1573035
zhao 24 1585133
--A:利用scn查询以前版本的记录
14:42:18 SQL> select * from a as of scn 1577059;

NAME AGE
---------- ----------
500 65
600 65
111 10
222 100
333 30
444 40
555 50
888 34
--B:利用timestamp查询以前版本的记录
14:42:51 SQL> select * from a as of timestamp scn_to_timestamp(1577059);

NAME AGE
---------- ----------
500 65
600 65
111 10
222 100
333 30
444 40
555 50
www 11
888 34
2〉审计的功能:
14:50:06 SQL> select a.*,versions_operation,versions_xid,versions_starttime from a
2 versions between timestamp minvalue and maxvalue;

NAME AGE VERSIONS_OPERATION VERSIONS_XID VERSIONS_STARTTIME
---------- ---------- ------------------ ---------------- --------------------
600 65
111 10
222 100
333 30
444 40
555 50
888 34
zhao 24 I 0500110006030000 27-4月 -07 02.42.00 下午
--可以看出 在27-4月 -07 02.42.00 下午 插入(I)了一条记录

14:50:53 SQL> a order byversions_starttime;
14:51:23 SQL> run;

NAME AGE VERSIONS_OPERATION VERSIONS_XID VERSIONS_STARTTIME
---------- ---------- ------------------ ---------------- ----------------------
500 65
600 65
111 10
222 100
333 30
444 40
555 50
888 34
zhao 24 I 0500110006030000 27-4月 -07 02.42.00 下午
四:oracle falshback transaction query闪回事务查询
oracle10闪回事务功能提供对过去某段时间内所完成的事务的查询和撤销!
14:59:56 SQL> select undo_sql,table_name from flashback_transaction_query x where x.table_owner=upper('zxt') and x.xid ='0500110006030000';

UNDO_SQL TABLE_NAME
-------------------------------------------------------------------------------- --------------
delete from "ZXT"."A" where ROWID = 'AAANOsAAGAAAAMWAAA'; A
--其中UNDO_SQL 就是当时对表A的DML操作;
五:oracle falshback Database:闪回数据库
oracle10g提供数据库级别的闪回,可以使整个数据库的数据恢复到某一个时间点或者SCN上。

阅读(2728) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~