flashback 学习笔记
oracle Flashback技术从oracle 9i开始出现,通过Undosegment中的内容可查询数据表无操作之
前的状态,但仅仅只提供查询。由于以Undo segment为基础,所以受限于undo_retention参数。
从oracle 10g开始,oracle flashback技术功能有了很大完善。
oracle 10g中的flashback家族成员包括:
记录级别:flashback version query 和 flashback transaction
表级别:flashback drop 和 flashback table
数据库级别:flashback database
注:记录级别和表级别可以由对象owner用户使用,也就是普通用户也可以使用。而数据库级别
需要DBA。
flashback database非常类似RMAN的不完全恢复,它可以把整个数据库回退到过去某一个时间点
,这个功能依赖于flashback log日志。但不能解决介质错误的不完全恢复,如果删除了数据文件或
者使用shrink技术压缩了数据文件,这时不能使用flashback database技术回退到改变之前的状态,
必须使用RMAN进行restore,然后再使用flashback进行恢复。如果控制文件从备份恢复出来的(较旧
的),或者是重建的控制文件,也不能使用flashback。
注:使用flashback database 所能恢复到最早的SCN取决于flashback database log中记录最早
的before image。
flashback database整个架构包括:
recover writer(RVWR)
flashback database log
flash recovery Area
注:主要通过RVWR向flashback Area内写入flashback database log。
启用flashback database
由于flashbase database功能缺省是关闭的,所以需要启用这个功能
需要配置flashback recovery area 相关的两个参数:
位置参数:db_recovery_file_dest
大小参数:db_recovery_file_dest_size
我的环境是两节点的RAC和ASM存储方案,在最初始创建安装的时候已经配置了flashback功能。
查看参数:
SQL> show parameter db
NAME TYPE VALUE
--------------------------------------------------------------
db_recovery_file_dest string +RECOVERYDEST
db_recovery_file_dest_size big integer 1500M
查看我的ASM磁盘组:
rac2-> export ORACLE_SID=+ASM2
rac2-> asmcmd
ASMCMD> ls
NDG1/
NRECOVERY/
ASMCMD>
注:这里没有"+RECOVERYDEST",可能因为之前做磁盘迁移的时候,忘记更改了这个参数。
改回来:
SQL> alter system set db_recovery_file_dest='+NRECOVERY' scope=spfile sid='*';
System altered.
若想禁止flash recovery area:
SQL>alter system set db_recovery_file_dest='';
启动功能:
1.数据库启动到mount状态
2.启动flashback功能
alter database flashback on;
注:在RAC环境下,只需要启动其中一个节点操作即可,另外一个节点要关闭,不然会抛出错误,如
下:
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38777: database must not be started in any other instance.
确认启动:
SQL> select name,current_scn,flashback_on from v$database;
NAME CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
DEVDB_RA 0 YES
查看能回退的时间:
SQL> show parameter db
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
注:这个值是以分钟为单位,1140即为1天。
flashback使用
配置完之后,我们来看看如何进行flashback database。
模拟:
插入数据
1.
SQL> select * from xiaobin;
XNO NAME
---------- ------------------
1 YL
2 xiaobin
3 stephen.lin
4 lingksxz
5 st
6 ken
7 a yuan
8 wujia
9 jinge
10 xxx
10 rows selected.
清空:
SQL> truncate table xiaobin;
Table truncated.
SQL> select * from xiaobin;
no rows selected
现在时间为:
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
11-11-08 08:25:55
确定能够恢复的时间点
flashback database所能回退到最早的时间取决于保留的flashback database log量的多少。
视图V$flashback_database_log提供许多的信息。oldest flashback SCN是说目前数据库能回退最早
的SCN。oldest flashback time说明数据库能回退到最早时间,这两列从不同的角度说明一个问题。
查看可恢复到最早的SCN,时间:
SQL>select OLDEST_FLASHBACK_SCN,to_char(OLDEST_FLASHBACK_TIME,'yy-mm-dd
hh24:mi:ss'),RETENTION_TARGET,FLASHBACK_SIZE,ESTIMATED_FLASHBACK_SIZE from
v$flashback_database_log;
OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FL RETENTION_TARGET FLASHBACK_SIZE
ESTIMATED_FLASHBACK_SIZE
-------------------- ----------------- ---------------- -------------- ----------------
--------
1082110 11-11-08 08:09:11 1440 16384000
280657920
查看同样能提供相同信息的视图:
SQL> select log#,bytes,first_change#,first_time from v$flashback_database_logfile;
LOG# BYTES FIRST_CHANGE# FIRST_TIM
---------- ---------- ------------- ---------
1 8192000 1082429 08-NOV-11
2 8192000 1082263 08-NOV-11
执行flashback database 进行恢复
需要把数据库重启到mount状态
注:两个节点都要关闭,启动其中一个节点到mount。
基于时间恢复
SQL> flashback database to timestamp to_timestamp('11-11-08 08:10:00','yy-mm-dd
hh24:mi:ss');
Flashback complete.
SQL> alter database open read only;
Database altered.
SQL> select * from orabm.xiaobin;
no rows selected
没有恢复成功,说明恢复的时间选择不对。
再试一次。
SQL> flashback database to timestamp to_timestamp('11-11-08 08:24:20','yy-mm-dd
hh24:mi:ss');
Flashback complete.
SQL> alter database open read only;
Database altered.
SQL> select * from orabm.xiaobin;
XNO NAME
---------- ------------------
1 YL
2 xiaobin
3 stephen.lin
4 lingksxz
5 st
6 ken
7 a yuan
8 wujia
9 jinge
10 xxx
10 rows selected.
恢复成功!
重启数据库。
注:如果确认已经恢复成功,并且一切无误,则重启后用resetlog打开数据库。
Flashback Drop
这个功能从10g开始出现,用于恢复用户无操作,包括删除表,索引等。这个技术依赖于
tablespace recycle bin(表空间回收站)。这个功能和windows回收站很相似。
该功能缺省情况下为启用状态。
查看:
SQL> show parameter recycle
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
db_recycle_cache_size big integer 0
recyclebin string on
drop表对象:
SQL> conn orabm/orabm
Connected.
SQL> drop table xiaobin;
Table dropped.
回收站对象:
SQL> show recycle
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
XIAOBIN BIN$sTm1ilCTCzbgQKjAbwF1nA==$0 TABLE 2011-11-08:09:08:43
注:回收站内对象的命名规则为“BIN$globalUID$version”,"globalUID"为一个24字节的唯一号。
相同名称对象被删后
oracle通过“BIN$globalUID$version”的命名规则来保证相同对象被删除后,在回收站里仍具有唯
一命名。
测试:
SQL> create table xiaobin (a int,b int,c int);
Table created.
SQL> drop table xiaobin;
Table dropped.
SQL> show recycle
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
XIAOBIN BIN$sTm1ilCUCzbgQKjAbwF1nA==$0 TABLE 2011-11-08:09:16:38
XIAOBIN BIN$sTm1ilCTCzbgQKjAbwF1nA==$0 TABLE 2011-11-08:09:08:43
仍然可以查看表的内容:
SQL> select * from "BIN$sTm1ilCTCzbgQKjAbwF1nA==$0";
XNO
----------
NAME
--------------------------------------------------------------------------------
1
YL
2
xiaobin
...
...
Flshback Drop的恢复
要使用flashback drop恢复被删除的表,需要如下准备:
1.确认被删除的表在recycle中的名称。
2.确认了表的名称,则可使用flashback table恢复,并且相关关联对象自动被恢复。
确认被删除表的名称:
SQL> select object_name as recycle_name,original_name from recyclebin;
RECYCLE_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$sTm1ilCTCzbgQKjAbwF1nA==$0 XIAOBIN
BIN$sTm1ilCUCzbgQKjAbwF1nA==$0 XIAOBIN
恢复:
SQL> flashback table "BIN$sTm1ilCTCzbgQKjAbwF1nA==$0" to before drop;
Flashback complete.
SQL> select * from xiaobin;
XNO
----------
NAME
--------------------------------------------------------------------------------
1
YL
2
xiaobin
...
...
恢复成功!
可把相同命名的表恢复出来再改名。
SQL> flashback table "BIN$sTm1ilCUCzbgQKjAbwF1nA==$0" to before drop rename to xiaobin2;
Flashback complete.
维护recycle空间
1.清除表空间中的recycle BIN
purge tablespace tablespace_name
2.清除表空间中recycle BIN指定的用户对象
purge tablespace tablespace_name user user_name
3.删除用户下所有recycle bin对象
purge recyclebin
4.删除所有用户的recycleBIN
purge dba_recyclebin
5.在删除对象时,直接永久删除
drop table ... purge
6.释放对象的关联索引
purge index recycle_bin_object_name
注:flashback drop适用于:
1.只能用户非系统表空间和本地管理表空间
2.若关联对象在字典管理的表空间,当恢复时,不会被恢复。
3.对象能否成功恢复,取决于对象空间是否被覆盖了。
4.recycle bin对象只支持查询。
5.对象的参考约束不会被恢复,指向对象的外键约束需要重建。
Flashback Query and flashback table
flashback query包含:
flashback query
flashback version query
flashback transaction query
这三个工具均利用undo的内容来实现回退功能,前者属于分析工具,用于找出回退时间点,后面的工
具则用于回退操作。
oracle 9i下只支持查询误删之前的状态:
查看当前时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
11-11-08 12:15:54
SQL> delete xiaobin;
10 rows deleted.
SQL> commit;
Commit complete.
通过flashback query 查询之前的状态:
SQL> select * from xiaobin
2 as of timestamp
3 to_timestamp('11-11-08 12:15:54','yy-mm-dd hh24:mi:ss');
XNO NAME
---------- ----------------------------------------------------------------------------
------------------------
1 YL
2 xiaobin
3 stephen.lin
4 lingksxz
5 st
6 ken
7 a yuan
8 wujia
9 jinge
10 xxx
10 rows selected.
恢复:
SQL> insert into xiaobin
2 select * from xiaobin
3 as of timestamp
4 to_timestamp('11-11-08 12:15:54','yy-mm-dd hh24:mi:ss');
10 rows created.
SQL> select * from xiaobin;
XNO NAME
---------- ----------------------------------------------------------------------------
------------------------
1 YL
2 xiaobin
3 stephen.lin
4 lingksxz
5 st
6 ken
7 a yuan
8 wujia
9 jinge
10 xxx
10 rows selected.
SQL> commit;
Commit complete.
10g新特性 flashback version query
flashback version query通过伪列“rowscn”跟踪对象的历史变化。DBA能够快速地判断什么时间点
发生了错误,进而恢复到之前的状态。
创建测试数据:
SQL> create table emp
2 as
3 select * from scott.emp;
Table created.
SQL> commit
2 ;
Commit complete.
SQL> set linesize 1000
SQL> set wrap off
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> update emp set ename='xiaobin' where empno=7934;
1 row updated.
SQL> commit;
Commit complete.
查看rowscn:
SQL> select ora_rowscn,empno,ename from emp;
ORA_ROWSCN EMPNO ENAME
---------- ---------- ----------
1111692 7369 SMITH
1111692 7499 ALLEN
1111692 7521 WARD
1111692 7566 JONES
1111692 7654 MARTIN
1111692 7698 BLAKE
1111692 7782 CLARK
1111692 7788 SCOTT
1111692 7839 KING
1111692 7844 TURNER
1111692 7876 ADAMS
ORA_ROWSCN EMPNO ENAME
---------- ---------- ----------
1111692 7900 JAMES
1111692 7902 FORD
1111692 7934 xiaobin
14 rows selected.
SQL> update emp set ename='YL' where empno=7902;
1 row updated.
SQL> commit;
Commit complete.
SQL> select ora_rowscn,empno,ename from emp;
ORA_ROWSCN EMPNO ENAME
---------- ---------- ----------
1111908 7369 SMITH
1111908 7499 ALLEN
1111908 7521 WARD
1111908 7566 JONES
1111908 7654 MARTIN
1111908 7698 BLAKE
1111908 7782 CLARK
1111908 7788 SCOTT
1111908 7839 KING
1111908 7844 TURNER
1111908 7876 ADAMS
ORA_ROWSCN EMPNO ENAME
---------- ---------- ----------
1111908 7900 JAMES
1111908 7902 YL
1111908 7934 xiaobin
14 rows selected.
注:rowscn是块级别的,也就是说当一个数据块中的一行数据被修改,那么整个数据块中数据行的rowscn都会随之变更。
flashback transaction query
UNDO Rtention
flashback query 和 flashback table 都是利用UNDO内容来完成恢复的。
undo内容如果设置保留足够长时间,但如果空间不够,则会被覆盖。
设置retention guarantee可强制保留undo时间。
这个特性可以再dba_tablespace视图中查看:
SQL> select tablespace_name,retention from dba_tablespaces;
TABLESPACE_NAME RETENTION
------------------------------ -----------
SYSTEM NOT APPLY
UNDOTBS1 NOGUARANTEE
SYSAUX NOT APPLY
TEMP NOT APPLY
USERS NOT APPLY
UNDOTBS2 NOGUARANTEE
EXAMPLE NOT APPLY
TEMP2 NOT APPLY
ORABMTS NOT APPLY
9 rows selected.
默认情况下是不启用的。
启用retention guarantee :
SQL> alter tablespace undotbs2 retention guarantee;
Tablespace altered.
图表总结:
tools Flashback Log tablespace Bin UNDO objective
Flashback database use Rollback database
Flashback Drop use recover table
Flashback version query use recover date
Flashback transaction query use recover date
Flashback table use recover date
总结:传统的恢复方法,在面对几百G的数据文件恢复几个坏块的情况下,既是关闭数据库又是offline数据文件的,然后还要restore。显得非常笨重和低效率。
“flashback”技术在oracle 9i开始萌芽,但由于仅查询功能,没什么特别用处。在oracle 10g里,flashback功能有了实质飞跃。而且非常简单实用。