闪回表使用时间戳和SCN号码将现有的表恢复到早期的版本。它在 Oracle 10g版本中和之后都可用。
它也有助于检索从数据库中删除的表,使用 DROP 和 TRUNCATE 命令删除的表。
使用DDL语句改变的表也不能通过闪回操作恢复到之前的状态。
关于闪回操作,你必须记住的一点是,数据的撤销是由UNDO_RETENTION参数控制的。更简单地说,如果撤销数据是可用的,那么只有表可以被恢复。
一旦你在任何表上触发了FLASHBACK TABLE语句,它就不能被回滚了。最好的做法是在发出FLASHBACK TABLE语句之前记录当前的SCN号码。
你必须在创建表的过程中启用行移动,才能对其进行回滚操作。行的移动也可以在以后使用 ALTER 命令来启用。
ALTER TABLE employees ENABLE ROW MOVEMENT;
FLASHBACK TABLE table_name
[TO BEFORE DROP] |
[TO TIMESTAMP time_stamp] |
[TO SCN scn_number] |
[ENABLE TRIGGERS | DISABLE TRIGGERS];
table_name - 要恢复的表的名称
time_stamp - 用户定义的时间戳
s cn_number - Oracle SCN(服务变更号)编号
下面的例子是用于将表恢复到早期状态的FLASHBACK TABLE命令。
从部门编号为10的表 employees 创建表 emp_temp 。
CREATE TABLE emp_temp
SELECT * FROM employees WHERE dept_no = 10;
从 emp_te m p 中获取数据,检索到属于部门编号为10的雇员列表。
SELECT dept_no, salary FROM emp_temp;
DEPT_NO | SALARY |
10 | 1500 |
10 | 3600 |
10 | 4000 |
现在, 使用下面的查询从 emp_temp 表中删除 工资小于2000的雇员。
DELETE FROM emp_temp WHERE salary < 2000;
这将在 emp_temp 表中只留下2条记录。
DEPT_NO | SALARY |
10 | 3600 |
10 | 4000 |
通过下面的查询,我们可以使用闪回操作将表 emp_temp 恢复到当前时间之前的2分钟
FLASHBACK TABLE emp_temp
TO TIMESTAMP (SYSTIMESTAMP – INTERVAL '2' MINUTE);
再次查询表 emp_temp 将检索到原始结果
DEPT_NO | SALARY |
10 | 1500 |
10 | 3600 |
10 | 4000 |
另一种将表 emp_temp 恢复到特定时间戳的方法如下
FLASHBACK TABLE emp_temp
TO TIMESTAMP TO_TIMESTAMP('2018-09-19 13:34:12', 'YYYY-MM-DD HH24:MI:SS');
你也可以使用SCN号码检索表的旧版本。
让我们继续上面的例子TO TIMESTAMP
为了查询2分钟,表 emp_temp 的先前版本,使用SCN号码,可以使用下面的查询
FLASHBACK TABLE emp_temp TO SCN (3187302511937);
这个SCN号码是表 emp_temp 的2分钟前的状态。
所以在查询 emp_temp 表的时候,闪回操作后的输出结果将是
DEPT_NO | SALARY |
10 | 1500 |
10 | 3600 |
10 | 4000 |
假设你在匆忙回家的时候不小心把表 employees 丢弃了,可以使用下面的查询
DROP TABLE employees;
为了找回表 employees ,使用FLASHBACK TABLE的TO BEFORE DROP子句。
FLASHBACK TABLE employees TO BEFORE DROP;
检索到的 employees 表也可以通过下面的查询重命名为 emp 表
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO emp;
默认情况下,Oracle数据库在闪回期间禁用触发器。当闪回操作完成后,这些 触发器 被启用。
你需要指定ENABLE TRIGGERS来保持在闪回操作中启用触发器。
FLASHBACK TABLE emp_temp TO SCN (3187302511937) ENABLE TRIGGERS;
但是,在闪回操作前已经被禁用的触发器不能用这个选项启用。
DISABLE TRIGGERS的作用与闪回操作中的默认行为相同。
USER_RECYCLEBIN是一个视图,你可以从中检索到被丢弃或截断的表。
SELECT * FROM user_recyclebin;
RECYCLEBIN是USER_RECYCLEBIN视图的同义词。
使用TO SCN子句可以将表返回到提到的SCN号码的时间点。
可以使用下面的查询从v$database表中检索到SCN号码
SELECT current_scn FROM v$database;
你也可以使用SCN_TO_TIMESTAMP和TIMESTAMP_TO_SCN函数将时间戳转换成SCN号码,反之亦然
SELECT TIMESTAMP_TO_SCN(SYSTIMESTAMP – INTERVAL '2' MINUTE) FROM dual;
SCN_TO_TIMESTAMP(3187302511937)将检索出这个SCN号码的时间戳。
为了使表恢复到特定的时间戳,使用TO TIMESTAMP子句。
TO BEFORE DROP子句可以找回被丢弃的表。
然而,使用PURGE选项放弃的表不能被检索回来。
TO BEFORE DROP子句也不能恢复被TRUNCATE TABLE命令删除的表。
RENAME TO子句在闪回操作中以新的名称从回收站检索表。
通过 TRUNCATE TABLE 掉落的表可以使用TO TIMESTAMP和TO SCN子句恢复。在这种情况下,不可能恢复丢失的数据。