加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

FLASHBACK TABLE用法介绍

发布时间:2020-12-15 17:50:26 所属栏目:百科 来源:网络整理
导读:1.作用 在人为操作或应用程序错误时,使用FLASHBACK TABLE语句恢复表到一个早期状态。表可以闪回到过去的时间点,依赖于系统中撤销数据的数据量。此外,Oracle数据库不能恢复到通过任何DDL操作改变了表结构的早期状态。 (注意:Oracle强烈建议数据库运行在

1.作用

在人为操作或应用程序错误时,使用FLASHBACK TABLE语句恢复表到一个早期状态。表可以闪回到过去的时间点,依赖于系统中撤销数据的数据量。此外,Oracle数据库不能恢复到通过任何DDL操作改变了表结构的早期状态。

(注意:Oracle强烈建议数据库运行在自动撤销模式下,通过设置UNDO_MANAGEMENT初始参数值为AUTO,默认是自动模式。另外,设置UNDO_RETENTION初始化参数的间隔足够大,包括你预计需要的最早数据。)

你不能回滚FLASHBACK TABLE语句。但是,你可以执行另一个FLASHBACK TABLE语句,指定一个早于当前时间的时间点。

?

2.权限

要闪回一个表到早期的SCN或时间戳。你必须有表的?FLASHBACK对象权限,或者FLASHBACK ANY TABLE系统权限。另外,你必须还有表的?SELECT,INSERT,DELETE和 ALTER对象权限。

闪回列表中的所有表必须启用行移动,除非你是正在闪回表到BEFORE DROP。这种操作叫做闪回删除操作,他使用的是回收站中的删除数据,而不撤销数据。

要闪回表到一个还原点,你必须有SELECT ANY DICTIONARY或FLASHBACK ANY TABLE系统权限,或者SELECT_CATALOG_ROLE角色。

要闪回表到DROP TABLE操作之前。你只需要删除该表的必须权限。

?

3.语法

?

语义:

在执行闪回表操作期间,数据库获取闪回列表中所有指定的报表独立DML锁。当正在恢复到之前状态时,这些锁阻止对表的任何操作.

闪回表操作在单个事物中执行,不管闪回表中指定表的数量。要么所有的表都恢复到早期状态,要么都没恢复。如果任何表的闪回表操作失败,那么整个语句都失败。

闪回操作完成时,表中的数据与表之前的时间点一直。但是,FLASHBACK TABLE到SCN或时间戳不保存rowid,FLASHBACK TABLE TO BEFORE DROP不能恢复引用约束。

数据库不能恢复与表关联的早期结构的统计信息。表当前的索引是恢复,并反映还原点表的状态。如果该索引在还原点不存在,数据更新索引里来反映还原点表的状态。然而,如果索引是在当前时间和还原点之间被删除,是不能恢复。

?

schema

指定模式包含的表。如果缺省,数据库假定该表是在你自己的模式。

table

指定一个或多个表名称。

闪回表收受以下限制:

  • 对于这些对象类型闪回表操作是无效的:表是集群的一部分,物化视图,高级队列表,静态数据字典表,系统表,远程表,对象表,嵌套表,独立分区表和子分区表。
  • 以下DDL操作改变了表的结构,所以不能接着使用 TO SCN或 TO TIMESTAMP闪回到操作之前的时间点:升级,移动,截取表(truncate);增加表约束,增加表到集群;删除或修改列;更改列的加密密钥;增加,删除,合并,分离,联合,截取分区或子分区(除了增加范围分区)

TO SCN Clause

指定你返回的时间对应系统改变SCNexpr必须计算一个数字,代表有效的SCN。

TO TIMESTAMP Clause

指定你要返回表的时间点对应的时间戳。?expr?必须计算一个过去有效的时间戳。表将被闪回到指定时间戳大约3秒内的时间点。

TO RESTORE POINT Clause

指定你要闪回表的还原点,该还原点在之前必须配创建。

ENABLE | DISABLE TRIGGERS

默认情况下,数据库禁用在闪回表操作期间的表上定义的所有启用触发器,在闪回表操作完成之后再启用他们。如果你想覆盖默认的行为,并在执行闪回过程中启用触发器,指定ENABLE TRIGGERS。

TO BEFORE DROP Clause

使用这个子句检索回收站中已删除的表,及其可能依赖的对象。该表必须是驻留在本地管理表空间,而不是其他系统表空间。

你可以指定原始用户指定的表的名称,或对象删除时数据库分配的系统生成名称。

  • 回收站中系统生成的对象名称是唯一的。因此,如果指定系统生成名称,那么数据库检索指定的对象。

要查看回收站中的内容,查询USER_RECYCLEBIN数据字典,也可以使用RECYCLEBIN同义词替代。下面两个语句返回相同行:

select * from? recyclebin;

select * from user_recyclebin;

  • ?如果指定了用户指定的名称,且如果回收站中包含多个该名称的对象,然后数据库检索回收站中最近移动的对象。如果想要检索更早版本的表,你可以这样做:
    • 指定你想要检索的表的系统生成名称。
    • 执行FLASHBACK TABLE ... TO BEFORE DROP语句,直到你要检索表。

RENAME TO Clause

为从回收站正在检索的表,指定一个新的名称。

?

4.Examples

FLASHBACK TABLE语句的用法主要分成两大类:从撤销数据中闪回和从回收站中闪回。其中从撤销数据中闪回必须要启用表的行移动,用户要有SELECT ANY FLASHBACK系统权限。为了查询闪回事务,用户要有SELECT ANY TRANSACTION系统对象权限。

使用DBA用户给scott用户

GRANT FLASHBACK ANY TABLE TO SCOTT;

GRANT SELECT ANY?TRANSACTION TO SCOTT;

?

4.1.从撤销数据中闪回表到之前某个时间点

使用下面的命令,启用闪回列表中表的行移动:

ALTER? TABLE table_name ROW MOVEMENT

创建emp_test测试表

create table emp_test(
? emp_id number,
? emp_code varchar2(5),
? emp_name varchar2(10)
);

--插入数据

insert into emp_test values (1,'01','chiclewu');
insert into emp_test values (1,'02','china');

?

使用下面命令,启用表的行移动:

ALTER TABLE?emp_test ENABLE ROW MOVEMENT

?

需要DBA先授予 select any transaction系统权限给scott用户,查询闪回事务。

?

SQL> select ftq.start_scn,ftq.start_timestamp
? 2??? from flashback_transaction_query ftq
? 3?? where ftq.table_name = 'EMP_TEST';
?
?
?START_SCN?? START_TIMESTAMP
----------?????????????? ---------------
?? 2701570???????? 2013/11/21 22:53:56
?? 2701570???????? 2013/11/21 22:53:56

?

发现闪回事务查询视图中,有两条撤销数据。现在更新员工代码为02的员工ID为2,姓名修改为“hello”:

SQL> update emp_test et
? 2???? set et.emp_id = 2,et.emp_name = 'hello'
? 3?? where et.emp_code = '02';
?
1 row updated
?
SQL> commit;
?
Commit complete

?

查询员工表:

SQL> select * from emp_test;
?
??? EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
???????? 1 01?????? chiclewu
???????? 2 02?????? hello

员工02的ID和姓名已经修改成功了,并且已经提交了数据。这时候发现修改错了,想要恢复到之前的时间点的数据。可是我没有设置还原点呀!怎么恢复呢?不用担心,使用刚才学过的闪回表SCN或时间戳就能够实现:

先查询闪回事务表中的撤销记录:

SQL> select ftq.start_scn,
? 2???????? ftq.start_timestamp
? 3??? from flashback_transaction_query ftq
? 4?? where ftq.table_name = 'EMP_TEST';
?
?
?START_SCN? ?START_TIMESTAMP
----------??????????????? ---------------
?? 2702778?????????2013/11/21 23:14:59
?? 2701570?????????2013/11/21 22:53:56
?? 2701570???????? 2013/11/21 22:53:56

?

使用闪回表SCN恢复到插入数据之前的时间点:

flashback table emp_test to? scn 2701570;

查询员工表:

SQL> select * from emp_test;
?
??? EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------

没有数据,说明恢复成功!

?

忽然又觉的不对,又想要恢复到插入数据之后,修改之前的时间点。

使用闪回表时间戳进行恢复:
flashback table emp_test to timestamp to_timestamp('2013/11/21 23:14:59','yyyy-mm-dd hh24:mi:ss');

?

查询员工表:

?SQL> select * from emp_test;
?
??? EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
???????? 1 01?????? chiclewu
???????? 1 02?????? china

?和插入后数据一样,说明恢复成功!

?

4.2.从撤销数据中闪回表到之前保存点

先设置还原点,用于的数据恢复。

create restore point respt;


删除02员工信息,并提交到事务。

SQL> delete from emp_test t where t.emp_code='02';
?
1 row deleted
?
SQL> commit;
?
Commit complete

查询员工表:

SQL> select * from emp_test;
?
??? EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
???????? 1 01?????? chiclewu

?

现在使用之前设置的还原点,恢复到还原点时的数据。


flashback table emp_test to restore point respt;

?

查询员工表

SQL> select * from emp_test;
?
??? EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
???????? 1 01?????? chiclewu
???????? 1 02?????? china

?

有02员工记录,说明保存点闪回恢复成功。

?

4.3.从回收中恢复删除之前的表

在回收站中只有DROP的对象的数据,没有新增、更新的撤销数据。因此,在回收中只能执行 FALSHBACK TABLE ... TO BEFORE DROP语句。

清空回收站:

pruge? recyclebin;

查询回收站

SQL> select object_name,original_name from recyclebin;
?OBJECT_NAME? ORIGINAL_NAME
----------- --------------------------------

没有任何记录

?

首先DROP员工表。

drop table emp_test;

?

查询员工表

?
SQL> select * from emp_test;
?
select * from emp_test
?
ORA-00942: 表或视图不存在

说明表已经删除了。

?

在查询回收站

SQL> select object_name,original_name from recyclebin;
?
OBJECT_NAME??????????????????? ORIGINAL_NAME
------------------------------ --------------------------------
BIN$67M/gFgFfovgQAB/AQADTw==$0 EMP_TEST

执行闪回删除恢复:

flashback table "BIN$67M/gFgFfovgQAB/AQADTw==$0" to before drop; --系统生成名称

flashback table EMP_TEST to before drop; --原始表名称

?

查看员工表:

SQL> select * from emp_test;
?
??? EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
???????? 1 01?????? chiclewu
???????? 1 02?????? china

表已经恢复了,数据也恢复了!

?

5.总结

FLASHBACK TABLE语句能恢复多长时间之前的数据呢?即撤销数据能保留多长时间。

Oracle数据库基于撤销表空间是如何配置的,自动调整撤销保留期限。

  • 撤销表空间是自动扩展的,数据库动态调整撤销保留期限,略长于系统中运行时间最常的主动查询
  • 撤销表空间是固定大小,UNDO_RETENTION参数值会被忽略。数据库动态调整一个最佳的保留期限。

UNDO_MANAGEMENT初始化参数,默认值为AUTO,即自动撤销管理。UNDO_RETENTION初始化参数,默认值为900(相当于15分钟)。

通过动态数据自定v$undostat,查看最近4天数据库动态动态调整撤销保留期限的值:

select begin_time,end_time, tuned_undoretention
? from v$undostat
?order by desc end_time;

?

?

?

参考Oracle官方文档

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读