1、闪回技术
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务
级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可
以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等
2、分类
闪回分为表级别,数据库级别,事物等级别。这里只介绍表和数据库常用的。
其中表闪回可以在线操作,而数据库需要在mount状态下了
并且闪回之后的工作全部丢失,其中flash batabase利用了闪回buffer,并且启用了一个单独的进程rwr,flashbacklog并不是记录所有的快的改变,所以使用这个特性的时候,数据库必须是在archivelog模式下
3、设置
1) 闪回表
SQL>show parameter undo;
NAME TYPE VALUE
----------------------------------------------- ---------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
需要保证undo_management = auto 另外还有就是wndo_retention的值说明了闪回查询恢复的时间保留值,我这是15分钟,这个是默认值,另外可以设置
Alter system set undo_retention= 3600是一小时
这样可以通过如下方法查询修改之前的数据,
select * from table1 as of timestamp (systimestamp - interval '60' second);
select * from table1 as of timestamp to_timestamp('2012-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS');
select current_scn from v$database;
select * from table1 as of scn 66631220;
这里还有另外一种查询闪回数据的方式
1,使用sys登陆授权闪回的账户,grant execute on sys.dbms_flashback to xxx
2,可以使用基于时间的闪回或者scn的闪回,execute dbms_flashback.enable_at_time(sysdate-10/1440);然后使用一个查询语句即可查询10分钟前的数据
或者使用execute dbms_flashback.enable_at_system_change_number(current_scn); -- 需要查询当前的scn: select current_scn from v$database;或者select dbms_flashback.get_system_change_number() from dual;
3,使用,execute dbms_flash.disable()取消闪回即可;
2) 闪回数据库
查看数据库是否归档,并且是否开启闪回特性
SQL>select log_mode,open_mode,flashback_on from v$database;
LOG_MODE OPEN_MODE FLASHBACK_ON
---------------------- ------------------
ARCHIVELOG READWRITE YES
如果没有启用的话使用alter database flashback on
查看闪回目录和闪回空间
SQL>show parameter db_recovery
NAME TYPE VALUE
----------------------------------------------- ------------------------------
db_recovery_file_dest string D:\oracle\product\10.2.0\db_1/
flash_recovery_area
db_recovery_file_dest_size big integer 8G
查看闪回保留时间,可以自己增大
SQL> show parameter db_flashback
NAME TYPE VALUE
----------------------------------------------- -------
db_flashback_retention_target integer 1440
查看sga中闪回区大小
SQL>select * from v$sgastat where name like 'flashback%';
POOL NAME BYTES
-------------------------------------- ----------
shared pool flashbackgeneration buff 3981204
4、应用
使用格式
FLASHBACK[STANDBY] DATABASE [<database_name>] TO [BEFORE] SCN <system_change_number> --基于SCN闪回
FLASHBACK [STANDBY] DATABASE[<database_name>] TO [BEFORE]TIMESTMP <system_timestamp_value>--基于时间戳闪回
FLASHBACK [STANDBY] DATABASE[<database_name>] TO [BEFORE]RESTORE POINT <restore_point_name>--基于时点闪回
1) 使用基于时间戳闪回
SQL>create table a(id number);
表已创建。
SQL>insert into a values(1);
已创建 1 行。
SQL>commit
2 /
提交完成。
SQL>drop table a;
表已删除。
SQL>shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>startup mount
ORACLE 例程已经启动。
TotalSystem Global Area 293601280 bytes
FixedSize 1248600 bytes
VariableSize 96469672 bytes
DatabaseBuffers 188743680 bytes
RedoBuffers 7139328 bytes
数据库装载完毕。
SQL>flashback database to timestamp
2 to_timestamp('2013-12-30 19:13:20','yyyy-mm-dd hh24:mi:ss');
闪回完成。
SQL>alter database open resetlogs;
数据库已更改。
然后查询数据库,将会是之前的状态
2) 基于SCN的闪回
SQL> select current_scn from v$database; --获取当前的SCN号
然后操作一样
SQL> flashback database to scn XXX
打开数据库
3) 基于闪回点的
create restore point point1; --先创建闪回点
然后操作一样
最后
flashback database to restore point point1;
打开数据库
3、回收站
在使用过程中遇到一个现象,我觉得有必要记录下,就是回收站的
查看开启状态
Show parameter recyclebin
NAME TYPE VALUE
------------------------------------ -----------------
recyclebin string on
另外注意如果创建的对象在系统表空间的时候,你drop一个表等操作之后是不妨到回收站的,
另外以下情况将不使用回收站
1、 drop user username cascade
2、 drop table table1 purge
3、 Drop tablespace ts_name including contents
4、 使用flashback命令---清空回收站