首页 > Linux操作系统 > Linux操作系统 > 一种数据被误修改后的找回方法
一种数据被误修改后的找回方法
之前同事跟我提起我们数据库中表的数据有时会莫名其妙的被修改,针对这种情况如何尽快的找到原来的数据呢,看起来问题比较棘手,但如果问题发现的时间与数据被修改的时间间隔不长的话,在oracle中提供了一种比较简单和轻量级的方法就是闪回查询,通过闪回查询在大多数情况下可以满足这种要求。
假设希望获得表t1一天前的数据,使用如下查询即可以达到目的:
FM@TEST 2013-11-22 15:21:21> SELECT * FROM T1 AS OF TIMESTAMP ( TO_DATE('2013-11-21 15:19:51', 'YYYY-MM-DD HH24:MI:SS') ) ;
A
----------
BBB
但如果查询更早时间的数据,也有可能会报错:
FM@TEST 2013-11-22 15:21:35> SELECT *FROM T1 AS OF TIMESTAMP ( TO_DATE('2013-11-21 00:19:51', 'YYYY-MM-DD HH24:MI:SS') ) ;
SELECT * FROM T1 AS OF TIMESTAMP ( TO_DATE('2013-11-21 00:19:51', 'YYYY-MM-DD HH24:MI:SS') ) *
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number 2 with name "_SYSSMU2_1606812849$" too small
能够查询到多久前的数据可以查询视图v$undostat(该视图会保留4天的数据):
SYS@test 2013-11-23 18:18:51> select begin_time, end_time , tuned_undoretention from v$undostat order by end_time;
BEGIN_TIME END_TIME TUNED_UNDORETENTION
------------------- ------------------- -------------------
2013-11-19 18:28:21 2013-11-22 21:18:21 0
2013-11-22 21:18:21 2013-11-22 21:28:21 1123
2013-11-22 21:28:21 2013-11-22 21:38:21 900
2013-11-22 21:38:21 2013-11-22 21:48:21 1120
2013-11-22 21:48:21 2013-11-22 21:58:21 1720
2013-11-22 21:58:21 2013-11-22 22:08:21 1116
2013-11-22 22:08:21 2013-11-22 22:18:21 1717
这个查询跨度由undo_retention参数、undo表空间的大小和undo表空间的RETENTION属性(取值为NOGUARANTEE、GUARANTEE)来控制,如果将undo_retention参数设置为更大的值(oracle的建议值是86400),并且undo表空间为自动扩展的话,闪回查询可以保证查询到更长时间前的数据。
另外通过这次对表的闪回查询的测试,纠正了之前的一个理解错误,表的闪回查询需要在归档模式下才有效,其实没有任何关系。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7913676/viewspace-777419/ ,如需转载,请注明出处,否则将追究法律责任。