flashback记录恢复 下载本文

使用FLASHBACK TABLE进行数据恢复

1.使用flashback查询实现行级恢复

flashback查询用于获取先前时间点的表行级数据。当使用flashback查询时,需要在表名后指定as of timestamp子句或as of SCN子句,其中as of timestamp用于指定早期时间点,

而as of SCN用于指定早期的SCN值,示例如下:

select * from students as of timestamp to_timestamp('2011-07-14

15:52:30','YYYY-MM-DD HH24:MI:SS') WHERE sno='10'

select * from students as of SCN 11495000 where sno='10' 注意:

flashback查询的最早时间点受限于初始化参数undo_retention。下面通过示例说明使用flashback查询实现行级恢复的方法。

(1)模拟用户误操作。假定用户登录后。执行delete操作误删除学生表前10名学员的信息,并提交的了数据。示例如下:

delete from students where sno>11

commit;

(2)使用flashback查询取得早期时间点表行数据,为了使用flashback查询取得早期时间点的表行数据,必须在表名后指定as of timestamp 或as of SCN子句,只要记住删除表的时间大约是什么时候,就可以根据as of timestamp子句即可:

select * from students as of timestamp to_timestamp('2011-07-14

16:02:25','YYYY-MM-DD HH24:MI:SS') where sno>11

使用flashback查询恢复表行数据。在取得过去时间点的表行数据之后,为了恢复这些被删除的行数据,可以在insert语句后使用flashback查询,示例如下:

insert into students select * from students as of timestamp to_timestamp('2011-07-14 16:02:25','YYYY-MM-DD HH24:MI:SS') where

sno>11 commit;

2.使用flashback table恢复表到先前状态

flashback查询可以用于恢复被误删除的表行数据,但是用户在表上执行了其他的DML语句误操作(insert或update),则不能直接使用flashback查询将表数据恢复到先前时间点,从oracle10g开始,使用flashback table语句可以将表恢复到先前时间点,通过使用该特征,可以避免执行基于时间点的不完全恢复,注意如果要在某个表上使用flashback table特征,则要求必须具有以下条件:

a.用户必须具有flashback any table系统权限或flashback对象权限 b.用户必修在表上具有select insert delete和alter权限

c.必须合理设置初始化参数undo_retention,以确保UNDO信息保留足够时间

d.必须激活行移动特征:alter table table_name enable row movement; 以students为例: a激活行移动特征

alter table students enable row movement b假定某用户登录之后,使用update语句误操作 update students set age=age+1 where sno>11 c使用flashback table恢复表数据到先前时间点

flashback table students to timestamp to_timestamp('2011-07-14

16:02:25','YYYY-MM-DD HH24:MI:SS');

数据恢复完毕,查看数据:

select * from students where sno>11; 3.使用flashback table恢复被删除表 数据库回收站

数据库回收站是oracle10g新引入的概念,当执行drop table删除表时,数据库不会立即释放与表相关的空间,该表实际被改名,并且与其相关的对象存放在数据库回收站里,因此使用flashback table可以恢复回收站的对象,注意,数据库回收站具有以下限制:

(1)回收站只适用于非system的局部管理表空间

(2)oracle没有为回收站分配固定的预留空间,因此不能保证数据库对象在回收站中的保留时间,当被删除对象所在表空间没有足够空间时,oracle会使用FIFO(先进先出)机制清除回收站的相应对象

(3)使用select语句可以查询回收站对象的数据,但不能再回收站对象上执行DML和DDL操作

a.生成回收站对象

在windows平台上,如果按delete键删除OS文件,则该文件会被临时存放到回收站,如果同时按下shift+delete删除OS文件,则该文件会被彻底删除,在oracle10g中与之类似,如果执行drop table删除表,则表及其相关对象会被临时存放到数据库回收站;如果执行drop table...purge删除表,则会彻底删除表。

Drop table students Drop table students purge

当执行drop table操作删除表时,oracle会将该表及其相关对象移动到回收站,并且oracle会为每个被删除对象分配一个名称(格式:

BIN$$globalUID$version,globalUID是长度为24的对象标识符,version是数据库分配的版本号)

b.显示当前用户的回收站对象

通过执行SQL*plus命令show recyclebin,可以显示当前用户的回收站对象,

Show recyclebin; 或在pl/sql developer下: Select * from recyclebin

通过查询数据字典视图user_recyclebin或其同义词recyclebin,也可以显示当前用户的回收站对象:

Select object_name,original_name from recyclebin 清除回收站对象

在windows平台中,回收站文件可以被彻底清除,与之类似,在oracle10g中,使用PURGE TABLE,PURGE INDEX,PURGE TABLESPACE可以清除回收站对象

示例一:清除表及其相关对象 Purge table students 示例二:清除索引

Purge index ‘BIN$6LsvzDLiTfGD06IcYloxIA==$0’ 示例三:清除特定表空间的所有对象

Purge tablespace user01

Purge tablespace users userscott; 示例四:清除当前用户回收站的所有对象 Purge recyclebin

示例五:清除数据库的所有回收站的对象 Purge DBA_recyclebin c.恢复被删除表

当执行了drop table之后因为被删除表会被存放到数据库回收站,所以停用flashback table?to before drop语句可以完全恢复被删除表,从而避免不完全恢复的繁杂过程,下面以误删除students表为例,说明使用flashback table恢复被删除表的方法

(1) 模拟用户误操作。假定用户误操作执行了drop table Drop table students

(2) 显示回收站对象。 Select * from recyclebin

(3) 恢复被删除表。在确定被误删除的表之后,使用flashback table可以恢复被误删除的表,当恢复误删除的表时,既可以指定初始表名,也可以使用回收站对象名

Flashback table students to before drop 或

Flashback table “BIN$6LsvzDLiTfGD06IcYloxIA==$0” to before drop 另外,当恢复被删除表时,通过使用remove to子句,可以改变被删除表的名称:

Flashback table students to before drop rename to students1