数据库操作,可能会误删一些数据,怎么找回这些数据,就可以使用这篇文章介绍的闪回技术。
备注:写这篇文章源于我的一次误操作,没有备份数据,一个时间戳数据错误,导致删掉了几天的数据,找回数据的过程,了解了闪回技术,所以在这做了总结记录。
我的删除操作语句如下:
delete from IE_CK_TABLE
where adddate >= to_date ('2017-07-19 15:00:00','yyyy-mm-dd hh24:mi:ss')
一、首先,给数据一个备份操作
1,从闪回表里备份数据
create table IE_CK_TABLE_bak
as
select * from IE_CK_TABLE as of TIMESTAMP to_timestamp('20170725 161535','yyyymmdd hh24miss')
where adddate >= to_date ('2017-07-19 15:00:00','yyyy-mm-dd hh24:mi:ss')
2、直接备份数据
CREATE TABLE [table_name]_[DATE] AS SELECT * FROM [table_name] WHERE ...;
eg:
CREATE TABLE cux_example_all_0725 AS SELECT * FROM cux_example_all WHERE example_id = 1;
为了更保险起见,备份一个当前状态的,备份一个删除数据之前状态的。数据进行对比,查看操作的数据。(如果你有管理员权限,建议暂停系统,避免恢复过程中的操作数据无效)。where字句不用,就是全部数据备份,之后可以将停系统之前的状态和恢复之后的数据表进行对比,来还原修改数据。
二、闪回操作语句
本次是执行delete语句,错删数据,因此采用闪回表技术。
1、查询删掉的数据
SELECT *
FROM ie_ck_table AS OF TIMESTAMP to_date('2017-07-25 16:09:53', 'yyyy-mm-dd hh24:mi:ss')
WHERE adddate >= to_date('2017-07-19 15:00:00','yyyy-mm-dd hh24:mi:ss');
where选择条件是当时删除时的条件,从而找到被删掉的数据。
2、闪回表语句,执行闪回操作
flashback table ie_ck_table to timestamp to_timestamp('2017-07-25 15:33:27' ,'yyyy-mm-dd hh24:mi:ss')
回退到删除操作执行之前的时间,尽量回退到删除操作之前1秒或1分。
小插曲: 我当时执行回退,遇到了一个错误ORA-08189: cannot flashback the table because row movement is not enabled
解决办法:执行 alter table wzq_ie_ck_table enable row movement
此时又遇到一个错误:ORA-00054: resource busy and acquire with NOWAIT specified
资源被占用,那么就要找到占用未结束的会话,结束它。具体解决办法参见:http://blog.itpub.net/26148431/viewspace-2121271/
会话查找,执行语句:
select l.session_id,o.owner,o.object_name from v$locked_object l,dba_objects o where l.object_id=o.object_id
SELECT sid, serial#, username, osuser, terminal,program ,action,PREV_SQL_ADDR FROM v$session where sid = session_id
alter system kill session 'SID,SERIAL#';
此时,再执行alter语句就可以了,当开启ROW MOVEMENT后,表被顺利的flashback了。
详细内容参见 http://www.cnblogs.com/ivictor/p/3975339.html
3、表数据的对比校验
将系统关闭时的数据和恢复的数据表进行对比,这个参见http://www.askmaclean.com/archives/oracle-compare-data-between-tables-method.html
但是操作比较复杂。
4、闪回表保存时间
5、思考
数据备份之后,在恢复数据期间对数据进行的操作是