七种闪回技术
flashback 的功能:
flashback 分类:
-
闪回删除 从回收站收回
闪回:后进先出
purge 清除 先进先出 -
闪回查询 (undo)
-
闪回表 (undo)
-
闪回版本查询 (undo)
-
闪回事务查询 (undo)
-
闪回数据归档 (undo)
-
闪回数据库 (闪回日志)
- 七种闪回技术
七种闪回技术FLASHBACK 的功能:
1)利用 undo data 回溯或撤销提交的数据,
2) flashback log 使 database 可以恢复到过去某个时间点,可以作为不完恢复的补充。
FLASHBACK 分类:
- 利用回收站 recyclebin: flashback drop 闪回删除
- 利用 undo 数据
flashback query 闪回查询
flashback table 闪回表
flashback version query 闪回版本查询
flashback transaction 闪回事务 - 闪回归档 flashback data archive 闪回归档
- 利用闪回日志: flashback database 闪回数据库.
- 闪回删除
从回收站收回
闪回和清除的顺序不同
闪回使用 LIFO (后进先出)
清除使用 FIFO (先进先出)
查看回收站
DAMON@PROD>show recyclebin
闪回:后进先出
SCOTT@PROD>flashback table表 to before drop;
闪回最近被删除的东西
PURGE 清除 先进先出
SCOTT@PROD>purge table 表;
SCOTT@PROD>show recyclebin
SCOTT@PROD>select * from "BIN$PNGUu0pCTI3gU2USqMCe/w==$0";
如果想避免混淆,可以直接给出回收站里的表名
SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop;
3) 恢复同一个 schema 下准备闪回的表已有同名的对象存在,闪回 drop 需要重命名.
SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop;
4) system 表空间的对象没有回收站,所以在 sys 下缺省使用 system 表空间时, drop table 会直接删除对象
5)如果一个表上面有索引和约束, drop 后再闪回表,索引和约束会乱码。
SQL> flashback table t to before drop;
分别重命名索引和约束
SQL> alter index "BIN$yF3hbvIbioTgQAB/AQAJlg==$0" rename to pk_t;
SQL> alter table t rename constraint "BIN$yF3hbvIaioTgQAB/AQAJlg==$0" to pk_t;
- 闪回查询 (UNDO)
flashback query:(用于 DML 误操作),DDL不行
要点:
利用在 undo tablespace 里已经提交的 undo block(未被覆盖),可以查询表的过去某个时
间点的数据。
通过设置 undo_retention 参数设置前镜像的保留时间
SQL> select current_scn from v$database; 取 scn 1
SQL> delete scott.student where sno=1;
SQL> commit;
SQL>select * from scott.student as of scn 1;
闪回查询到 scn1;
- 闪回表 (UNDO)
要点:
闪回表通常是把表的状态回退到以前的某个时刻或者 SCN 上。(其实向前向后都能闪)。
自动恢复相关的属性,包括索引、触发器等。前提是对表启用行移动。
语法:
flashback table <table_name> to timestamp | scn
注意:
①sys 的表不能闪回。
②必须使能行移动。
③缺省下,闪回表的过程中有关的 trigger 都关闭。
④闪回表有 index 是被维护的
⑤物化视图下不许闪回表操作
SQL>delete student;
SQL>commit;
SQL>alter table student enable row movement;
SQL>flashback table student to scn XXXXX
- 闪回版本查询 (UNDO)
要点:
闪回查询仅仅能够得到过去某个时间点上的数据,但是无法反映出一段时间内数据表中
数据变化的细节, 10g 的闪回版本查询可以对时间段内数据表的每行变化(不同版本)进行
查询。
语法:select … from … versions between’
其中, select 后面可以选择伪列,来获得事务的开始、结束时间、 SCN 号、 ID 号等。
- 闪回事务查询 (undo)
闪回事务查询可以提供撤销查询语句。从 flashback_transaction_query 这个视图里查询引起数据变化的事务,和撤销事务的 SQL 语句, 也就是查询 operation 和 undo_sql 列。可以和闪回版本查询结合起来使用。
sys:
SQL>desc flashback_transaction_query;
SQL>select undo_sql from flashback_transaction_query where xid=hextoraw('事务号');
接上例:
select undo_sql from flashback_transaction_query where xid='0400200010020000';
执行上面语句,原操作(update t3 set id=id+100;)就撤销了
注意
①Enable Supplemental Logging 并且数据库版本 10.0 compatibility
②查询 flashback_transaction_query 视图需要 SELECT ANY TRANSACTION 权限。
- 闪回数据归档 (UNDO)
无限期的存储表行数据,通过后台进程 FBDA,捕捉必要的数据并将其保存在归档上,然后可以使用常规闪回查询命令(as of)查询需要的数据,但闪回可以回朔到多年以前。
闪回数据归档可以看成是闪回查询时间的延伸。
要点:
①首先要有一个(或多个) 表空间存放归档表,可以加上配额,使用与原表同一表空间
在技术上是可行的,但 Oracle 建议它们与常规的数据分开存放更好。
②先要建立一个归档名(方案),作为一个数据库的对象,可以为它指定 default 属性,含
义是把所有要归档的表都建立在该缺省的归档名下。
③可以根据需要建立多个闪回归档名(方案),这取决于你需要多少种不同的保留时间。
可以调整保留时间,一旦超过了保留期限,后台进程 FDBA 将自动删除该表历史记录,也可
以在保留期内手动进行删除操作。
④关于两个权限:
flashback archive administer //授予用户创建,修改或删除闪回归档名(方案)
flashback archive //授予用户对表进行归档。
⑤启用表的闪回归档需要使用 alter table 表名 flashback archive 归档名
⑥闪回归档 enable 也有个前提条件,表空间要 ASSM 管理和以及 undo_management=auto
⑦关于闪回归档的视图:
DBA_FLASHBACK_ARCHIVE //描述配置的归档
DBA_FLASHBACK_ARCHIVE_TS //列出使用的表空间
DBA_FLASHBACK_ARCHIVE_TABLES //查看归档的表
DBA 建一个表空间用于闪回数据归档,然后将闪回数据归档作为一个对象创建并授权。
sys:
create tablespace fda datafile '/u01/app/oracle/oradata/PROD/fda01.dbf' size 5m;
create flashback archive fla1 tablespace fda quota 2m retention 1 year;
grant flashback archive on fla1 to scott;
用户将自己的表定义为闪回归档
SCOTT@PROD> alter table emp flashback archive fla1;
elect * from dba_flashback_archive; 查看有哪些归档名
select * from dba_flashback_archive_ts; 查看归档使用表空间的信息
select * from dba_flashback_archive_tables; 查看表 emp 和归档名的关系
SYS@PROD>alter table scott.emp no flashback archive; 将表 scott.emp 从闪回归档中取消
- 闪回数据库 (闪回日志)
不需要备份,它通过闪回日志将数据库整体回退到某个时间点。
闪回数据库针对的是逻辑错误,如果数据库发生了物理损坏或介质丢失,闪回数据库将无能
为力,闪回数据库不能完全代替传统不完全恢复(考点)
使用闪回数据库,需要开启闪回日志,闪回日志存放在闪回恢复区里。
设置闪回
查看是否开启闪回数据库
SYS@PROD>select flashback_on from v$database;
创建目录 赋予权限
[oracle@oracle ~]$ mkdir /u01/flash_recovery_area/
[oracle@oracle ~]$ ls -ld /u01/flash_recovery_area/
修改初始化参数文件
需要先设置 size
SYS@PROD>alter system set db_recovery_file_dest_size=2G;
SYS@PROD>alter system set db_recovery_file_dest='/u01/flash_recovery_area';
SYS@PROD>show parameter db_recovery
- 开闪回
开闪回之前要开归档(归档模式)
mount状态下,alter system archivelog;
SYS@PROD>alter database flasuhback on;
SYS@PROD>select flashback_on from v$database;
取当前 SCN
SYS@PROD>select current_scn from v$database;
创建检查点
SYS@PROD>create restore point abc;
mount下 闪回数据库
SYS@PROD>flashback database to scn 909515;
只读方式打开,确认 scott 已经被闪回
SYS@PROD>alter database open read only;
确认无误后,重新以 resetlogs 方式打开数据库(属于不完全恢复)
提醒:要在 mount 下闪回数据库
SQL>flashback database to timestamp to_char('2012-03-02 19:11:11','yyyy-mm-dd hh24:mi:ss');
SQL>flashback database to scn 1264788;
闪回后,打开数据库,第一次最好用只读方式, 看看是否恢复到你希望的那个时间点上去了,
如果不是你希望的,还可以重新闪回(前闪/后闪都可以,因为只读方式 scn 是不会增长的)。