Oracle中的闪回表解释与实例


闪回表使用时间戳和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检索表

你也可以使用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的作用与闪回操作中的默认行为相同。

RECYCLEBIN和USER_RECYCLEBIN

USER_RECYCLEBIN是一个视图,你可以从中检索到被丢弃或截断的表。

SELECT * FROM user_recyclebin;

RECYCLEBIN是USER_RECYCLEBIN视图的同义词。

TO SCN子句

使用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 TIMESTAMP子句。

TO BEFORE DROP子句

TO BEFORE DROP子句可以找回被丢弃的表。

然而,使用PURGE选项放弃的表不能被检索回来。

TO BEFORE DROP子句也不能恢复被TRUNCATE TABLE命令删除的表。

RENAME TO子句

RENAME TO子句在闪回操作中以新的名称从回收站检索表。

TRUNCATE TABLE之后检索表

通过 TRUNCATE TABLE 掉落的表可以使用TO TIMESTAMP和TO SCN子句恢复。在这种情况下,不可能恢复丢失的数据。