数码资讯
删除表数据后的Oracle数据恢复细节
Oracle在删除表数据后恢复详细的解决方案 测试环境: 系统:IBM AIX 5L版本:Oracle 10gR2为止 1的查询和修改。undo_retention参数 使用显示参数撤消命令来查看当前数据库参数undo_retention设置。 它如下所示: 显示参数撤消 名称类型值 -------
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
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闪回查询不能恢复到表结构更改之前,因为闪回查询数据字典使用。
测试环境:
系统: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闪回查询不能恢复到表结构更改之前,因为闪回查询数据字典使用。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。