oracle update 数据更新错误,想恢复更新前的数据,该如何恢复

如题所述

flashback table与9i的flashback query相似,利用undo信息来恢复一个或者一些表到现在以前的一个时间点(一个快照)。Undo相关参数如下,需要确保AUM与足够的retention值。

SQL> show parameter undo
NAME TYPE VALUE
------------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
首先要说明的是,flashback table不等于flashback query,所谓query,仅仅是查询以前的一个快照点而已,并不改变当前表的状态,而flashback table不一样,将改变当前表及附属对象一起回到以前的时间点。
其实9i的flashback query在10g中也有了新的变化,10g中可以简单的利用以下语句实现flashback query,而不再需要象9i那样需要调用DBMS_FLASHBACK包。
SELECT * FROM TABLENAME AS OF TIMESTAMP
TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
WHERE ……;

10g的flashback table有如下特性
· 在线操作
· 恢复到指定时间点或者SCN的任何数据.
· 自动恢复相关属性,如索引,触发器等
· 满足分布式的一致性
· 满足数据一致性,所有相关对象将自动一致
语法为:
FLASHBACK TABLE tablename TO TIMESTAMP (JUL-07-2003, 02:33:00)
FLASHBACK TABLE employee TO SCN 123456;
FLASHBACK TABLE t1 TO TIMESTAMP '2003-03-03 12:05:00' ENABLE TRIGGERS;
其中ENABLE TRIGGERS表示触发器恢复之后为enable状态,而默认为disable状态。

注意:如果需要flashback一个表,需要保证
需要有flashback any table的系统权限或者是该表的flashback对象权限。
需要有该表的SELECT, INSERT, DELETE, ALTER权限
必须保证该表ROW MOVEMENT

下面,我们用一个详细的例子来说明这个过程:
16:16:51 SQL> create user flash identified by flash;
User created.
16:17:04 SQL> grant connect,resource to flash;
Grant succeeded.
16:17:19 SQL> connect flash/flash;
Connected.
16:26:35 SQL> create table t1 as select * from all_objects;
Table created.
16:37:24 SQL> create table t2 as select * from t1;
Table created.

16:37:35 SQL> select count(*) from t1;
COUNT(*)
----------
38949
16:37:43 SQL> select count(*) from t2;
COUNT(*)
----------
38949
16:38:06 SQL> create index inx_test1 on T1 (object_name);
Index created.
16:39:55 SQL> create index inx_test2 on T1 (object_id);
Index created.
16:40:47 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2004-04-06 16:41:18
以上获得一个时间戳,假定我们要恢复该表到这个时间,那么以下对该表的操作都将被前滚。
16:41:18 SQL> drop index inx_test1;
Index dropped.
16:41:33 SQL> delete from t1;
38949 rows deleted.
16:41:46 SQL> commit;
Commit complete.
16:41:49 SQL> truncate table t2;
Table truncated.

在以上的操作中,我们delete一个表,然后truncate一个表,下面,我们将来看看flashback table的效果,能恢复到什么程度
16:37:55 SQL> ALTER TABLE t1 ENABLE ROW MOVEMENT;
Table altered.
16:38:03 SQL> ALTER TABLE t2 ENABLE ROW MOVEMENT;
Table altered.

16:43:10 SQL> flashback table t1 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
16:43:49 SQL> flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss')
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed

我们可以发现,执行delete操作的表是可以恢复的,而执行truncate操作的表是不可以恢复的,这正好也说明了flashback table利用undo的结论。
看看我们的结果:
SQL> select count(*) from t1;
COUNT(*)
----------
38949
SQL> select count(*) from t2;
COUNT(*)
----------
0

SQL> select t.index_name from user_indexes t where t.table_name='T1';
INDEX_NAME
------------------------------
INX_TEST2
还可以看到,对于drop的索引,也是没有办法恢复的,因为drop并不记录undo,所以所谓索引的恢复,仅仅是相关索引树的改变而不能找回删除掉的索引。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-14
要想恢复以前的数据要看你的事物是否提交
如果事物没有提交,也就是没有 commit;
那么rollback即可
如果已经提交的话,要看要恢复的时间长短
时间长的话,那就要尝试从备份中恢复,可以求助dba根据时间点来恢复数据,这属于不完全恢复,会丢失恢复时间点到现在得部分更新
如果时间短的话,可以尝试用数据库闪回技术恢复更新,10G及以上版本支持此功能
第2个回答  2011-01-14
Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd
hh24:mi:ss');
第3个回答  2011-01-14
回退业务
第4个回答  2011-01-14
数据小删除后在新增
数据大呼叫DBA

