ORACLE数据库flashback使用手册
1 概述
对于oracle数据库flashback技术,主要包含闪回删除(flashback drop),闪回表(flashback dml)和闪回数据库(flashback database),本文主要针对闪回删除,和闪回查询进行分析,以及阐述操作步骤,在应对生产环境造成的误操作进行恢复提供应急恢复方案。
如果使用drop table指定删除表,该表不会从数据库中立刻删除,而是保持在原表位置,但是将删除的表重命名,并将删除的表存储到回收站中,回收站中记录被删除表新名字和原名字,显然此时被删除表所占用的空间没有被立即释放,变成数据库中可用的潜在空间,保留一段时间,知道回收站空间不足或使用purge指定删除回收站内容。
回收站是一个逻辑结构,删除表后,物理上该表没有被删除,但是它所占用的空间回收空闲列表上,也就是可用空间。
- 闪回删除限制
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: 对象不在回收站中
- 闪回删除命令
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记录。
- 恢复案例
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
- 闪回表(flashback dml)
闪回表利用undo表空间里面记录的数据旧映像,可以指定undo表空间的retention guarantee属性保证undo_retention参数范围内闪回。
-
- 闪回表限制
闪回点到闪回时间点之间,表不能发生结构变化,例如truncate等ddl操作。
-
- 闪回表命令
先查询数据库是否存在
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;
- 添加列闪回
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;
- 闪回查询
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语句,指定一个早于当前时间的时间点。
- 恢复案例
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
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;