开发人员向我反映由于误操作删除了表里的一些数据,要求我恢复。
咨询了误操作的时间点后,我用闪回查询试了一下,被误删的数据还在回滚段,可以挽救回来。
我先备份了现在表里的数据。
create table a as select * from 业务表。
然后我做了一件愚蠢的事
truncate table 业务表
insert into 业务表 select * from 业务表 as of timestamp to_timestamp('2014-06-18 13:30:01','yyyy-mm-dd hh24:mi:ss');
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
结果提示了错误,说表的定义已经改变。因为ORACLE的闪回要求你的表结构从你误操作的时间点起到执行闪回查询的时间点,表定义是不能改变的。
刚刚闪回查询还可以,怎么短短一分钟不到,谁就把表结构给改了呢?
奥,我明白了,是我自己犯了错误,truncate操作也被闪回查询认为是改变表结构定义的操作。是我自己做的孽。
怎么办?
还好,truncate之前,我是备份了 开发误操作后的数据的,这部分数据我可以找回。
那么开发误操作的数据如何找回呢?闪回是不行了
LOGMINER要登场了。庆幸的是,所有的数据库我都开启了辅助日志。
最终通过LOGMINIER,解析了那段时间的误操作日志,通过SQL_UNDO字段的内容,成功恢复出了数据,有惊无险。
这个事件给我提了个大醒。DBA要了解ORACLE特性的细节,基础知识要扎实,尽量避免使用TRUNCATE操作。删除数据前要做备份。
咨询了误操作的时间点后,我用闪回查询试了一下,被误删的数据还在回滚段,可以挽救回来。
我先备份了现在表里的数据。
create table a as select * from 业务表。
然后我做了一件愚蠢的事
truncate table 业务表
insert into 业务表 select * from 业务表 as of timestamp to_timestamp('2014-06-18 13:30:01','yyyy-mm-dd hh24:mi:ss');
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
结果提示了错误,说表的定义已经改变。因为ORACLE的闪回要求你的表结构从你误操作的时间点起到执行闪回查询的时间点,表定义是不能改变的。
刚刚闪回查询还可以,怎么短短一分钟不到,谁就把表结构给改了呢?
奥,我明白了,是我自己犯了错误,truncate操作也被闪回查询认为是改变表结构定义的操作。是我自己做的孽。
怎么办?
还好,truncate之前,我是备份了 开发误操作后的数据的,这部分数据我可以找回。
那么开发误操作的数据如何找回呢?闪回是不行了
LOGMINER要登场了。庆幸的是,所有的数据库我都开启了辅助日志。
最终通过LOGMINIER,解析了那段时间的误操作日志,通过SQL_UNDO字段的内容,成功恢复出了数据,有惊无险。
这个事件给我提了个大醒。DBA要了解ORACLE特性的细节,基础知识要扎实,尽量避免使用TRUNCATE操作。删除数据前要做备份。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-1187959/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22034023/viewspace-1187959/