使用oracle数据库时,难免会碰到一些问题:
例: 1. 如何回滚已经commit了的数据
2. 如何查询已经被覆盖掉的数据(update), 或者被delete了的数据
3. 如何将数据恢复到某个时间点
这时我们就可以使用Flashback相关语句解决相关问题了
关于Flashback (闪回):
从9i到10g到最新的11.2g, oracle对Flashback功能进行了进一步的扩展,利用Flashback我们可以做到:
1. 闪回查询 (flashback query)
- 闪回查询
- 闪回版本查询 (flashback versions query)
- 闪回事务查询 (flashback transaction query)
2. 闪回数据 (flashback data)
- 闪回表 (flashback table)
- 闪回删除 (flashback drop)
- 闪回数据库 (flashback database)
- 闪回归档 (flashback data archive)
Oracle 闪回的设置:
闪回区必须指定:
DB_RECOVERY_FILE_DEST_SIZE -- 闪回区大小
DB_RECOVERY_FILE_DEST -- 闪回区的路径
数据库的闪回默认是关闭的,需要手动开启。
SQL> select flashback_on from v$database; -- 查看闪回状态
SQL> shutdown immediate;
SQL> startup mount; -- 在mount状态下设置闪回
SQL> alter database flashback on; -- 设置闪回打开
SQL> alter database open;
一、闪回查询 ( flashback query )
1. Flashback Query 通过undo表空间回滚段,利用一致性的方法来查询用户需要的数据
2. 作用范围:查找指定时间点被(delete,update) 的数据, 只是做查找操作,如果想恢复那么就要使用
flashback table table_name to ... 命令
3.相关参数:
- 查询出来的数据存活时间受 undo_retention(默认为900秒)影响
- 闪回时间受undo表空间大小的影响
- 查询的仅仅是快照,并不能修改当前状态
- 基本语法:
select * from table_name as of timestamp to_timestamp ('具体时间'); -- 基于时间片查询
select * from table_name as of scn 具体scn号; -- 基于scn号查询
4. 原理:
简单的说就是将以前被修改,删除了的数据,通过开启Flashback 模式,回到我们需要回到的时间来查看数据,
在undo_retention该变量设置的时间过后,该镜像数据会自动被清除.相当于查看的是一个镜像数据。
一种方式是利用scn号来查看镜像数据, 另一种是通过查找时间片来查询镜像数据。
案例1:闪回查询
1. 闪回某个时间点表中的数据 -- 某个时间点表中的快照
注:查询之前需要先设置 允许行迁移 ( 因为闪回之后行的物理位置可能发生改变 )
alter table t enable row movement;
案例2:闪回版本查询
闪回版本查询:允许查询在一段时间内行做的改变 (insert 、update 、delete)
1. 创建表,并进行操作
2. 查询行做的改变(基于时间戳)
注:D表示delete语句、U表示update语句、I 表示insert语句。
VERSIONS_XID 事务编号
versions between timestamp minvalue and maxvalue; 也可以
执行该查询时,Oracle将为每行的每个版本返回一行,该版本出现在Versions between子句中指定的起点和终点之间
返回的行可以查询的伪列:
案列3:闪回事务的查询
根据事务id,就可以对该事务进行闪回查询
注:闪回事务查询需要打开追加日志,不然无法从flashback_transaction_query查出UNDO_SQL
3.1 不通过xid查询:(通过like语句查询)
3.2 通过xid查询:
注:复制UNDO_SQL中的记录执行就可撤销刚才进行的DML操作。
二、闪回数据(flashback data)
案例1:闪回表 -- 将表闪回到历史的某个时刻
1.1 基于scn闪回: 1.2 基于时间戳的闪回
案例二:闪回删除和回收站
2.1 闪回删除 回收站 -- recyclebin
注:在回收站中也可以查询表,此时闪回表不是使用的undo,而是回收站。
2.2 清空回收站
- 直接删除
- 在回收站中删除指定表
2.3 回收站的空间管理
一张表被删除至回收站中后,该表所在表空间的空闲空间增加,虽然该表在回收站,但实际上还是占空间的。
desc dba_free_space;
案列3:闪回数据库
- 是Oracle不同于查询闪回和归档闪回的另外一种闪回机制
- Oracle 10g引入
- 需要配置闪回区域
- 记录数据块的修改,称为flashback logs
- 通过后台进程 RVWR 来工作
3.1 数据库的闪回:
- 就像一个向后转的按钮,让数据库向后倒退
- 可以用于认为失误操作或业务的需要
3.2 数据库闪回的机制:
Flashback buffer 会每隔一段时间收集Buffer Cache中的数据(并不是每一个改变都会收集)
然后由RVWR后台进程写入Flashback logs中去。
场景:假如现在的时间是8:00,我现在要闪回到7:00,这时Oracle会去闪回区中读取8:00-7:00 之间所有的Flashback logs,然后一个一个的应用到数据块中去。
最后一个Flashback log一定要在7:00之前。
3.3 闪回日志
- 位于闪回区
D:\app\Administrator\flash_recovery_area\orcl\FLASHBACK
- Oracle-Managerd Files(OMF)
O1_MF_9KDD7NHC_.FLB
O1_MF_9KCQ4F5Z_.FLB
- 顺序被使用
- 当空间不足时会被覆盖
3.4 RVWR后台进程
- 将产生的闪回数据copy到闪回日志当中
select description from v$bgprocess where name='RVWR';
- 没三秒中检查一次新的闪回数据。
3.5 配置数据库闪回功能
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter system set db_flashback_retention_target=2880 scope=both;
SQL> alter database flashback on;
SQL> alter database open;
SQL> select flashback_on from v$database;
3.6 数据库闪回的前提调前
- 数据库必须归档 (因为闪回日志不连续,必须依赖于归档)
- 闪回区必须指定
DB_RECOVERY_FILE_DEST_SIZE -- 闪回区大小
DB_RECOVERY_FILE_DEST -- 闪回区的路径
3.7 数据库闪回相关的时间和SCN
- 当前的SCN:
select surrent_scn from v$database;
- 允许闪回的最早SCN:
select oldest_flashback_scn from v$flashback_database_log; (必须启用闪回才能查到)
- 允许闪回的最早时间:
alter session set nls_date_format='DD-MM-YYYY HH24:MI:SS';
select oldest_flashback_time from v$flashback_database_log;
3.8 保证还原点
- 还原点能保证你在任何时候将数据库通过flashback database命令还原到这个时间点(SCN)
create restore point b4_load guarantee flashback database; -- 设置保证还原点
场景:比如今天早上8:00的时候数据库没有一点错误,我们就可以将8:00时刻的数据库 设置为保证还原点。在任何时候Oracle都可以保证还原到8:00这个时刻。
3.9 闪回数据库的例子
RMAN> flashback database to time="to_date('2014-03-05 08:00:00',
'YYYY-MM-DD HH24:MI:SS')";
RMAN> flashback database to scn=SCN号;
RMAN> flashback database to sequence=sequence号 thread=thread号;
---------------------------------------------------------------------------------------------------
SQL> flashback database to timestamp(syadate-1/24);
SQL> flashback database to scn scn号;
SQL> flashback database to restore point p4_load; -- 闪回保证还原点
3.10 闪回数据库之后需要注意的问题....
- 数据库闪回之前必须做一次全库备份(因为之前备份集可能丢失)
- 数据闪回之后,控制信息也会被重置,所以控制文件必须先备份
- 数据库闪回到历史某一点之后需要在mount状态下重置序号
SQL> alter database open resetlogs;
- 数据库闪回之后,一些架构,RAC可能需要重新设置。
另: 闪回归档在另一篇文章中会做详细解释。
0 0