章
目
录
在进行Oracle数据库操作时往往会因为自己的一时大意导致数据库误操作,比如没写where导致整表误update或误删除,可能直接导致系统崩溃,那想要恢复之前的误操作数据该如何去做?
写这篇文章,主要是潘老师今天犯了一个影响说大不大但性质还是很严重的错误。
测试人员找我修改下某个表的一些数据方便测试,可我这个粗心呀,写完update语句,就直接执行了,刚执行完就拍大腿了,忘了写where条件了!整个世界崩塌了,显示20000多条数据受影响,没错,整个表数据全部都被误更新了。
由于使用的是Navicat也没有commit和rollback按钮,这些数据已经实实在在地躺在了数据库,查询一看清一色的相同字段值,似乎在赤裸裸地嘲讽着我!最关键的是,测试库数据没有备份!
记录下这该死的语句:
# WHERE被我吃了~ update T_PSP_PLAN set TIME_LIMIT='T4,T8,SP' ,CONTAINER_DES_CODE='755JES',CONTAINER_TIME_LIMIT='T4'
说这次事件影响不大一是因为毕竟是测试库,大不了数据重建,二是因为该表不是核心系统配置表,修改的字段也不是最核心的字段,但性质很恶劣就是反应了自己的粗心,态度不严谨,容易酿成重大事故。好在,保持镇定,假装冷静,开始寻找其他的恢复数据库方法,结果还真找到了,关键也确实实现了数据库的恢复,现在记录在下面:
Oracle数据库update或误删除提交后恢复方法
执行查询视图v$sqlarea
,找到你操作那条SQL的时间,sql如下:
# sql_text 可以换成你的sql,可模糊查询 select r.FIRST_LOAD_TIME,r.* from v$sqlarea r where sql_text like '%你误操作的sql语句%' order by r.FIRST_LOAD_TIME desc ;
主要是找到你误操作sql的操作时间,即查询出来的第一个FIRST_LOAD_TIME
字段值
执行下面两条SQL,即可将数据恢复到执行update之前,某某时间之前的数据。
alter table 误操作表名 enable row movement; # sql误执行时间(我这里向前推了1秒) 比如:2021-11-09 11:36:21 flashback table 误操作表名 to timestamp to_timestamp('sql误执行时间', 'yyyy-mm-dd hh24:mi:ss');
执行成功之后再去查询表数据,惊喜地发现正的恢复了,至于这个时间点之后的数据丢了就丢了,毕竟测试库,恢复的又比较及时,已经算是比较完美了!
认识flashback
一般Oracle数据恢复可以使用备份恢复或者使用日志rollback恢复,不过都比较耗时,而且甚至要停掉Oracle会影响业务正常运行,而提供的另一种恢复手段就是上面我们用的flashback
,称为“闪回”,是一种快速数据库恢复机制。
1)Flashback的简单原理
Oracle会将数据库数据的每1个改动记录在日志文件中, 所以理论上依靠日志文件, 是能将数据库回滚到任何一个时间点的,而Flashback的机制有点类似与回收站, 会把数据库改动前的镜像放到undo表空间中.,如果用户要rollback1个数据库对象, 只需要找到undo表空间中对应的Undo数据即可。
2) Flashback的优点
很明显, Flashback并不依赖于日志文件, 只需Undo表空间中undo数据即可发挥作用,所以Flashback可以满足用户逻辑错误的快速恢复。优点如下:
- 1. 快速
- 2. 在线恢复, 无需关闭数据库
- 3. 操作简单,便捷
3) Flashback的缺点
Flashback缺点同样明显.
1. 只适用于用户逻辑错误, 所谓逻辑错误就是用户对数据的误操作, 例如误删除/更新一些数据行等等,而对于数据文件的损坏则无能为力(只能通过日志恢复).
2. undo表空间的容量有限, 旧的undo数据有可能会被新的数据覆盖, 所以Flashback一般只适用于短时间内的恢复, 对于一段相当时间前的误操作, 很可能因为undo数据被覆盖而恢复失败。
总结
总结经验有以下几点:
- 执行sql之前最好再确认一遍,保证100%无误后再执行,千万别手速过快
- oracel数据库操作工具建议使用plsql,可以有commit和rollback按钮,有一次纠错的机会。
- 数据库一定要做好定时备份
- 遇事要冷静镇定,不能慌!
好了,以上就是Oracle数据库update或误删除提交后想恢复该怎么操作的全部内容,如果还有什么疑问可以留言评论。