重庆思庄Oracle、Redhat认证学习论坛

标题: Flashback Table闪回表 [打印本页]

作者: jiawang    时间: 2024-6-21 09:56
标题: Flashback Table闪回表
本帖最后由 jiawang 于 2024-6-21 17:19 编辑

Flashback Table,注意SYS用户不支持闪回
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。

注意:如果想要对表进行flashback,必须允许表的row movement.

Alter table table_name row movement;

要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables),

例如:
SQL> select row_movement from user_tables where table_name='C';
ROW_MOVE
--------
ENABLED

要启用或禁止某表row movement,可以通过下列语句:


--启用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
表已更改。
--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
表已更改。


举例:
SQL> create table C (id number(2));
表已创建。

SQL> insert into C values(1);
已创建 1 行。

SQL> insert into C values(2);
已创建 1 行。

SQL> commit;
提交完成。

SQL> select * from c;

        ID
----------
         1
         2


SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
会话已更改。

SQL> select sysdate from dual;
SYSDATE
-------------------
2023-10-15 21:17:47

SQL> select current_scn from v$database;
CURRENT_SCN
-----------
      1103864

删除数据并恢复

SQL> delete from C;
已删除2行。

SQL> commit;
提交完成。

SQL> alter table c enable row movement;
表已更改。

SQL> flashback table c to scn  1103864;
闪回完成。

或者:

SQL> flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-dd hh24:mi:ss');


SQL> select * from c;
        ID
----------
         1
         2


Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。

如:
flashback table a,b ,c to scn 1103864;

闪回表注意事项:

a.当闪回删除操作之前,如果某个键值如主键被重用,将导致违反主键约束,闪回失败。
b.若闪回所需要的UNDO信息不存在,将引发ORA-08180:no snapshot found based on specified time(未找到基于指定时间的快照)错误
c.如果受闪回影响的记录被其它用户锁定,将引发ORA-00054:resource busy and acquire with NOWAIT specified (资源忙碌)错误
d.表定义在闪回期间不能发生变化,否则导致ORA-01466:unable to read data - table definition has changed(表定义已变化)错误
e.闪回前未启用row movement,将收到ORA-08189: cannot flashback the table because row movement is not enabled 错误
f.对于存在参照关系的情况,建议将主表等一起实施闪回,否则,将收到ORA-02091: transaction rolled back,ORA-02291错误
g.SYS 模式中的表不能使用表闪回技术
h. 基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。


官方示例:Rewind a Table Using Oracle Flashback Table





欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2