Oracle数据库管理-flashback解析

ORACLE数据库flashback使用手册

1 概述

对于oracle数据库flashback技术,主要包含闪回删除(flashback drop),闪回表(flashback dml)和闪回数据库(flashback database),本文主要针对闪回删除,和闪回查询进行分析,以及阐述操作步骤,在应对生产环境造成的误操作进行恢复提供应急恢复方案。

  1. 闪回删除(flashback drop)
  2. 闪回删除原理

如果使用drop table指定删除表,该表不会从数据库中立刻删除,而是保持在原表位置,但是将删除的表重命名,并将删除的表存储到回收站中,回收站中记录被删除表新名字和原名字,显然此时被删除表所占用的空间没有被立即释放,变成数据库中可用的潜在空间,保留一段时间,知道回收站空间不足或使用purge指定删除回收站内容。

 回收站是一个逻辑结构,删除表后,物理上该表没有被删除,但是它所占用的空间回收空闲列表上,也就是可用空间。

  1. 闪回删除限制

1 对于sys和system用户下的表无法进行flashback。

2 对于删除的表如果不存在与回收站则无法进行flashback。

     2  闪回删除开启

show parameter recyclebin

如果为on则开启闪回删除。默认为on (system和sys账户下的对象删除后不到回收站不能进行flashback)

C:\Users\Administrator>sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on 星期一 9月 23 17:53:30 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

连接到:

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show parameter recyclebin

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      on

SQL> create table fla01 as select * from dba_objects;

表已创建。

SQL> drop table fla01;

表已删除。

SQL> flashback table fla01 to before drop;

flashback table fla01 to before drop

*第 1 行出现错误:

ORA-38305: 对象不在回收站中

  1. 闪回删除命令

flashback table t to before drop;

flashback table &recyclebin_name to before drop rename to t_test;

FLASHBACK  TABLE  my_table  TO  BEFORE  DROP  RENAME  TO  my_table2

. One  of  the  tables  is  recovered  from  the  Recycle  Bin  using  a  Last  In  First  Out  (LIFO)  approach

     2.回收站相关命令

purge tablespace users  user scott;

purge dba_recyclebin

purge table test;

purge table &recyclebin_name

相关问题:

1 DROP TABLE T1 ;

CREATE TABLE T1 AS SELECT 1 NAME FROM DUAL;

SELECT *FROM USER_RECYCLEBIN;

PURGE TABLE T1;
purge
只清楚oldest scn记录。

 

  1. 恢复案例

SQL> create user nmosdb identified by "123";

用户已创建。

SQL> grant dba,connect,resource to nmosdb;

授权成功。

SQL> connect nmosdb/123

已连接。

SQL> show user

USER 为 "NMOSDB"

SQL>

SQL>

SQL> create table fla01 as select * from dba_objects;

SQL> create table fla01 as select * from dba_objects where rownum<10;

表已创建。

SQL> drop table fla01;

表已删除。

SQL> select count(1) from dba_recyclebin where ORIGINAL_NAME='FLA01';

  COUNT(1)

----------

       1

SQL> flashback table fla01 to before drop;

闪回完成。

SQL> select count(1) from fla01;

  COUNT(1)

----------

         9

  1. 闪回表(flashback dml)

闪回表利用undo表空间里面记录的数据旧映像,可以指定undo表空间的retention guarantee属性保证undo_retention参数范围内闪回。

    1. 闪回表限制

闪回点到闪回时间点之间,表不能发生结构变化,例如truncate等ddl操作。

    1. 闪回表命令

先查询数据库是否存在

Select * from table as of scn xxx;

Select * from table as of timestamp sysdate-1;

进行闪回(开启表的行迁移功能)

 

Flashback table to timestamp to_date();

Flashback table to scn xxxxx;

 

  1. 添加列闪回

SELECT CURRENT_SCN FROM V$DATABASE;

DELETE FROM T1;

COMMIT;

ALTER TABLE T1 ADD ITEM_DATE1 DATE NOT NULL; 不可以

ALTER TABLE T1 ADD ITEM_DATE1 DATE ; 可以

ALTER TABLE T1 ENABLE ROW MOVEMENT;

flashback table t1 to scn 2220504;

-- 初始化参数undo_retention undo_retention=1800 (1800s=0.5h),

若条件允许,可以适当调大此参数。 -- 是否强制保留undo_retention的时间

select tablespace_name, retention from dba_tablespaces where tablespace_name like 'UNDO%'; alter tablespace undotbs1 retention guarantee;

  1. 闪回查询

select * from at as of timestamp to_date() where object_name=’123’

select * from at as of scn 1748494 where object_name='123'—空

select * from at as of scn 1748894 where object_name='123'—20行

select count(1) from t1 as of timestamp systimestamp - interval '5' minute;

select * from nmosdb.aoi_db_config as of timestamp systimestamp - interval '2' minute;
select * from nmosdb.aoi_db_config as of timestamp systimestamp - interval '2' second;
select * from nmosdb.aoi_db_config as of timestamp systimestamp - interval '1' day;
select * from nmosdb.aoi_db_config as of timestamp systimestamp - interval '1' hour;
select * from nmosdb.aoi_db_config as of timestamp systimestamp - interval '1' month;
select * from nmosdb.aoi_db_config as of timestamp systimestamp - interval '1' year;

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

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

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

  1. 恢复案例

SQL> select count(1) from fla01;

  COUNT(1)

----------

         9

SQL> delete from fla01;

已删除 9 行。

SQL> commit;

提交完成。

SQL> select count(1) from fla01 as of timestamp sysdate-1/1440;

  COUNT(1)

----------

         0

SQL> select count(1) from fla01 as of timestamp sysdate-2/1440;

  COUNT(1)

----------

         9

SQL>alter table fla01 enable row movement;

SQL> flashback table fla01 to timestamp sysdate-2/1440;

闪回完成。

SQL> select count(1) from fla01

  2  ;

  COUNT(1)

----------

         9

 

  1. 总结

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;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值