闪回技术在数据库误删除中的应用
2014-04-19徐捷
徐捷
摘 要:当数据库发生误删除等逻辑错误时,传统上只能通过执行不完全恢复来恢复数据,本文介绍了通过3种闪回技术,提高效率恢复数据库逻辑错误的方法,并对3种闪回技术进行了分析比较。
关键词:备份与恢复;闪回数据库;闪回表;闪回删除
中图法分类号:TP309 文献标识码:A 文章编号:2095-1302(2014)04-0088-02
0 引 言
传统上,误删除了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(1,'aaaa');
SQL>INSERT INTO testta VALUES(2,'bbbb');
SQL>INSERT INTO testta VALUES(3,'cccc');
SQL>COMMIT;
再执行以下语句,设置显示当前时间:
SQL>SET TIME ON
删除testta 表中全部3条记录:
14:11:29 SQL>DELETE testta;
提交删除事务:
14:12:30 SQL>COMMIT;
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
---------- ----
1 aaaa
2 bbbb
3 cccc
结果显示说明,testta表中被删除的数据已经恢复。
2 闪回数据库的操作
闪回数据库就像数据库上的倒带按钮,可以把整个数据库回退到过去的某个时点状态,其最终结果就像执行了不完整恢复。因此,闪回数据库不但能恢复像以上例子中被删除表中的记录,也能恢复被删除的表、视图等数据库其他对象,还能恢复被删除了的用户等。但此种方法也有其局限性,一是恢复到过去某一时间点后,则数据库的全部内容都被恢复到当时时间点状态,如果只是误删除了某个表中的记录,而只想恢复该表的内容,则不宜采用闪回数据库的方法;二是采用闪回数据库的方法,必须要先关闭数据库。为了克服闪回数据库的缺陷,可采用以下闪回表(Flashback Table)的方法,恢复被删除的记录,操作如下:
创建测试表testtb,在表中插入3条新记录后,提交插入事务:
14:43:09 SQL> CREATE TABLE testtb( id INT, name VARCHAR2(4));
14:43:20 SQL> INSERT INTO testtb VALUES(1,aaaa);
14:43:20 SQL> INSERT INTO testtb VALUES(2,bbbb);
14:43:20 SQL> INSERT INTO testtb 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));
16:10:44 SQL> INSERT INTO testtc VALUES(1,aaaa);
16:10:44 SQL> INSERT INTO testtc VALUES(2,bbbb);
16:10:44 SQL> INSERT INTO testtc 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)等闪回方法。
参 考 文 献
[1]张晓明. Oracle DBA突击[M]. 北京:人民邮电出版社, 2009.
[2]王东明. Oracle 11g 管理备份恢复从入门到精通[M].北京:中国水利水电出版社, 2008.
[3]汪照东. Oracle 11g数据库管理与优化宝典[M].北京:电子工业出版社, 2008.
[4]曾传军,傅秀芬,彭小玲,等. Oracle闪回技术在数据恢复中的应用[J]. 微型机与应用, 2010(16): 94-96,99.
[5]夏月平.关于Oracle闪回技术的应用研究分析[J]. 科学与财富,2011(11):314-316.