1.1 flashback 家族介绍
flashback 技术是已Undo Segement 中的内容为基础的,因此受限于UNDO_RETENTION 参数。在oracle 10g 中flashback 功能得到扩展,细分出许多级别。我们从整体上了解一下flashback家族的组成。
Oracle 10g 中的flashback 家族包括一下成员flashback database、flashback drop 、flashbackversion query、flashback transaction query 和 flashback table。
按照功能影响的数据级别,又可以把它们进行如下分类。
l 记录级别:这个级别包括flashbackversion query和flashback transaction query。
l 表级别:包括flashback drop和 flashback table。
l 数据库级别:指flashback database。
记录级别和表级别的flashback操作,可以由普通用户自己使用,不需要DBA 介入,而数据库级别的flashback 则需要DBA完成。
1.2 flashback database
flashback database 功能非常类似于RMAN的不完全恢复,它可以把整个数据库回退到过去的某个时间点,这个功能以来于 flashback log 日志,比RMAN 更快速和高效。因此flashback database 可以看作是不完全恢复的替代技术。但是flashback database 也有限制。
l Flashback database 不能解决 Media Failure,这种错误RMAN 的恢复仍然是唯一的选择。
l 如果删除了数据文件或者利用shrink技术缩小了数据文件的大小。这是不能用flashback database技术回退到改变之前的转台;这时候就必须先利用RMAN吧删除之前或者缩小之前的文件备份restore出来。然后再利用flashback database 执行剩下的flashback recovery。
l 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用flashback database。
l 使用flashback database所能恢复到得最早SCN,取决于flashback database log 中记录的是数据块的before image,因此恢复时会更快速和高效。
1.2.1 flashback database 构架
flashback database 整个架构包括一个进程Recover Writer(RVWR),后台进程、flashback database log 日志和flash recovery area。
一旦数据库启用了flashback database,则RVWR进程会启动,RVWR进程会向flashback recovery area 内写入flashback database log,这些日志包括的是数据块的‘前镜像’(before image)。这也是flashback database 技术比不完成恢复快的原因。
1.2.2 启用flashback database
数据库的flashback database功能确实是关闭的,要是启用这个功能,需要对数据库做如下配置工作。
1. 配置flash recovery area
(1) 启用flash recovery area
Sql>alter system db_recovery_file_dest_size=2g scope=both;
Sql>alter system set db_recovery_file_dest=’ D:\oracle\product\10.2.0\flash_recovery_area’ scope=both;
容量大小可以不是固定不变的,可以在以后的根据需要调整。检查修改生效:
Select name,value from v$parameter
Where name like ‘%flash%’ or name like ‘%recovery%’
Order by name
(2) 禁用flash recovery area:
Sql>alter system set db_recovery_file_dest=’’;
1.3 启用数据库flashback功能
(1) 数据库重启到mount 状态
Sql> startup mount;
检查flashback功能,缺省时功能是关闭的
(2)启动flashback 功能
Sql>alter database flashback on;
(3) 设置db_flashback_retention_target参数
db_flashback_retention_target是一个数值型参数,单位是分钟,代表数据库能回退多少分钟。
下面这个例子代表能够回退1天。
Sql>alter system set db_flashback_retention_target=1440 scope=both;
(4) 打开数据库
Sql>alter database open;
1.4 flashback database
配置好flash recovery area 和flashback logging 之后,我们开始试验了
(1) 实验之前我们先做一次全备份。
RMAN>backup database;
(2) 模拟用户误删操作。
A. select count(*) from test;
3
B.当前时间:
Select sysdate from dual;
2011-08-19 15:29:11
C. Truncate table test;
select count(*) from test;
0
(3) 确认能够恢复的时间点
(4) flashback database 实际就是对数据库的一个不完全恢复操作,因此需要关闭数据库,冲去数据库到mount状态
Sql>shutdown immediate
Sql>startup mount
(5)基于时间的恢复
Sql>flashback database to timestamp to_timestamp(‘2011-08-19 15:29:11’,’yyyy-mm-dd hh24:mi:ss’);
闪回完成。
sql> select count(*) from test
3
1.5 闪回对象
除table的其他对象,比如function,procedure,trigger等。 这时候,就需要使用到ALL_SOURCE 表。
Related Views
DBA_SOURCE describes the text source of all stored objects in the database.
USER_SOURCE describes the text source of the stored objects owned by the current user. This view does not display the OWNER column.
Column | Datatype | NULL | Description |
OWNER | VARCHAR2(30) | NOT NULL | Owner of the object |
NAME | VARCHAR2(30) | NOT NULL | Name of the object |
TYPE | VARCHAR2(12) |
| Type of object: FUNCTION, JAVA SOURCE, PACKAGE, PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY |
LINE | NUMBER | NOT NULL | Line number of this line of source |
TEXT | VARCHAR2(4000) |
| Text source of the stored object |
如果我们误删除了某些对象,如procedure,就可以使用all_source 表进行恢复。
SQL> desc dba_source
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)
查看dba_source 的所有type
SQL> select type from dba_source group by type;
TYPE
------------
PROCEDURE
PACKAGE
PACKAGE BODY
TYPE BODY
TRIGGER
FUNCTION
TYPE
7 rows selected.
基于timestamp恢复的语句
SQL>SELECT text
FROM dba_source
AS OF TIMESTAMP TO_TIMESTAMP ('XXXXX', 'YYYY-MM-DD HH24:MI:SS')
WHERE owner = 'XXXX' AND name = '你删除的对象名'
ORDER BY line;
示例:
创建函数:
SQL> CREATE OR REPLACE function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
/
Function created.
查询函数:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select getdate() from dual;
GETDATE()
-------------------
2011-04-07 21:02:09
查询dba_source 表:
SQL> select text from dba_source where name='GETDATE' order by line;
TEXT
--------------------------------------------------------------------------------
function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
7 rows selected.
drop 函数,在查询,记录不存在
SQL> drop function getdate;
Function dropped.
SQL> select text from dba_source where name='GETDATE' order by line;
no rows selected
使用我们的Flashback Query 查询:
SQL> select text from dba_source as of timestamp to_timestamp('2011-04-07 21:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;
TEXT
--------------------------------------------------------------------------------
function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
7 rows selected.