oracle的闪回

来源:互联网 发布:照片在线合成软件 编辑:程序博客网 时间:2024/04/25 13:24

1.1 配制参数
行级闪回需要配制以下两个参数
undo_management = auto 只有设置成auto才能查询到表更新记录
undo_retention =900 设置表更新记录时间,单位为秒,只有在这个时间内的操作才能被闪回,10G第二版默认为900秒,9i为3600秒.

1.2 行级闪回查询
行级闪回查询有以下三种

--行级闪回查询
select a, b, c, versions_xid, versions_starttime, versions_endtime,
versions_startscn,versions_endscn,versions_operation
from test versions between timestamp minvalue and maxvalue
where c=12;
--行级闪回查询,查询一段时间内的变更,注意开始时间和结束时间之差小于undo_retention设置的值,否则会提示"ORA-30052: 下限快照表达式无效"
select a, b, c, versions_xid, versions_starttime, versions_endtime,
versions_startscn,versions_endscn,versions_operation
from test versions between timestamp
to_date('2008-09-23 16:09:00','yyyy-mm-dd hh24:mi:ss')
and to_date('2008-09-23 16:45:00','yyyy-mm-dd hh24:mi:ss')
where c=12;

--行级闪回查询,根据scn值查询
select a, b, c, versions_xid, versions_starttime, versions_endtime,
versions_startscn,versions_endscn,versions_operation
from test versions between scn 339493 and 339635
where c=12;
/* 其中test的表结构如下
create table TEST
(
A VARCHAR2(20),
B VARCHAR2(40),
C NUMBER
)
*/

--versions_xid更改该行的事务标识符
--versions_startscn和versions_endscn 该时刻系统更改号
--versions_starttime和versions_endtime 该数据的起如时间和结束时间
--versions_operation 表示执行了什么样操作 I表示insert,U表示update,D表示delete

以下功能还可以根据当前系统scn查打以前scn的数据
select dbms_flashback.get_system_change_number from dual; --查询当前系统更改号
然后根据当前系统scn推算到以前scn,根据以前scn查询当时表里的数据
select * from test as of scn 404030; --查询系统更必号404030表test时候的数据.


1.3 闪回数据
闪回数据有两种,根据查询找出反操作语句闪回,第二种是把整个表直接闪回到时某个间点.

a. 根据反操作语句闪回
用视图flashback_transaction_query查询出反操作语句,如下
--查询返回该条语句
select undo_sql from flashback_transaction_query where xidin('0800170073000000');

UNDO_SQL
--------------------------------------------------------------------------------

insertinto"TEST"."TEST"("A","B","C")values ('11','111','11');


其中undo_sql就是返回原来的sql语句,注意视图flashback_transaction_query只有dba才能查询.

只要执行undo_sql 语句就返回到之前的状态了.

b.整个表直接闪回到时间点

利用如下语句执行闪回到时间点,如下
flashback table test to timestamp to_timestamp
('2008-09-23 17:40:52','YYYY-MM-DD HH24:MI:SS');
--在执行以上语句前,要把表启用行移动功能.开启表行移动功能,语句如下
alter table test enable row movement;
--关闭行移动功能
alter table test disable row movement;

2.表级闪回
oracle从10G开始支持表级闪回,表删除掉后,不直接删除,而是像windows操作系统一下放到回收站里.如果需要,可以从回收站还原.

a.查看当前用户下回收站中的内容
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ -------------------------------

TMP_DPBIN$FhcMyJIhS2241b3ALdHD/Q==$0 TABLE 2008-09-17:11:08:46

也可以从以下视图查询回收站内容.

select* from dba_recyclebin;
select * from user_recyclebin;

b.恢复被删除的表

SQL>flashback table tmp_dp to before drop;

闪回完成。

内回完成后,查询回收站

SQL>show recyclebin
SQL>
刚才回收站的内容已经清空.

c.清空回收站

purgetable TMP_DP; --指定删除某些特定对象
purge recyclebin; --删除当前用户在回收站的内容
purge dba_recyclebin; --以SYSDBA身份可以清除所有回收站对象
purge index ind_test_01; --删除索引
purge tablespace users; --清除某个表空间的所有回收站对象
purge tablespace users user scott;--删除回收站内users表空间下的scott用户的数据库对像

d.彻底删除表
drop table test purge --彻底删除表test不放入回收站.


3.数据库级闪回

--查询数据库是否启动了数据库闪回功能
select name,log_mode,open_mode,flashback_on from v$database;

--没有启动,先关闭,在启动到mount状态下
shutdown immediate;
startup mount;

--开启数据闪回功能
alter database flashback on;
闪回到以前时间,或以前的scn,可以通过以下语句查询.

select* from v$flashback_database_log;

列oldest_flashback_tiem 闪回最早时间点.
列oledst_flashback_scn闪回最早scn.

把数据关闭掉,启动到mount状态
shutdown immediate;
startup mount;


通过以下语句闪回到以前数据

--闪回到以前时间点
flashback database to timestamp to_date('2008-9-26 10:59:17','yyyy-mm-ddhh24:mi:ss');
--闪回到以前scn
flashback database to scn 405493;

最后需要用resetlogs或用noresetlogs打开数据库.

alterdatabase open resetlogs;


-----转自夏威夷博客(http://blog.itpub.net/post/37623/471404/)


原创粉丝点击