关于闪回
一、闪回的概念
闪回是当发生逻辑错误时,从闪回恢复区中取出在发生逻辑错误之前的数据,并进行恢复。
它包括:闪回数据库(库级闪回),闪回表、闪回删除(表级闪回)。
闪回的查询:闪回版本查询,闪回事物查询,闪回查询(行级闪回)
闪回恢复区:闪回恢复区是记载被修改被数据的,它有一定时间的保存时间,或者会根据闪回空间的大
小来决定保存时间的长短。当然它里面也可以进行保存时间点的设置,确保逻辑错误恢复
到保存时间的那一点。
闪回日志:闪回日志是将改变前的值存放在flashback buffer中,再由 RVWR 进程写入闪回日志文件中
闪回日志不会进行归档,并在停用闪回功能后,日志会被自动清除。
当然重做记录写入到联机日志文件中。
注:闪回需要在数据库归档模式下,闪回日志仅存放于闪回恢复区中
注2:oracle11g中提供了闪回新特性,闪回数据存档(FBDA)
二、关于闪回数据库
闪回数据库:就是当出现逻辑错误时,能够将整个数据库回退到出错前的那个时间点上
-它包括系统管理员删除了用户
-用户截断了表(Truncate)
-用户执行了某个错误的批处理任务,使得多个表的数据发生混乱,我们无法采用闪回表的方
式进行恢复。
-需要在mount模式下进行闪回。
具体操作如下:
① 将数据库配置为归档模式
mount下 SQL>alter database archivelog;
SQL>archive log list;
SQL>alter database open;
②配置闪回恢复区(Flash recovery area简称FRA)
-db_recovery_file_dest_size 闪回恢复区大小
-db_recovery_file_dest 闪回恢复区路径
-db_flashback_retention_target 保留恢复最近多长时间的数据,单位为分钟。默认一天
SQL>alter system set db_recovery_file_dest_size= 5G;
SQL>alter system set db_recovery_file_dest=’/home/oracle/flash’;
SQL>alter system set db_flashback_retention_target=2880;--2天,系统默认是一天
③闪回功能的开启
mount下 SQL>alter database flashback on;
SQL>alter database open;
SQL>select flashback_on from v$database;
FLASHBACK_ON
----------------------
YES
④关于闪回试图
V$flashback_database_stat --用于监视闪回数据库日志中记录闪回数据的开销,
包含24小时的信息,每行代表一个小时的时间间隔,可以确定数据生成的变化。
V$flashback_database_log --记录闪回日志信息,包括最早可以回复的SCN,闪回日志的大小
V$flash_recovery_area_usage --监控闪回恢复区的使用情况。
DBA_FLASHBACK_ARCHIVE_TABLES --查看表修改后的历史记录存储的表名。
1、视图详解:
SQL>desc v$flashback_database_stat;
BEGIN_TIME 一个时间间隔的开始
END_TIME 一个时间间隔的结束
FLASHBACK_DATA 此时间间隔内写闪回日志大小(byte)
DB_DATA 此时间间隔内数据库读写大小(bytes)
REDO_DATA 此时间间隔内输出在线日志的大小(b)
ESTIMATED_FLASHBACK_SIZE 此时间间隔的结束时预估满足保留时间所需要
的空间大小
SQL>desc v$flashback_database_log;
OLDEST_FLASHBACK_SCN 保留的最低系统SCN号
LDEST_FLASHBACK_TIME 最低系统改变的日期时间
RETENTION_TARGET 闪回日志保留时间
FLASHBACK_SIZE 当前闪回日志的大小(b)
ESTIMATED_FLASHBACK_SIZE 预估满足保留时间所需的空间大小(b)
SQL>desc v$flash_recovery_area_usage;
FILE_TYPE 文件类型
PERCENT_SPACE_USED 闪回空间使用率
PERCENT_SPACE_RECLAIMABLE 可回收的闪回空间比率
NUMBER_OF_FILES 在闪回空间中文件的编号
注:查询当前时间,当前的SCN号
SQL>alter session set nls_date_format=’yyyymmdd hh24:mi:ss’;
↑ 用来设置读取当前时间的返回格式
SQL>select sysdate from dual; (当前时间)
↓获取当前的SCN号
SQL>select dbms_flashback.get_system_change_number from dual;
SQL>select dbms_flashback.get_system_change_number scn from dual;
SCN
-------------- 20150923 00:00:00
通过scn_to_timestamp函数将SCN号转换为时间戳:
SQL>select scn_to_timestamp(SCN) timestamp from dual;
timestamp
--------------------
通过timestamp_to_scn可以将时间戳转换为SCN
SQL>select timestamp_to_scn(timestamp) SCN from dual;
⑤关于闪回日志
SQL>show parameter log_archive_format
name type value
---------------- ------------ -----------------
log_archive_format string %t_%s_%r.dbf
%s:日志序列号;
%t:重做线程编号;
%d:数据库ID
%r:RESETLOGS的ID值
⑥实验证明
SQL> create table t(a number,b number);
SQL> create indexe t_indx on t(a);
SQL> insert into t values(1,1);
SQL> commit;
SQL> select dbms_flashback.get_system_change_number from dual;
SQL>insert into t values(2,2);
SQL>commit;
SQL> flashback database to scn 1017109;
以上可以看出,闪回数据库,需要在mount状态下。
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to scn 1017109
SQL> alter database open read only;
SQL> select * from t;
SQL> shutdown immediate;
SQL> alter database open resetlogs;
三、关于闪回表
①概述
闪回表:是将一个错误的表处理,恢复到错误之前。闪回表依赖的是UNDO数据,当表结构发
生改变时,不能进行表闪回,闪回表只闪回错误数据,不会闪回当前的任意状态。
注:闪回表不支持使用SYS用户进行
-
flashback table employees_test
-
2 to timestamp to_timestamp (‘2012-08-02 19:12:20’,‘yyyy-mm-dd hh24:mi:ss’);
②实验证明 SQL> connect ces/123456 SQL> create table a(a number,b number); SQL> insert into a (1,1); SQL> commit; SQL> select dbms_flashback.get_system_change_number from dual; SQL> create index a_dex on a(a); SQL> insert into a(2,2); SQL> commit; SQL> flashback table a to scn 1024985; 以上是因为要对表执行表闪回,需要在该表上允许 row movement(表移动功能) SQL> alter table a enable row movemont; SQL> flashback table a to scn 1024985; SQL> select * from a; SQL> select index_name from user_indexes where table_name=’A’; 注:索引还在,则证明表闪回,只恢复数据,不会改变表对象结构。 但是triggers在闪回表时,是不能使用的,可以使用enable triggers 来闪回表的同时启用triggers.
四、关于闪回删除
①概述
闪回删除:当你删除一张表,数据库不是立刻删除表所占的空间,
数据库会重命名并把它和相关的对象放在回收站(recycalebin)里面,
防止表误删除之后,能够进行恢复,同时需要和表闪回搭配使用。
system的空间中的东西不支持回收站,删掉后不会存放到回收站中。
②实验证明
注:闪回删除表功能,需要在数据库中开启回收站功能,默认是开启的。
SQL> alter system set recyclebin=on scope=spfile;
↑开启回收站功能
↓关闭回收站功能 --不影响原先已经在recyclebin里面的数据。
SQL> alter system set recyclebin=off scope=spfile;
SQL> show parameter recyclebin;
SQL> create tablespace yy datafile ‘/u01/yy.dat’ size 10M
SQL> autoextend on next 1M maxsize unlimited;
SQL> create table yy1(a number,b number) tablespace yy;
SQL> insert into yy1 values(1,1);
SQL> drop table yy;
SQL> show reryclebin;
SQL> flashback table yy1 to before drop;
SQL> select * from yy1;
③实验证明2
SQL> create table zz(i int) tablespace yy;
SQL> insert into zz values(1);
SQL> drop table zz;
SQL> create table zz(i int) tablespace yy;
SQL> insert into zz values(2);
SQL> drop table zz;
SQL> create table zz(i int) tablespace yy;
SQL> insert into zz values(3);
SQL> drop table zz;
SQL> show recyclebin;
SQL> flashback table zz to before drop;
SQL> select * from zz;
SQL> flashback table zz to before drop rename to zz1;
SQL> select * from zz1;
SQL> flashback table “recyclebin name” to before drop rename to zz2;
SQL> select * from zz2;
注:此组实验证明,回收站是按照后来者据上来进行恢复的,同一表名恢复需要更改表名。
注:以下几种drop方式,是不会存储到recyclebin中的
①SQL> drop table table_name purge;
②SQL> drop tablespace ts_name [including contents];
③SQL> drop user user_naem [cascade];
注:关于回收站(recycle bin)的查询
①SQL> select * from dba_recyclebin
↑ dba用来查看所有用户的回收站
↓ 当前用户用来查看自己的回收站
②SQL> select * from user_recyclebin
注:手动回收空间
①SQL> purge {table <name>|index <index_name>}
②SQL> purge tablespace <ts_name> [user <user_name>]
③SQL> purge [user_|dba_] recyclebin
五、关于闪回版本查询
①概述
所谓的版本(version)指的是每次事物所引起的数据行的变化情况,
每次变化就是一个版本。从而可以使我们很清楚地看到数据行的整个变化过程,
这里的变化都是已经提交了的事务引起的变化,没有提交的事务引起的变化不会显
示。闪回版本查询时undo表空间里记录的undo数据。
注:进行闪回版本查询的SQL语句为:
select [Pseudocolumns]……
from ……
version between
{scn | timestamp {expr | minvalue } and {expr | maxvalue }}
[as of {scn | timestamp expr}]
where [Pseudocolumns……]……
其中Pseudocolumns表示的是伪列,如下:
•Versions_starttime:事务开始时的时间。
•Versions_starttime:事务开始的SCN号。
•Versions_endtime: 事务开始时的时间。
•Versions_endscn:事务结束时的SCN号。
•Versions_xid:事务的ID号。
•Versions_operation:事务所进行的操作类型,包括插入(显示为I),
删除(显示为D)和更新(显示为U)。
其中,如果我们希望显示数据行的所有变化,
则使用 version between minvalue and maxvalue
如果显示指定SCN号或者时间点的事务的变化
则使用 as of scn | timestamp expr
②实验证明
SQL> grant execute on dbms_flashback to ces;
SQL> grant select any transaction to ces;
↑ 使用版本查询时的两个权限
SQL> create table t (id number,name varchar2(10)
↑创建测试表
SQL> insert into t values(1,‘hsj’);
SQL> insert into t values(2,’www’);
SQL> commit;
SQL> update t set name=’hsj_u’ where id=1;
SQL> commit;
SQL>delete t where id=1;
SQL>select versions_starttime “VST”,versions_startscn “VSS”,
versions_endtime “VET”,versions_endscn “VES”,versions_xid “VXID”,
versions_operation “VOP”,id,name
from t versions between scn minvalue and maxvalue;
由以上可以看出闪回版本查询,所查询出来的事务先后顺序 “晚→早”,“从大到小”,并能查询T表中所发生的事务类型。
注:闪回版本查询不支持外部表,临时表,X$表(动态性能试图的基表),以及试图。
六、关于闪回事务查询
①概述
闪回事务查询指的是一个试图:falshback_transaction_query.同时它也是一个诊断工具,
利用它能够显示哪些事务引起了数据的变化,并为此提供了供撤销事务的SQL语句。
闪回事务查询利用的是undo表空间里的undo数据。
②实验证明
SQL> create table t(id number,name varchar2(20));
SQL> insert into t values (1,’name1’);
SQL> insert into t values (1,’name2’);
SQL> commit;
SQL> update t set id=2 where name=’name2’;
SQL> commit;
SQL> select operation,undo_sql from flashback_transaction_query
SQL> where table_name=’T’ and table_owner=’CES’;
以上则是对表名为 CES.T,表所属用户CES,
进行的闪回事务查询。可以利用所得到的undo_sql,对表进行还原。
③所要注意点:
1、undo空间的大小,与保留时间
2、在查询时会有空格值出现
OR
详解:
1、这是用于UNDO表空间有限,因此flashback_transaction_query试图中只包含一部分事
务,对于任何所选事务不在显示在撤销表空间的DML,operation列的值是unknown
解决方法:使用闪回查询前,必须先启用重做日志流的其他日志记录。
重做日志流数据时撤销表空间记录的信息的补充,
闪回事务查询时既需要增强的重做信息,也需要撤销表空间的撤销信息。
-- 当除掉UNDO表空间有限后,对日志进行增强及补充
SQL> alter database add supplemental log data;
SQL> alter database add supplemental log data(primary key) columns;
然后执行闪回事务查询语句。
七、关于闪回查询
① 概述:
闪回查询时最基本的闪回功能,直接利用回滚段中的旧数据构造某一个时间的一致性数据版本。
只适合单个表数据恢复查询。对事务中相关多表数据恢复不适合,
无法确保相关数据的参照完整性(在于执行的是DML语句)。
②闪回查询的语法
SQL> select …… from <table_name> as of scn ……where ……
SQL> select …… from <table_name> as of timestamp …… where ……
③实验证明
SQL> create table t (id number,name varchar2(20));
SQL> insert into t values (1,’name1’);
SQL> commit;
SQL> insert into t values(2,’name2’);
SQL> commit;
SQL> select dbms_flashback.get_system_change_number from dual;
SQL> insert into t values (3,’name3’);
SQL> commit;
SQL> select * from t;
SQL> select * from t as of scn 1069009;
OR
SQL> select * from t as of timestamp(timestamp)
SQL> select * from t as of timestamp(SYSTIMESTAMP-INTERVAL ’分钟’ MINUTE)
↑闪回到多少分钟前
SQL> select * from t ;
以上证明,闪回查询只适用于查询,并不会正真的进行闪回。
利用闪回进行Delete恢复的语法:
INSERT INTO T_name SELECT * FROM T_name AS OF SCN……
八、关于闪回数据归档(FBDA)
①概述
闪回数据归档时一个新的数据库对象,其中保留一个或多个表的历史数据,
并具有自己的数据存储保留和清洗策略。
数据库将buffer cache中的原始数据写到undo表空间中作为undo数据,
而FBDA这个后台进程将收集和写这些原始数据到闪回数据归档区,
用于另外一个创建一份所有表数据的历史。
1、闪回数据归档和表之间是一对多的关系。
2、在一个数据库中可以使用多个闪回数据归档以满足不同期限的数据保留策略。
3、可以指定闪回归档区存在于某一个表空间中(ASSM表空间,普通表空间)。
4、新的后台进程FBDA从buffer cache收集原始数据记录在闪回归档指定表空间里。
5、oracle自动清洗过期的闪回归档数据。
6、闪回归档区是一个新的对象,拥有源表的所有列及时间簇。
7、启用闪回归档区后,undo空间只有在FBDA后台进程完全将相应的undo数据写入历史表后才
能变得可以回收。
②相应权限
SQL> select * from dba_sys_privs where privilege like ‘%FLASH%’;
主要是FLASHBACK ARCHIVE ADMINISTER这条权限,才能创建闪回归档。
其中关于设置默认数据归档区的权限,是用sysdba直接去设置的。
③数据闪回归档的限制
1、已经启用闪回的表,不能使用DDL命令drop column(11g R2版本可以)
2、DROP table
3、TRUNCATE TABLE(11g R2版本可以)
4、RENAME TABLE(11Gg R2版本可以)
注:如有违反会报:ora-55610的错误。
④数据归档区的三大系统监控表应用
1、查看哪些表已经启用了闪回归档
dba_flashback_archive_tables;
SQL> desc dba_flashback_archive_tables;
TABLE_NAME 表名
OWNER_NAME 表属用户名
FLASHBACK_ARCHIVE_NAME 数据归档区名
ARCHIVE_TABLE_NAME 历史源表改变后的存储表名
STATUS 状态(启用后:ENABLED)
2、查看数据库中所有的闪回数据归档
dba_flashback_archive
SQL>desc dba_flashback_archive
OWNER_NAME 所属用户
FLASHBACK_ARCHIVE_NAME 数据闪回归档名
FLASHBACK_ARCHIVE# 数据闪回归档号
RENTENTION_IN_DAYS 设置二的数据闪回归档保存时间
CREATE_TIME 创建时间
LAST_PURGE_TIME 手动或自动空间回收时间
STATUS 状态(用户默认的数据闪回归档:DEFAULT)
3、查看有关闪回数据归档所使用的表空间的信息
dba_flashback_archive_ts
SQL>desc dba_flashback_archive_ts
FLASHBACK_ARCHIVE_NAME 数据闪回归档名
FLASHBACK_ARCHIVE# 数据闪回归档号
TABLESPACE_NAME 所属表空间
QUOTA_IN_MB 所限额度是多少(M)
②实施流程
1、创建表空间
SQL> create tablespace flash_tbs1
SQL> datafile ‘/u01/app/oracle/oradata/ora11/f_tbs1’ size 1024M;
2、创建数据闪回归档区
SQL> create flashback archive flash1 tablespace flash_tbs1 quota 1024M
SQL> retention 5 year;
↑ 将数据闪回归档区 flash1 放入到 flash_tbs1表空间中.并设置限额与保存期限
3、创建表时指定其表的数据闪回区
SQL> create table t1(id int,name varchar2(10)) flashback archive flash1;
OR
SQL> alter table t1 flashback archive
--为表启用数据闪回归档,没有指定表示使用数据库默认的数据闪回归档区
SQL> alter table t1 flashback archive flash1;
--为表启用闪回数据归档,指定在特定的闪回数据归档区来存储表的变化
4、查看t1表的闪回数据归档区
SQL> select * from dba_flashback_archive_tables;
在使用数据闪回归档前,必须设置默认闪回数据归档
SQL> alter flashback archive flash1 set default;
--此操作在SYS用户下操作
查看默认闪回数据归档区
SQL> select flashback_archive_name,status from dba_flashback_archive;
注:值得一提的是每个用户的默认数据闪回归档区只仅只有一个。
如果需要重新创建一个默认的数据闪回归档区
SQL> drop flashback archive flash1; --然后进行重新创建。
当然可以禁用表的数据闪回归档区
SQL> alter table t1 no flashback archive;
5、插入T1表数据
SQL> begin
SQL> for i in 1..100 loop
SQL> insert into T1 values(i,’gyj’||i);
SQL> commit;
SQL> end loop;
SQL> end;
SQL> /
SQL> select count(*) from t1;
查看T1表所在的数据闪回归档历史表
SQL> select * from dba_flashback_archive_tables;
SQL> select count(*) from sys_fba_hist_73462;
注:此处说明在执行插入语句的时候,数据闪回区是不会进行记录的
6、删除T1表数据
SQL> select current_scn from v$database;
SQL> delete from T1;
SQL> commit;
SQL> select current_scn from v$databse;
SQL> select count(*) from T1 as of scn 1086507;
SQL> select count(*) from sys_fba_hist_73462; (需要等会儿)
SQL> select count(*) from sys_fab_hist_73462
注:这是因为FDBA的处罚时间所导致的
6、删除闪回归档数据
SQL> drop flashback archive flash1;
7、数据闪回归档其操作
SQL> alter flashback archive flash1 add tablespace tb1; 添加表空间
SQL> alter flashback archive flash1 remove tablespace tb1; 删除表空间
SQL> alter flashback archive flash1 modify tablespace flash_tbs1 quota 2048;添加配额
SQL> alter flashback archive flash1 modify retention 3 year;增加保留期限
SQL> alter flashback archive flash1 purge all; 清除所有
SQL> alter flashback archive flash1
SQL> purge before timestamp(systimestamp -interval ’2’ day);清除2天前的
’2’ second 2秒
’2’ month 2个月
SQL> alter flashback archive flash1 purge before scn SCN号;清除多少之前的