当某个错误的 UPDATE 或 DELETE 语句被提交之后,如果想要把数据恢复到提交之前的某个时间点,通过逻辑备份或日志理论上也是可以做到的,但过程往往比较繁琐,而且需要花费较长时间才能恢复过来。 为了让数据库能从任何逻辑误的操作中迅速地恢复,Oracle 推出了 Flashback(闪回)技术。Flashback 技术是以 undo segment 中的内容为基础的,因此受限于 UNDO_RETENTON 参数。要使用 Flashback 的特性,就必须启用自动撤销管理表空间(默认即开启)。 Oracle 10g 中的闪回技术主要包含闪回数据库、闪回删除、闪回表、闪回事务及闪回查询等一系列功能,本节将简要介绍其中比较实用的 3 个功能——闪回查询、闪回表及闪回删除。 注意:SCN(System Change Number)是在 Oracle 数据库更新后,用于定义数据库事务提交版本的一个数字,由 DBMS 自动维护(自动递增)。 SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; -- 查询当前的 SCNSELECT SCN_TO_TIMESTAMP(2817281) FROM DUAL; -- SCN 转换成时间点SELECT TIMESTAMP_TO_SCN('2017-05-20 13:14:51') FROM DUAL; -- 时间点转换成 SCN当时间点转换成 SCN 时可能会失败,因为那个时间点也许并没有有效的事务操作。 闪回查询(Flashback Query) 利用 SCN 号来进行闪回查询,查询最近一个事务操作之前t_course表中的数据: SELECT * FROM demo.t_course AS OF SCN DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;利用时间点来进行闪回查询,查询'2017-05-20 13:14:51'这一秒t_course表中的数据: SELECT * FROM demo.t_course AS OF TIMESTAMP TO_TIMESTAMP('2017-05-20 13:14:51','yyyy-mm-dd hh24:mi:ss');闪回表(Flashback Table) 开启行转移功能(必须要开启行转移功能,否则将无法闪回表)。 ALTER TABLE demo.t_course ENABLE ROW MOVEMENT; -- 开启行转移功能ALTER TABLE demo.t_course DISABLE ROW MOVEMENT; -- 关闭行转移功能利用 SCN 号来进行闪回表操作,将demo.t_course表的数据恢复到 2869642: FLASHBACK TABLE demo.t_course TO SCN 2869642;利用时间点来进行闪回表操作,将demo.t_course表的数据恢复到'2017-05-22 18:00:00': FLASHBACK TABLE demo.t_course TO TIMESTAMP TO_TIMESTAMP('2017-05-22 18:00:00','yyyy-mm-dd hh24:mi:ss');闪回删除(Flashback Drop) 普通的 DROP TABLE 操作并不会彻底的删除表,而是把表放入了回收站(RecycleBin)。放入回收站实际上就是保存原表的位置,然后将要删除的表重新命名为前缀是“BIN$”的表,并将删除的表信息(包括被删除表的新名字和原名字)存储在回收站中。 回收站是一个逻辑结构,不具有物理数据结构。记录在回收站中信息会保留一段时间,直到回收站空间不足(会自动删除一些表信息)或者使用 PURGE 指令清除回收站中的记录。只要被删除表的信息仍在回收站中,就可以通过闪回技术将这些表恢复。 闪回删除类似于操作系统的垃圾回收站功能,可以从中恢复被 DROP 的表或者索引。无论是将回收站里的表恢复为原名称或指定新名称,表中的数据都不会丢失。可以通过USER_RECYCLEBIN视图或DBA_RECYCLEBIN来查询回收站中有那些被删除的表信息。 语法: FLASHBACK TABLE user_recyclebin.object_name TO BEFORE DROP[RENAME TO new_table_name];示例: FLASHBACK TABLE "BIN$/AwWTga9PSHgQKjACgoQJA==$0" TO BEFORE DROP;FLASHBACK TABLE "BIN$Vm9deG4nRjatKqnWpQ+RBA==$0" TO BEFORE DROP RENAME TO tt;补充示例: PURGE DBA_RECYCLEBIN; -- 清空当前数据库的回收站PURGE RECYCLEBIN; -- 清空当前用户的回收站PURGE TABLE demo.t_course; -- 清空 demo.t_course 表在回收站中的信息DROP TABLE demo.t_course PURGE; -- 彻底删除 demo.t_course 表,不进入回收站
|