闪回技术在数据库误删除中的应用
扫描二维码
随时随地手机看文章
引言
传统上,误删除了 Oracle数据库中的重要表或表中的记 录,提交(COMMIT)成功后,再想恢复被误删除的表格或 表格中的数据,那只能釆用数据库备份和恢复技术,其步骤为: 首先利用误删除前备份的全部数据文件和控制文件将数据库 还原到备份状态,再应用在线重做日志文件和归档日志文件, 将数据库恢复到误删除前的状态,即执行数据库的不完全恢 复,这样做不但需要数据库全备份,且操作复杂,耗费时间 较长,在恢复期间数据库还必需关闭,不能使用。从Oracle 9i开始,利用新提供的闪回功能,被误删除的表或表中的数 据恢复可以更加方便、快捷。Oracle闪回功能在10 g、11 g又 分别得到了加强。
1闪回技术的功能
为了演示闪回功能,先在sql*plus中执行以下语句,创建 测试表testta,表中插入3条新记录后,提交插入事务。
SQL>CREATE TABLE testta( id INT,name VARCHAR2(4));
SQL>INSERT INTO testta VALUES。,'aaaa'); SQL>INSERT INTO testta VALUES(2,'bbbb'); SQL>INSERT INTO testta VALUES。,'cccc'); SQL>COMMIT ;
再执行以下语句,设置显示当前时间:
SQL>SET TIME ON
删除testta表中全部3条记录:
14 : 11 : 29 SQL>DELETE testta ;
提交删除事务:
14 : 12 : 30 SQL>COMMIT ;
收稿日期:2014-01-08
14 : 12 : 34 SQL> SELECT * FROM testta ;
表testta中已没有记录。由于删除事务已提交成功,如想 恢复被删除的记录,传统的方法只能是执行数据库的不完全 恢复。现在釆用闪回数据库(Flashback Database)的方法恢 复删除数据,操作如下。
关闭数据库,将数据库设置到装载(mount)状态。
14 : 14 : 47 SQL>SHUTDOWN IMMEDIATE
14 : 15 : 04 SQL>STARTUP MOUNT
利用闪回数据库的方法,将数据库整体调整到删除数据 前的某一时间。
14 : 16 : 10 SQL>FLASHBACK DATABASE TO TIMESTAMP TO_DATE( '2013-12-23 14 : 11 : 27',,yyyy-mm-dd hh24 : mi: ss'); 使用RESETLOGS选项,打开数据库。
14 : 17 : 07 SQL>ALTER DATABASE OPEN RESETLOGS;
查询testta表内容。
14 : 17: 42 SQL>SELECT * FROM testta ;
执行后,部分显示结果如下:
ID NAME
aaaa
bbbb
cccc
结果显示说明,testta表中被删除的数据已经恢复。
2闪回数据库的操作
闪回数据库就像数据库上的倒带按钮,可以把整个数据 库回退到过去的某个时点状态,其最终结果就像执行了不完整恢复。因此,闪回数据库不但能恢复像以上例子中被删除表中的记录,也能恢复被删除的表、视图等数据库其他对象,还能恢复被删除了的用户等。但此种方法也有其局限性,一是恢复到过去某一时间点后,则数据库的全部内容都被恢复到当时时间点状态,如果只是误删除了某个表中的记录,而只想恢复该表的内容,则不宜采用闪回数据库的方法 ;二是采用闪回数据库的方法,必须要先关闭数据库。为了克服闪回数据库的缺陷,可采用以下闪回表(Flashback Table)的方法,恢复被删除的记录,操作如下:
创建测试表 testtb,在表中插入 3 条新记录后,提交插入事务 :
14 :43 :09 SQL> CREATE TABLE testtb( id INT,
name
VARCHAR2(4)) ;
1 4 :4 3 :2 0 S Q L > I N S E R T I N T O t e s t t b
VALUES(1,’aaaa’) ;
1 4 :4 3 :2 0 S Q L > I N S E R T I N T O t e s t t b
VALUES(2,’bbbb’) ;
1 4 :4 3 :2 0 S Q L > I N S E R T I N T O t e s t t b
VALUES(3,’cccc’) ;
14 :43 :20 SQL> COMMIT;
删除 testtb 表中全部 3 条记录 :
14 :44 :16 SQL>DELETE testtb ;
提交删除事务 :
14 :44 :26 SQL>COMMIT;
14 :44 :28 SQL> SELECT * FROM testtb ;
删除事务已提交成功,testtb 表中已没有记录。现采用闪回表的方法恢复删除数据。
闪回表的前提是启动被操作表的行移动(ROW MOVEMENT)特性。先启动表 testtb 的行移动特性 :
14 :44 :32 SQL> ALTER TABLE testtb ENABLE ROW
MOVEMENT;
利用闪回表的方法,将 testtb 表恢复到删除数据前的某一时间。
14 :45 :27 SQL> FLASHBACK TABLE testtb TO
TIMESTAMP TO_TIMESTAMP(‘
2013-12-23 14 :44 :
00’,
‘
YYYY-MM-DD HH24 :MI :SS’) ;
查询 testtb 表内容 :
14 :45 :28 SQL>SELECT * FROM testtb ;
执行后,部分显示结果如下:
ID NAME
---------- ----
1 aaaa
2 bbbb
3 cccc
结果显示说明,testtb 表中被删除的数据已经恢复。
3 闪回表
闪回表能够恢复指定表中的记录内容,而不改变数据库其他对象的内容。但数据恢复中,闪回表必须启用被操作表的行移动特性,且只能进行闪回表的 DML 操作,不能进行闪回 DDL 操作。如果用户删除了(DROP)表,则不能采用闪回表的方法恢复,此时可以有采用上面介绍的闪回数据库的方法恢复整个数据库,也可以采用以下闪回删除(Flashback Drop)的方法,其操作如下:
创建测试表 testtc,表中插入 3 条新记录后,提交插入事务 :
16 :10 :43 SQL> CREATE TABLE testtc( id INT,
name
VARCHAR2(4)) ;
1 6 :1 0 :4 4 S Q L > I N S E R T I N T O t e s t t c
VALUES(1,’aaaa’) ;
1 6 :1 0 :4 4 S Q L > I N S E R T I N T O t e s t t c
VALUES(2,’bbbb’) ;
1 6 :1 0 :4 4 S Q L > I N S E R T I N T O t e s t t c
VALUES(3,’cccc’) ;
16 :10 :46 SQL>COMMIT;
删除 testtb 表 :
16 :11 :55 SQL> DROP TABLE testtc ;
从回收站中闪回删除的 testtc 表 :
16 :12 :34 SQL> FLASHBACK TABLE testtc TO
BEFORE DROP;
查询 testtc 表内容 :
16 :13 :19 SQL> SELECT * FROM testtc ;
执行后,部分显示结果如下:
ID NAME
---------- ----
1 aaaa
2 bbbb
3 cccc
结果显示说明,被删除 testtc 表已从回收站中恢复。
Oracle 在删除一个表时,并不立即丢弃它,而是把它放在回收站中,并保留尽可能长的时间。闪回删除能够像Windows 操作系统一样,将回收站中被删除的对象方便地恢复,但闪回删除只能恢复表、索引等对象,对于用户等对象,闪回删除无能为力。
通过以上验证可能看出,采用闪回技术,可以针对行级 和事务级发生过变化的数据进行恢复,缩短数据恢复的时间, 且操作简单,这样做大大提高了数据库恢复的效率。
4结语
最后,我们需要再说明以下几点:一是闪回技术具有强 大且简便的数据库恢复功能,是否就不需要再做数据库备份 和不完全恢复了呢?答案是否定的,因为当出现介质损坏时, 任何闪回方法都是毫无用处,此时,只能执行标准的备份、还 原与恢复过程;二是要实现各种闪回功能,必须要先对数据 库进行相应设置,如启动闪回数据库、启动数据库的“回收站”、 启动表的行移动等;三是除了以上介绍的3种闪回技术外,还要有闪回版本查询(Flashback Version Query)、闪回事务查询 (Flashback Transaction Query)、闪回查询(Flashback Query) 和闪回数据归档(Flashback Data Archive)等闪回方法。
20211120_6198f2c06decf__闪回技术在数据库误删除中的应用