Oracle在删除表数据后恢复详细的解决方案



测试环境:

系统:IBM AIX 5L版本:Oracle 10gR2为止



1的查询和修改。undo_retention参数

使用显示参数撤消命令来查看当前数据库参数undo_retention设置。

它如下所示:

显示参数撤消

名称类型值

-----------------------------------------------------------------------------

undo_management字符串自动

undo_retention整数900

undo_tablespace字符串undotbs2

undo_retention(保持力),900的单位是秒,即15分钟。

修改默认的undo_retention参数设置:

SQL >修改系统设置undo_retention = 10800 =既范围;

系统的改变。

显示参数撤消

名称类型值

-----------------------------------------------------------------------------

undo_management字符串自动

undo_retention整数10800

undo_tablespace字符串undotbs2

undo_retention 10800,单位秒,即3小时。

2。删除表数据后的oracle快速恢复函数法

2.1方法一

oracle提供的闪回功能




执行dbms_flashback.enable_at_time(to_date('2011-04-15 08:21:00 ','yyyy-mm-dd hh24:MI:SS));
进行设置
声明r_temp人力资源。job_history %ROWTYPE;
光标c_temp是SELECT * FROM hr.job_history;
开始
打开c_temp;
dbms_flashback.disable;
环
取c_temp为r_temp;
退出时未c_temp %;
插入hr.job_history(employee_id,job_id,start_date,end_date)值(r_temp.employee_id,r_temp.job_id,r_temp.start_date,r_temp。end_date);
承诺;
结束循环;
近c_temp;
结束;



这种方法可以恢复被删除的数据到相应的表,首先,确保用户具有执行权限dbms_flashback包。

2.2方法

插入hr.job_history

SELECT * FROM hr.job_history作为时间戳to_timestamp('2011-04-15 08:20:00 ','yyyy-mm-dd hh24:MI:SS);

该方法简单,容易掌握,功能同上,这个时候你错误的操作时间,最好从误操作是近的,因为Oracle保存一定量的时间来保持数据回滚的时间段,通过undo_retention这个参数值的限制。

Look at FIRST_CHANGE#, NEXT_CHANGE#, FIRST_TIME

SQL >设置为9999

Col fscn SQL > 999999999

SQL >西南山999999999

已选择的名字,first_change # fscn,next_change #南山,first_time V archived_log美元;

当前SCN是:

SQL >选择dbms_flashback.get_system_change_number fscn双;

fscn

----------

三百四十三万五千九百五十八

应用程序用户尝试闪回

连接用户名/密码

有联系的.

可用的数据:

SQL select count(*)>从hs_passport;

计数(*)

----------

八十五万一千九百九十八

创建恢复表:

SQL >创建表hs_passport_recov选择hs_passport 1 = 0 *;

表的创建。

选择SCN以恢复前进:

SQL select count(*)>从hs_passport为SCN 12929970422;

计数(*)

----------

八十六万一千六百八十六

尝试一些SCN,以获得最佳值(如果你能知道时间,你可以得到准确的数据闪回)。




SQL select count(*)>从hs_passport为SCN SCN;
输入SCN的值:12929941968
1岁:select count(*)从hs_passport为SCN SCN
新1:select count(*)从hs_passport为SCN 12929941968
计数(*)
----------
八十六万一千六百八十四

SQL
输入SCN的值:12927633776
1岁:select count(*)从hs_passport为SCN SCN
新1:select count(*)从hs_passport为SCN 12927633776
select count(*)从hs_passport为SCN 12927633776
*
第1行错误:
ora-01466:无法读取数据表的定义发生了改变

SQL
输入SCN的值:12929928784
1岁:select count(*)从hs_passport为SCN SCN
新1:select count(*)从hs_passport为SCN 12929928784

计数(*)
----------
八十二万五千一百一十

SQL
输入SCN的值:12928000000
1岁:select count(*)从hs_passport为SCN SCN
新1:select count(*)从hs_passport为SCN 12928000000
select count(*)从hs_passport为SCN 12928000000
*
第1行错误:
ora-01466:无法读取数据表的定义发生了改变




最后,选择恢复到SCN 12929941968的时间点。

SQL >插入hs_passport_recov SELECT * FROM hs_passport为SCN 12929941968;

创建861684行。

提交;

提交完整的。

数据恢复的简单示例

在过去,如果用户不小心删除或更新的数据,如用户没有什么恢复的直接方法,他们必须帮助DBA恢复数据库Oracle9i,这种尴尬的局面有所改善。Oracle 9i数据库提供了一种新的技术——使用闪回查询闪回查询,用户可以及时的误操作之前的数据,并能根据相应的纠错措施,而这一切没有DBA的干预。

以下3。通过闪回实例说明了我们的用法。

样品

3.1使用闪回查询之前必须确定以下两个参数:

undo_management =汽车

undo_retention = 10800;

这个时间可以是随机设置的,这表示在系统中保留提交的撤销信息的时间,10800是保留3小时或180分钟。

3.2闪回查询的使用




SQL> Conn /数据库
有联系的.
已删除用户的LSF级联;

用户下降。

SQL >创建用户标识的LSF LSF;

用户创建的。

已授予连接,资源对LSF;

格兰特接替。

已授予执行dbms_flashback LSF;

格兰特接替。

SQL> Conn LSF LSF /
有联系的.
SQL >创建表(ID int,名字VARCHAR2(20));

表的创建。

SQL >插入T值(1,'lsf);

1行创建。

SQL >插入T值(2,'lsf);

1行创建。

SQL >插入T值(3,'lsf);

1行创建。

提交;

提交完整的。

从T选择;

我的名字
----------------------------------------------------------------------
1 LSF
2 LSF
3 LSF

设置时间
10:12:50 SQL >删除t id是1;

删除1行。

10:13:02 SQL >提交;

提交完整的。

10:13:10 SQL SELECT * FROM t >;

我的名字
----------------------------------------------------------------------
2 LSF
3 LSF

10:13:18 SQL >执行dbms_flashback.enable_at_time(to_date('2011-04-15 10:12:50 ','yyyy-mm-dd hh24:MI:SS));

已成功完成。

10:13:50 SQL SELECT * FROM t >;

我的名字
----------------------------------------------------------------------
1 LSF
2 LSF
3 LSF

10:13:57 SQL执行dbms_flashback.disable >;

已成功完成。

10:15:48 SQL> select * from T;

我的名字
----------------------------------------------------------------------
2 LSF
3 LSF




3.3使用闪回查询数据恢复




10:16:59 SQL > TRUNCATETABLE T;

表截断。

10:18:15 SQL SELECT * FROM t >;

没有行选择

10:18:22 SQL >插入T值(1,'lsf);

1行创建。

10:19:42 SQL >插入T值(2,'lsf);

1行创建。

10:19:48 SQL >插入T值(3,'lsf);

1行创建。

10:19:55 SQL >插入T值(4,'lsf);

1行创建。

10:20:07 SQL >插入T值(5,'lsf);

1行创建。

10:20:15 SQL >插入T值(6,'lsf);

1行创建。

10:20:21 SQL >提交;

提交完整的。

10:20:26 SQL SELECT * FROM t >;

我的名字
----------------------------------------------------------------------
1 LSF
2 LSF
3 LSF
4 LSF
5 LSF
6 LSF

选择6行。

10:20:56 SQL >删除T;

删除6行。

10:21:27 SQL >提交;

提交完整的。

10:21:40 SQL >声明
2 flash_recover是10:22:29光标
3 10:22:43 SELECT * FROM t;
10:22:50 4 t_recode T %ROWTYPE;
10:23:11 5开始
10:23:14 6 dbms_flashback.enable_at_time(to_date('2011-04-15 10:20:56 ','yyyy-mm-dd hh24:MI:SS));
10:24:22 7开flash_recover;
8 dbms_flashback.disable 10:24:39;
10:24:59 9环路
10:25:05 10取flash_recover为t_recode;
10:25:24 11退出时不flash_recover %;
10:25:45 12插入T值(t_recode.id,t_recode。名称);
10:26:35 13端环;
10:26:39 14关闭flash_recover;
10:26:50 15犯;
10:26:56 16端;
17 / 10:26:58

已成功完成。

10:27:00 SQL SELECT * FROM t >;

我的名字
----------------------------------------------------------------------
1 LSF
2 LSF
3 LSF
4 LSF
5 LSF
6 LSF

选择6行。




我们可以恢复所有6条记录,但由于闪回查询的限制,可能没有收回以下6条记录。

4。局限性

4.1闪回查询是基于SCN的,尽管我们正在执行:

dbms_flashback.enable_at_time(to_date('2011-04-15 10:20:56 ','yyyy-mm-dd hh24:MI:SS));

但Oracle不会精确的在这个时间点,但本轮下跌到最新的SCN,然后开始从SCN恢复。和Oracle 9i记录SCN每五分钟,使记录的SCN的映射和对应的时间。

所以如果你使用dbms_flashback.enable_at_time恢复,我们可以等5分钟恢复避免恢复之前。

有dbms_flashback.enable_at_time恢复使用的另一个缺点。那就是,在Oracle 9i,SCN和相应的时间映射信息将只保留5天,所以我们不能恢复数据5天前通过dbms_flashback.enable_at_time.if你想用5天前恢复闪回查询数据,您必须确定需要恢复的SCN,然后用dbms_flashback.enable_at_system_change_number(scn_number);找到您的恢复时间,下面是使用方法:




10:27:27 SQL >变scn_save数;
10:32:47 SQL >执行:scn_save:= dbms_flashback.get_system_change_number;

已成功完成。

10:33:24 SQL >打印scn_save;

scn_save
----------
三百四十三万八千四百二十

10:33:41 SQL >执行dbms_flashback.enable_at_system_change_number(:scn_save);

已成功完成。

10:34:31 SQL SELECT * FROM t >;

我的名字
----------------------------------------------------------------------
1 LSF
2 LSF
3 LSF
4 LSF
5 LSF
6 LSF

选择6行。


另外,在你使用dbms_flashback.enable_at_time,你必须把你的nls_date_format精度。甲骨文的默认是准确的一天。如果不设置它,就像上面的示例一样,您将得不到预期的结果。

4.2,如果你使用的系统日期和dbms_flashback.get_system_change_number得到时间点或SCN值,你必须注意,他们都是当前时间点和SCN值。

4.3你只能在交易查询模式开始进入倒叙,如果DML操作之前,必须提交。

在4.4闪回查询不能恢复到表结构更改之前,因为闪回查询数据字典使用。