oracle数据恢复(flashback)

马上要下现场了,恶补一些知识。头儿说我们需要掌握数据库恢复的技能。就是说,如果误删了数据或表,如何恢复。上网了解了一下,oracle有一个flashback(闪回)功能,说是用的什么undo机制(大概是“回滚”时用到的东西)。下面做了一下简单的常用的整理。

首先,有一种比较通用的,大家都会选择的东西,叫做“备份”。

用的是exp和imp命令,详细的命令格式网上有很多,在这里就不罗列了。一般来讲,需要备份(特定用户下的)所有对象(表)或指定对象(表)。可以用类似于下面这样的命令


[-dlbond@-]$exp username/userpasswd file=dmp_file_name.dmp tables=table_name

相应的,如果想导入备份数据,则可以用类似下面这样的命令

[-dlbond@-]$imp username/userpasswd file=dmp_file_name.dmp full=y

特别地,在imp命令中有一个full选项,如果想将备份文件的所有信息导入数据库,则可以用full=y,如果只想导入指定的对象(表),可以使用tables=table_name


以上就是关于数据的备份与恢复的简单内容,随时做好备份是一个特别好的习惯,就像rpg游戏当中的存档,如果你不随时在重要节点存档的话,出现“胜败乃兵家常事,大侠请重新来过”,那就只能是痛哭流涕了。


如果有时想恢复一些小动作的话,比如仅仅是误删了一条数据,或是一个表格,可能对于exp和imp来说,就有些大材小用了。如果你用的是oracle的话,可以考虑用flashback(闪回)功能。flashback分为:1.flashback query  2.flashback table  3.flashback database。就个人理解来看,前两个比较常用,而第三个相对来说使用率不高。

flashback query

就名称来看,是“闪回查询”,即只能查询到操作(例如删了某条记录)之前的内容,但不对表格实际内容做修改。有两种检索方式,一种是按时间查询,一种是按scn查询。

按时间查询比较好理解,比如说五分钟之前我删除了一条记录,但是我现在又想看一下被我删除的那条记录,就可以查询五分钟之前的表格数据,类似于

select * from table_name as of timestamp  systimestamp - interval '5' minute;
如果想查询指定时间的数据,则可以用类似下面这样的语句

select * from table_name as of timestamp  to_timestamp('2015-04-30 08:00:01','yyyy-mm-dd hh24:mi:ss')

对于scn,则是oracle的一种机制,每条执行语句都对应一个scn号码。可以用下面的语句来查询当前scn

select dbms_flashback.get_system_change_number from dual;
而scn号是递增的,如要退回之前scn的数据,可以用类似下面的语句

select * from table_name as of scn dbms_flashback.get_system_change_number-1000;
具体后面的数字可以自己尝试。


flashback table

可以闪回操作前的数据,即修改了表的内容。同样支持timestamp和scn两种方式

flashback table table_name to timestamp systimestamp - interval '5' minute;
flashback table table_name to scn dbms_flashback.get_system_change_number-1000;

另外,flashback table还支持类似下面的语句

flashback table table_name to before drop;
如要使上面的语句生效,需要满足几个条件。以下为简单的说明。

说明:oracle有一个类似于垃圾箱的一个东西recyclebin,一般情况下是开启的。可用下面的命令查询

SQL> show parameter recyclebin
如果当前状态为off,则可以使用下面的命令开启

SQL>alter system set recyclebin=on;

另外,如果数据库空间不足,会默认冲洗掉recyclebin中最早的数据,如果冲洗掉了想要恢复的数据,则无法恢复。









你可能感兴趣的:(oracle,数据库,flashback)