oracle update 数据更新错误,想恢复更新前的数据,该如何恢复
其中ENABLE TRIGGERS表示触发器恢复之后为enable状态,而默认为disable状态。注意:如果需要flashback一个表,需要保证 需要有flashback any table的系统权限或者是该表的flashback对象权限。需要有该表的SELECT, INSERT, DELETE, ALTER权限 必须保证该表ROW MOVEMENT 下面,我们用一个详细的例子来说明这个过程...

oracle数据update后怎么恢复到以前的数据
你可以试试PRM-DUL for Oracle。ParnassusData Recovery Manager(以下简称PRM-DUL)是企业级ORACLE数据灾难恢复软件,可直接从Oracle9i,10g,11g,12c的数据库数据文件(datafile)中抽取还原数据表上的数据,而不需要通过ORACLE数据库实例上执行SQL来拯救数据。ParnassusDataRecovery Manager是一款基于JAVA开发的绿色软...

怎么恢复update或delete操作之后的数据
1、正确的完整数据库的最后一次备份 如果没有数据库完整备份,是不能做事务日志备份的,所以建议创建数据库时,恢复模式一项,应当选择'完整'。2、正确的即时点 即所要恢复到数据的时间点,这个时间点一般选择误操作发生时间往前一点的时间点,所以当误操作发生时,应尽量记下这个时间点,不然可能导致恢复的数...

怎么恢复update或delete操作之后的数据啊?
这里删除掉数据。SQL> delete from test_fb_table;1 row deleted.SQL> commit;Commit complete.确认数据已经被删除。SQL> select * from test_fb_table;no rows selected 方法一:这里检索出,指定时间点上,指定表的数据情况。SQL> select * from test_fb_table 2 AS OF TIMESTAMP TO_TIMEST...

sql恢复修改前数据
1、首先运行Recovery for SQL Server。2、点击:Next > Next--》进入 Recovery Configuration 界面。3、接着选中 Search for deleted records,并选择要恢复的数据库的日志文件路径log file path。4、点击next-》开始恢复。5、点击:Next,选择被恢复数据存放的目标数据库。6、最后点击Finish,然后就完成...

oracle 数据库用update 语句更新无效。
1、若是执行完sql后没有commit,执行结果不会保存,所以update语句无效;2、若是执行了commit,update仍然没有生效,说明表空间可能存在问题,需要具体排查,当然最直接的是删除表空间,重新建立

oracle 修改前自动备份修改数据
触发器是数据库中的一种特殊类型的存储过程,它会在指定的数据库事件发生时自动执行。例如,可以创建一个BEFORE UPDATE触发器,在数据被更新之前自动将原始数据备份到另一个表中或者导出为文件。这样,一旦更新操作发生错误或者需要撤销,就可以从备份中恢复原始数据。另一个方法是利用Oracle的归档日志功能。

请问oracle数据库恢复怎么办啊 求解
(1)系统崩溃只剩下数据文件的情况下的恢复,甚至没有system表空间而只有数据表空间的情况下的恢复.只要提供数据文件就可恢复.(2) undo system 表空间损坏数据恢复 .(3) 非归档或者归档模式下误 delete 数据的恢复、误删除表空间的恢复、 drop truncate update 表的恢复 .(4) 数据库中有大量CLOB ...

oracle中update语句已经提交了能恢复吗
事物已经提交就不能回滚了 可以用闪回,或者用备份来恢复

如何撤销一个已经执行的更新SQL语句
1.可以用rollback transaction来回滚和撤销,我也犯过好几次update后面没有加where条件的严重错误,幸好事先有备份,可以用覆盖的方式来恢复,所以后来我在执行任何一条update语句前都要写注释-别忘了加where条件。2.这个只能使用事务了,具体是设置成不默认提交事务,此时所做的各种操作都没有反应到数据...

相似回答