Oracle 的闪回技术 --flashback
- 如何开启数据库闪回?
SQL> shutdown immediate; ORA-01109: database not open
Database dismounted. ORACLE instance shut down. SQL> startup mount; ORACLE instance started.
Total System Global Area 1653518336 bytes Fixed Size 2253784 bytes Variable Size 1207962664 bytes Database Buffers 436207616 bytes Redo Buffers 7094272 bytes Database mounted. SQL> alter database flashback on;--------------------------在mout情况下开启闪回.
Database altered.
SQL> select flashback_on from v$database;------------------到v$database视图中查询闪回是否开启
FLASHBACK_ON ------------------ YES
SQL> |
- 数据库的闪回
- 基于SCN的闪回
SCN是数据库的顺序号,每个号都是数据库的一个状态,当知道具体的SCN号的时候就可以精确地闪回,可以通过日志来查看具体的SCN
SQL>flashback database to scn 5540916;
- 基于时间的闪回
如果知道大概的时间,也可以通过时间闪回
Flashback database to '2:05 PM';
- 需要性能开销、闪回日志磁盘空间的开销
- 默认数据库的闪回技术是关闭的,建议开启.
- 表的闪回
- 删除表的闪回
SQL> conn test/test Connected. SQL> select * from w;
X ---------- 1
SQL> drop table w;--------------------------------------------删除表,没有加purge参数,这时候表会放到回收站
Table dropped.
SQL> select * from w; select * from w * ERROR at line 1: ORA-00942: table or view does not exist
SQL> show recyclebin;-----------------------------------------------------查看回收站 ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- W BIN$UgO0wwwhHBTgU3ABqMDCXQ==$0 TABLE 2017-06-16:01:07:40
SQL> flashback table w to before drop;--------------------------------使用flashback技术还原w表
Flashback complete.
SQL> select * from w;
X ---------- 1
SQL> drop table w purge;--------------------------如果使用了purge表示表已经在回收站同时删除了,就不能恢复了
Table dropped.
SQL> show recyclebin;
|
- DML操作的闪回
做了一个操作,并且提交了怎么办? |
SQL> select rowid,id,name from g;
ROWID ID NAME ------------------ ---------- ---------- AAAVW7AAEAAAAD8AAC 1 a AAAVW7AAEAAAAD8AAD 2 b
SQL> select sysdate 时间, timestamp_to_scn(sysdate) SCN from dual;----------------------将系统时间转换为scn号
时间 SCN ------------------ ---------- 16-JUN-17 1373003
SQL> delete from g where id=2;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select rowid,id,name from g;
ROWID ID NAME ------------------ ---------- ---------- AAAVW7AAEAAAAD8AAC 1 a
SQL> alter table g enable row movement;-----------因为恢复了就不是以前那个位置了,所以flashback需要允许行迁移,在flashback中使用,当需要使用flashback table功能时,需要首先打开row movement的选项,否则使用该功能也会报错
Table altered.
SQL> flashback table g to scn 1373003;
Flashback complete.
SQL> select rowid,id,name from g;--------------------注意rowid已经不一样了
ROWID ID NAME ------------------ ---------- ---------- AAAVW7AAEAAAAD8AAA 1 a AAAVW7AAEAAAAD8AAB 2 b |
- 事务的闪回
- 版本的闪回
- 查询的闪回
- 基于时间的查询闪回
Select * from g as of timestamp sysdate-5/1440-----------当前时间-5,这里表示5分钟之前
- 基于SCN的查询闪回
Select * from g as of scn 344197