传统上,误删除了Oracle数据库中的重要表或表中的记录,提交(COMMIT)成功后,再想恢复被误删除的表格或表格中的数据,那只能采用数据库备份和恢复技术,其步骤为:首先利用误删除前备份的全部数据文件和控制文件将数据库还原到备份状态,再应用在线重做日志文件和归档日志文件,将数据库恢复到误删除前的状态,即执行数据库的不完全恢复,这样做不但需要数据库全备份,且操作复杂,耗费时间较长,在恢复期间数据库还必需关闭,不能使用。从Oracle9i开始,利用新提供的闪回功能,被误删除的表或表中的数据恢复可以更加方便、快捷。Oracle闪回功能在10g、11g又分别得到了加强。
摘要:当数据库发生误删除等逻辑错误时,传统上只能通过执行不完全恢复来恢复数据,本文介绍了通过3种闪回技术,提高效率恢复数据库逻辑错误的方法,并对3种闪回技术进行了分析比较。
关键词:计算机网络论文,备份与恢复,闪回数据库,闪回表,闪回删除
1闪回技术的功能
为了演示闪回功能,先在sql*plus中执行以下语句,创建测试表testta,表中插入3条新记录后,提交插入事务。
SQL>CREATETABLEtestta(idINT,nameVARCHAR2(4));
SQL>INSERTINTOtesttaVALUES(1,'aaaa');
SQL>INSERTINTOtesttaVALUES(2,'bbbb');
SQL>INSERTINTOtesttaVALUES(3,'cccc');
SQL>COMMIT;
再执行以下语句,设置显示当前时间:
SQL>SETTIMEON
删除testta表中全部3条记录:
14:11:29SQL>DELETEtestta;
提交删除事务:
14:12:30SQL>COMMIT;
14:12:34SQL>SELECT*FROMtestta;
表testta中已没有记录。由于删除事务已提交成功,如想恢复被删除的记录,传统的方法只能是执行数据库的不完全恢复。现在采用闪回数据库(FlashbackDatabase)的方法恢复删除数据,操作如下。
关闭数据库,将数据库设置到装载(mount)状态。
14:14:47SQL>SHUTDOWNIMMEDIATE
14:15:04SQL>STARTUPMOUNT
利用闪回数据库的方法,将数据库整体调整到删除数据前的某一时间。
14:16:10SQL>FLASHBACKDATABASETOTIMESTAMPTO_DATE(‘2013-12-2314:11:27’,’yyyy-mm-ddhh24:mi:ss’);
使用RESETLOGS选项,打开数据库。
14:17:07SQL>ALTERDATABASEOPENRESETLOGS;
查询testta表内容。
14:17:42SQL>SELECT*FROMtestta;
执行后,部分显示结果如下:
IDNAME
--------------
1aaaa
2bbbb
3cccc
结果显示说明,testta表中被删除的数据已经恢复。
2闪回数据库的操作
闪回数据库就像数据库上的倒带按钮,可以把整个数据库回退到过去的某个时点状态,其最终结果就像执行了不完整恢复。因此,闪回数据库不但能恢复像以上例子中被删除表中的记录,也能恢复被删除的表、视图等数据库其他对象,还能恢复被删除了的用户等。但此种方法也有其局限性,一是恢复到过去某一时间点后,则数据库的全部内容都被恢复到当时时间点状态,如果只是误删除了某个表中的记录,而只想恢复该表的内容,则不宜采用闪回数据库的方法;二是采用闪回数据库的方法,必须要先关闭数据库。为了克服闪回数据库的缺陷,可采用以下闪回表(FlashbackTable)的方法,恢复被删除的记录,操作如下:
创建测试表testtb,在表中插入3条新记录后,提交插入事务:
14:43:09SQL>CREATETABLEtesttb(idINT,nameVARCHAR2(4));
14:43:20SQL>INSERTINTOtesttbVALUES(1,’aaaa’);
14:43:20SQL>INSERTINTOtesttbVALUES(2,’bbbb’);
14:43:20SQL>INSERTINTOtesttbVALUES(3,’cccc’);
14:43:20SQL>COMMIT;
删除testtb表中全部3条记录:
14:44:16SQL>DELETEtesttb;
提交删除事务:
14:44:26SQL>COMMIT;
14:44:28SQL>SELECT*FROMtesttb;
删除事务已提交成功,testtb表中已没有记录。现采用闪回表的方法恢复删除数据。
闪回表的前提是启动被操作表的行移动(ROWMOVEMENT)特性。先启动表testtb的行移动特性:14:44:32SQL>ALTERTABLEtesttbENABLEROWMOVEMENT;
利用闪回表的方法,将testtb表恢复到删除数据前的某一时间。
14:45:27SQL>FLASHBACKTABLEtesttbTOTIMESTAMPTO_TIMESTAMP(‘2013-12-2314:44:00’,‘YYYY-MM-DDHH24:MI:SS’);
查询testtb表内容:
14:45:28SQL>SELECT*FROMtesttb;
执行后,部分显示结果如下:
IDNAME
--------------
1aaaa
2bbbb
3cccc
结果显示说明,testtb表中被删除的数据已经恢复。
3闪回表
闪回表能够恢复指定表中的记录内容,而不改变数据库其他对象的内容。但数据恢复中,闪回表必须启用被操作表的行移动特性,且只能进行闪回表的DML操作,不能进行闪回DDL操作。如果用户删除了(DROP)表,则不能采用闪回表的方法恢复,此时可以有采用上面介绍的闪回数据库的方法恢复整个数据库,也可以采用以下闪回删除(FlashbackDrop)的方法,其操作如下:
创建测试表testtc,表中插入3条新记录后,提交插入事务:
16:10:43SQL>CREATETABLEtesttc(idINT,nameVARCHAR2(4));
16:10:44SQL>INSERTINTOtesttcVALUES(1,’aaaa’);
16:10:44SQL>INSERTINTOtesttcVALUES(2,’bbbb’);
16:10:44SQL>INSERTINTOtesttcVALUES(3,’cccc’);
16:10:46SQL>COMMIT;
删除testtb表:
16:11:55SQL>DROPTABLEtesttc;
从回收站中闪回删除的testtc表:
16:12:34SQL>FLASHBACKTABLEtesttcTOBEFOREDROP;
查询testtc表内容:
16:13:19SQL>SELECT*FROMtesttc;
执行后,部分显示结果如下:
IDNAME
--------------
1aaaa
2bbbb
3cccc
结果显示说明,被删除testtc表已从回收站中恢复。
Oracle在删除一个表时,并不立即丢弃它,而是把它放在回收站中,并保留尽可能长的时间。闪回删除能够像Windows操作系统一样,将回收站中被删除的对象方便地恢复,但闪回删除只能恢复表、索引等对象,对于用户等对象,闪回删除无能为力。
通过以上验证可能看出,采用闪回技术,可以针对行级和事务级发生过变化的数据进行恢复,缩短数据恢复的时间,且操作简单,这样做大大提高了数据库恢复的效率。
4结语
最后,我们需要再说明以下几点:一是闪回技术具有强大且简便的数据库恢复功能,是否就不需要再做数据库备份和不完全恢复了呢?答案是否定的,因为当出现介质损坏时,任何闪回方法都是毫无用处,此时,只能执行标准的备份、还原与恢复过程;二是要实现各种闪回功能,必须要先对数据库进行相应设置,如启动闪回数据库、启动数据库的“回收站”、启动表的行移动等;三是除了以上介绍的3种闪回技术外,还要有闪回版本查询(FlashbackVersionQuery)、闪回事务查询(FlashbackTransactionQuery)、闪回查询(FlashbackQuery)和闪回数据归档(FlashbackDataArchive)等闪回方法。
参考文献
[1]张晓明.OracleDBA突击[M].北京:人民邮电出版社,2009.
[2]王东明.Oracle11g管理备份恢复从入门到精通[M].北京:中国水利水电出版社,2008.
[3]汪照东.Oracle11g数据库管理与优化宝典[M].北京:电子工业出版社,2008.
[4]曾传军,傅秀芬,彭小玲,等.Oracle闪回技术在数据恢复中的应用[J].微型机与应用,2010(16):94-96,99.
[5]夏月平.关于Oracle闪回技术的应用研究分析[J].科学与财富,2011(11):314-316.