Flashback-闪回技术
oracle的闪回技术,允许倒转(rewind)数据库或者部分数据库到过去的某个时间点,而不用求助于备份文件和归档日志文件
的传统恢复手段。闪回技术是oracle提供的几个闪回功能的总称。
闪回技术:闪回查询、闪回版本查询、闪回事物查询、闪回表、闪回归档、闪回删除、闪回数据库。
首先介绍两个函数
scn_to_timestamp 和timestamp_to_scn
可以将时间戳和系统更改好进行相互转换的两个函数。oracle保存了一个时间戳和SCN的一个映射关系,这个映射关系的保留时间,与undo_retention初始化参数一样长。
闪回查询--Flashback Query
以表为单位,查询其过去的值为闪回查询。
共有两种风格:
1、select 命令的as of 子句
2、PL/SQL的dbms_flashback包
之所以可以查看过去,是因为在撤销数据里,保留了旧数据。
撤销数据的保留策略取决于:
1、初始化参数undo_retention的值,单位为秒。默认为900秒。--该参数仅仅为一个建议,能不能保存到undo_retention参数规定的时间,还得看其他因素。
SQL> show parameter undo_retention;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 900
2、undo表空间是否设置了自动增长,若是自动增长则undo_retention参数的保留建议能最大程度的采纳。
select autoextensible from dba_data_files
where tablespace_name=(select value from v$parameter where name='undo_tablespace');
AUT
---
YES
--假如一个不合理的undo_retention配置和undo自动增长,则可能会打造出一个很大的undo表空间。
3、undo表空间是否绝对尊重undo_retention配置的参数,将撤销数据保留undo_retention规定的时间。
默认情况数据库不尊重900s以上的任何设置。即nogarantee。
SQL> select retention from dba_tablespaces where tablespace_name='UNDOTBS1';
RETENTION
-----------
NOGUARANTEE
--使用alter tablespace可以修改表空间的retention属性,使之绝对尊重undo_retention的设置。
SQL> alter tablespace undotbs1 retention guarantee;
Tablespace altered.
配置了绝对尊重,加上不合理的undo_retention 和表空间自动增长...会打造成一个超级巨无霸undo表空间。
4、数据库中的事物量
闪回时间点查询
select ... as of ...
SQL> select * from scott.dept as of timestamp sysdate-2/1440;
SQL> select * from scott.dept as of scn 1373842;
SQL> select * from scott.dept as of scn timestamp_to_scn(sysdate-5/1440);
dbms_flashback
另外一种方式,使用dbms_flashback的enable_at_time 或者enable_at_scn存储过程锁定一个会话级别的闪回时间目标,进入闪回模式,随后
的查询可以省内 as of 也能达到效果。直到dbms_flashback.disable存储过程关闭闪回模式。
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '10' minute);
PL/SQL procedure successfully completed.
--如果此时访问sysdate,systimestamp是当前时间,而不是静止在10分钟之前。
--另外sys用户不能调用enable_at_time和enable_at_scn
--变化仅仅改变在会话级
这时,查询不需要写 as of
SQL> select * from scott.dept;
SQL> exec dbms_flashback.disable; --关闭会话级时间点闪回查询
闪回版本查询 Flashback Versions
闪回版本查询可以贯穿一定长度的时间窗口。返回该时间窗口内不同时间点的数据。语法格式是表名后 加上 versions between;
SQL> select deptno,loc from scott.dept versions between timestamp(sysdate-20/1440) and maxvalue where deptno=20;
DEPTNO LOC
---------- -------------
20 CD
20 bj
20 DALLAS
为了看清这些先后顺序,可以查询使用闪回版本查询特有的伪列
select
versions_xid,versions_startscn,versions_endscn,deptno,loc,versions_operation
from
scott.dept
versions between timestamp(sysdate-20/1440) and maxvalue where deptno=20;
VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN DEPTNO LOC V
---------------- ----------------- --------------- ---------- ------------- -
09000200AF030000 1375555 20 CD U
06001400A2030000 1374883 1375555 20 bj U
1374883 20 DALLAS
闪回版本中,能够使用的伪列:
versions_xid --记录指定版本的事务的唯一标识符
versions_startscn --记录的起始SCN号
versions_endscn --记录的终止SCN号
versions_operation --记录的操作类型(DML操作,I表示插入,U表示更新,D表示删除)
versions_starttime --记录被修改的起始时间
versions_endtime --记录被修改的终止时间
闪回事物查询
闪回事物查询有别与闪回查询的特点有3个:
1、其正常工作不仅需要撤销数据,而且需要事先启动最小补充日志。(supplemental log)
2、返回的结果不是以前的旧数据,而是能够将当前数据修改成以前数据的撤销SQL(UNDO SQL).
3、集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过as of 或者versions between查询。
打开最小补充日志:
SQL> alter database add supplemental log data;
Database altered.
SQL> select versions_xid,deptno,loc,versions_startscn,versions_endscn,versions_operation from scott.dept versions between timestamp (sysdate-5/1440) and maxvalue where deptno=20;
VERSIONS_XID DEPTNO LOC VERSIONS_STARTSCN VERSIONS_ENDSCN V
---------------- ---------- ------------- ----------------- --------------- -
05000F005C040000 20 GA 1376849 U
0A000900B8020000 20 SN 1376763 1376849 U
20 CD 1376763
可以看出,在sysdate-5/1440 到查询的时候deptno=20的loc值为'CD',
从SCN 1376763 到1376849 更新为'SN' ,然后又从1376849 更新为了 'GA' ,VERSIONS_XID 对于了每个事物的事物号。
得到想要闪回的事物的xid,然后通过flashback_transaction_query查询出对应的UNDO SQL.
SQL> select undo_sql from flashback_transaction_query where xid='05000F005C040000';
UNDO_SQL
--------------------------------------------------------------------------------
update "SCOTT"."DEPT" set "LOC" = 'SN' where ROWID = 'AAAR3vAAEAAAACHAAB';
--将UNDO_SQL复制执行,闪回事物查询。
SQL> update "SCOTT"."DEPT" set "LOC" = 'SN' where ROWID = 'AAAR3vAAEAAAACHAAB';
1 row updated.
SQL> select * from scott.dept where deptno=20;
DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH SN
--已经由'GA' 闪回为旧值'SN'了。
闪回事物--Flashback Transaction
闪回事物又叫撤销事物,能够撤销一个或多个事物的修改。其功能是由一个DBMS_FLASHBACK.TRANSACTION_BACKOUT的存储过程实现。
闪回表--Flashback Table
flashback table 能够以表为单位,将数据返回至过去的某个时刻。闪回表也是利用撤销数据,因此能够闪回到过去多长时间,也取决之前4个保留策略影响因素。
注意,闪回表之前,应该对要闪回的表开启 enable row movement
SQL> alter table scott.dept enable row movement;
Table altered.
将表闪回至5分钟之前
SQL> flashback table scott.dept to timestamp(sysdate-5/1440);
Flashback complete.
--TO SCN
SQL> flashback table scott.dept to SCN 134789;
Flashback complete.
有时候有外键参考关系的表,需要一起闪回至同一个时刻
SQL> flashback table scott.dept ,scott.emp to timestamp(sysdate-5/1440);
Flashback complete.
闪回表注意事项:
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.flashback table 属于ddl命令,所以自带提交。
闪回删除--Flashback Drop
FLASHBACK DROP 特性允许在不丢失任何数据库的情况下将指定的表恢复至其被删除的时间点,并保持数据库为当前状态。闪回删除并不是真正的删除表,而是把该表重命名并放入回收站,类似于Windows的回收站一样。当某个活动对象需要使用该表所占用的空间时,该表才会被真正删除。只要空间未被复用,该表即可恢复。闪回删除 flashback drop 是值对 drop table的撤销。
主要讲述了FLASHBACK DROP特性以及闪回特性中回收站(RECYCLEBIN)的管理。
一、FLASHBACK DROP 的功能
将先前删除的表恢复到删除之前的状态
恢复该表的索引以及触发器,授权
恢复该表的约束,包括唯一约束、主键约束、非空约束。外键约束不可恢复
可以实现基于系统和基于会话的flash drop操作
alter system set recyclebin = on | off;
alter session set recyclebin = on | off;
drop table(oracle 10g)命令并不真正删除表,在内部被映射为rename命令,即是将其重命名之后放入回收站。
新建一张表测试
SQL> create table scott.test_drop (id_no number);
Table created.
闪回表
SQL> flashback table scott.test_drop to before drop;
Flashback complete.
闪回之后:
表的外键会消失,索引,约束名称是删除后,系统在回收站为表分配的名称,假如在各个删除的表上有个索引,闪回表之后,看一看索引的名称
SQL> SELECT ORIGINAL_NAME,OBJECT_NAME,TYPE FROM DBA_RECYCLEBIN;
ORIGINAL_N OBJECT_NAME TYPE
---------- ------------------------------ ----------
TEST_DROP_A BIN$3ifCwL78d43gQAB/AQAS5w==$0 INDEX
TEST_DROP BIN$3ifCwL79d43gQAB/AQAS5w==$0 TABLE
闪回表时,与表相关的索引,约束的一起被闪回。
SQL> flashback table scott.test_drop to before drop;
Flashback complete.
查看闪回回索引情况:
SQL> select index_name from dba_indexes where table_name ='TEST_DROP';
INDEX_NAME
------------------------------
BIN$3ifCwL78d43gQAB/AQAS5w==$0
发现索引还是表被删除后,系统为索引分配的系统名称,因此需要手动将索引名称改回。
Index altered.
表上的约束同样处理。
回收站的管理
每个用户都拥有自己的回收站,且可以查看在自己模式中删除的表
通过dba_recyclebin查看所有回收站对象。普通用户可以通过show recyclebin快捷方式查看自身的回收站。
使用purge命令可以永久删除对象,回收空间
purge命令的几种常用形式
drop table tbname purge --直接删除表,而不置于回收站
purge table tbname --清除回收站中的tbname表
purge index idx_name --清除回收站中的索引idx_name
purge tablespace tablespace_name --清除该表空间中所有已删除的对象
purge tablespace tablespace_name user user_name --清除表空间中指定用户删除的对象
purge user_recyclebin --清除指定用户已删除的所有对象
purge dba_recyclebin --清除所有已删除的对象
DBA_FREE_SPACE视图上的查询,被告知以前这些“删除”的对象占用的空间现在是可用的,但是oracle并为立马收回空间。而是等到需要时,选择时间收回。如果一个数据文件时自动增长的,那么在这些潜在表空间被回收利用之前,数据文件不会自动增长,假如数据文件已经自动增长了,那么说明回收站里的对象已经被清除,其占用的空间也已经被回收利用了。
使用drop user ...cascade 删除用户,直接删除用户的所有对象,并且会自动的从回收站清楚该用户的所有对象。
闪回数据归档--Flashback Data Archive
闪回数据归档是oracle 11g新特性。闪回查询等需要用到撤销数据的闪回,都会受到撤销数据保留时间的限制。
闪回归档的工作原理是将原本保存在undo表空间的撤销数据额外的以一种历史表的形式保存在指定的普通表空间中。并且不想undo_retention那样是一个影响整个数据库的设置,闪回数据归档可以只为特定的表服务。因为可以指定存储感兴趣的表的数据。
闪回数据归档区:
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。
每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。
例如可以配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。 以后如果将表放到对应的闪回数据归档区,则就按照该归档区的保留策略来保存历史数据。
闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。
创建一个闪回数据归档区
SQL> create flashback archive default flashback_1 tablespace users02 quota 5m retention 1 year;
Flashback archive created.
将需要数据归档的表指定到 一个闪回数据归档区
SQL> alter table scott.dept flashback archive flashback_1;
Table altered.
如果普通用户执行 需要flashback archive 权限
SQL> grant flashback archive on fda1 to user_name;
用法:
select deptno,loc
from scott.dept
as of timestamp to_timestamp('2013-03-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss');
--用法和闪回查询一样
管理闪回归档区
--指定闪回存档为数据库默认闪回存档:
alter flashback archive falshback_1 set default;
--给存档添加一个表空间:
alter flashback archive flashback_1
add tablespace flash_tps quota 5g; --表空间flash_tps必须存在。
--更改保留时间:
alter flashback archive flashback_1 modify retention 3 yesrs;
--从存档中清除数据
alter flashback archive flashback_1 purge all;
--从存档中清除一周前数据
alter flashback archive flashback_1 purge before timestamp (systimestamp- interval '1' day);
对表打开闪回归档,可以再创建表的时候指定,也可以建表后修改。
create table table_name
(xxxx xxxx,
.
.
) flashback archive flashback_1
或者:
alter table table_name flashback archive;
alter table table_name no flashback archive;
与闪回存档相关几个表
dba_flashback_archive --显示关于闪回存档的信息
dba_flashback_archives_ts --显示关于驻留闪回数据存档的表空间的信息
dba_flashback_archive_tables --显示关于允许闪回数据存档的表的信息
可以管理查询,查看有相关信息。
SQL>
select
a.flashback_archive_name fda_name,
a.retention_in_days days,
ts.tablespace_name ts,
ts.quota_in_mb,
t.archive_table_name
from
dba_flashback_archive a,
dba_flashback_archive_ts ts,
dba_flashback_archive_tables t
where
a.flashback_archive_name = ts.flashback_archive_name
and a.flashback_archive_name = t.flashback_archive_name
and t.owner_name = 'SCOTT'
and t.table_name = 'DEPT';
FDA_NAME DAYS TS QUOTA_IN_MB ARCHIVE_TABLE_NAME
---------- ---- -------------------- ---------------------------------------- ------------------------------
FLASHBACK_1 365 USERS02 5 SYS_FBA_HIST_73199
其中: ARCHIVE_TABLE_NAME就是 用来存储scott.dept闪回归档数据的历史表名:SYS_FBA_HIST_73199 此表不能直接查询。
启动了闪回数据归档的表支持绝大多数的DDL命令,但是在执行少数ddl命令的时候 会报“ORA-55610: Invalid DDL statement on history-tracked table”错误。
比如:alter table …shrink space ,alter table … move , alter table … exchange partition 等等。
以alter table … exchange partition为例:
创建一张分区表和一个堆栈表测试
分区表
create table hr.rpt (id number,name varchar2(30))
partition by range (id)
(
partition p1 values less than (100) tablespace users,
partition p2 values less than (200) tablespace users,
partition p3 values less than (maxvalue) tablespace users);
堆栈表
SQL> create table hr.source (id number, name varchar2(30)) tablespace users;
在hr.rpt表上开启闪回数据归档
SQL> alter table hr.rpt flashback archive flashback_1;
然后交换分区、报错
SQL> alter table hr.rpt exchange partition p3 with table hr.source;
alter table hr.rpt exchange partition p3 with table hr.source
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
解决:为了达到目的,可以将归档的表 暂时与它对应的历史表分离,执行完了ddl命令,再关联上。
SQL> select archive_table_name from dba_flashback_archive_tableswhere owner_name='HR' and table_name='RPT';
ARCHIVE_TABLE_NAME
-----------------------------------------------------
SYS_FBA_HIST_74619
然后 用dbms_flashback_archive 的 disassiociate_fba过程 将RPT表与其历史表 SYS_FBA_HIST_74619分离。
SQL> exec dbms_flashback_archive.disassociate_fba('HR','RPT');
然后再执行刚刚报错的ddl命令
SQL> alter table hr.rpt exchange partition p3 with table hr.source;
alter table hr.rpt exchange partition p3 with table hr.source
最后使rpt表与其历史表重新结合
SQL> exec dbms_flashback_archive.reassociate_fba('HR','RPT');
--凡是遭遇到ORA-55610: Invalid DDL statement on history-tracked table错误的,都可以使用此种方法来解决。
闪回数据库--Flashback Database
一、flashback database特性
Flashback Database 功能非常类似于RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志。
比RMAN更快速和高效。 因此Flashback Database 可以看作是不完全恢复的替代技术。 但它也有某些限制:
(1)Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择。
(2)如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,
这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来, 然后利用Flashback Database 执行剩下的Flashback Datbase。
(3)如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。
(4)使用Flashback Database锁能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN。
二、flashback database的组成
闪回数据库需要两种日志,闪回日志和重做日志,其中,闪回日志好比重做日志的反作用。闪回日志的记载于重做日志的记载相反。
闪回日志的保存路径FRA,其保留期限由 db_flashback_retention_target决定,单位分钟。超出期限的闪回日志都将被自动删除。
SQL> show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
db_flashback_retention_target integer 1440
修改db_flashback_retention_target保存期限
SQL> alter system set db_flashback_retention_target=2880;
System altered.
可以通过v$database视图的flashback_on查看数据库是否开启了数据库归档。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
如果为开启,可以启动,但是必须将数据库处于归档模式,才能开启flashback database
SQL> alter database flashback on;
Database altered.
一旦开启了数据库归档,在FRA的flashback目录下,就有一个.flb 文件,改文件就是闪回日志。
在一下情况 可以使用闪回数据库:
1、找回某个被删除的模式
2、在某个用户错误影响到整个数据库
3、在错误的截断一个表 truncate
4、在一个批处理作业只执行了一部分更改时
可以在sql*plus 或者rman 发布flashback 命令,唯一差别是:RMAN 将自动减少所需的归档日志。
而在sqlplus中,必须使用 set autorecovery on,否则 必须提供归档日志。
闪回数据库命令
1、让数据库处于mount状态。
2、闪回数据库 flashback database to timestamp xx 或flashback database to scn nn;
3、打开数据库 alter database read only --建议先以此种方式打开数据库,来检查此次闪回数据库是否达到了预期的结果。
4、如果与预期结果一样 alter database open resetlogs 方式打开数据库
--数据库mount时,如果是单实例,则直接startup mount ;如果是多实例的,必须用startup mount exclusive开加载数据库。
如果闪回结果不满意,时间短了 或者长了,都可以重新再让数据库mount 然后再次闪回,并以 read only来打开数据库检查是否是预期的结果。可如此反复进行。
在执行闪回数据库之前,可先通过v$flashback_database_log查看能将数据库最远闪回到什么时间;
SQL> desc v$flashback_database_log;
Name Null? Type
----------------------------------------------------------------------------------------------------------------- --------
OLDEST_FLASHBACK_SCN NUMBER
OLDEST_FLASHBACK_TIME DATE
RETENTION_TARGET NUMBER
FLASHBACK_SIZE NUMBER
ESTIMATED_FLASHBACK_SIZE NUMBER
SQL> select oldest_flashback_scn,oldest_flashback_time,flashback_size,estimated_flashback_size from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FL FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- --------- -------------- ------------------------
1394146 02-JUN-13 8192000 124526592
oldest_flashback_scn,和oldest_flashback_time是能够闪回到最早得SCN和时间。
基于复原点的闪回
复原点(restore point) 为SCN的别名,它不需要搜索或记录SCN 或时间戳,如果正在要进行一个修改大量数据的程序包,那么在执行之前,可以要么备份,也可以设立一个复原点,以保证需要时,能够回到修改之前的状态。创建复原点之后,在传统恢复手段中时间点恢复也可以使用复原点。
复原点分普通复原点(ordinary restore point)和有保证的复原点(guarantee restore point)
普通复原点只是在闪回或恢复操作中指定以前的SCN或时间点以提供方便,因此并不能保证数据库在所有情况下都能成功保留闪回数据库操作需要的闪回日志。--闪回操作时,依赖闪回日志。
而有保证的复原点,能保证把数据库倒转(rewind)至复原点标识的SCN号或者时间点,因此,需要FRA有足够的空间,来保存有保证复原点存储的日志。
有保证的复原点不依赖闪回日志,即便在关闭闪回日志的情况下,也能创建有保证的复原点。有保证的复原点与闪回数据库用到的闪回日志是相独立的机制,因此,就算在不启动闪回日志,也可以使用有保证的复原点,但是前提是必须配置FRA,归档模式。
如果使用有保证的复原点,oracle将不会删除创建复原点之后创建的闪回日志。因此,如果创建了有保证的复原点,闪回日志是打开的,则最终可能会因为闪回日志填满FRA导致数据库停止。前面已经阐明,有保证的复原点机制与闪回日志相互独立的,因此在创建有保证的复原点之后 可以关闭闪回日志。
创建复原点:
SQL> create restore point point_1;
创建有保证的复原点:
SQL> create restore point point_2 guarantee flashback database;
删除复原点;
droprestorepointpoint_1;
droprestorepointpoint_2;
查看数据库中的复原点:
SQL>select name ,scn,storage_size,time,guarantee_flashback_database from v$restore_point;
闪回数据库:
SQL> flashback database to restore point test_2;
总结:
闪回查询,闪回版本查询,闪回表都依赖rowid定位“过去” 和“现在”的行如果执行过alter table ...move 或 alter table ... shrink space,那么再次执行闪回操作将会保错:ORA-01466
闪回事物依赖撤销数据和重做日志如果调用dbms_flashback.trsnsaction_backout时所需的日志不存在,则会报错:ORA-00308(归档日志缺失) 或ORA-01555:snapshot too old (撤销数据缺失)的错误。
有复原点的闪回:普通复原点依然依赖闪回日志来闪回数据库,普通复原点仅仅作为过去制定的SCN或时间点的一个别名,提供方便。
而有保证的复原点,保存日志的方式与闪回日志机制独立,闪回不依赖于闪回日志。因此,只要有足够的空间保存有保证复原点存储的日志,数据库总能够倒转回创建复原的时刻。而且,即便在闪回日志关闭的情况下,也能够创建有保证的复原点。建议在闯建了有保证的复原点之后,关闭闪回日志。