问题描述:
3月份的某天,开发人员操作表t_xxx失误,未加任何where条件
解决方案:
1.通过闪回恢复一张新表t_xxx_180313_1548,操作失误时间为15点48分33秒
2.通过新表恢复业务表t_xxx的字段orderid
失误sql执行过程
实施步骤:
1.0 通过闪回恢复一张新表t_xxx_180313_1548
-- 闪回
create table t_xxx_180313_1548 as
select * from t_xxxas of timestamp to_timestamp('2018-03-13 15:48:00','yyyy-mm-dd hh24:mi:ss')
2.0 通过新表恢复业务表t_xxx的字段orderid
-- 创建索引
create index idx_eo_pk_orderfee on t_xxx_180313_1548 (pk_orderfee) nologging parallel 4 tablespace nnc_index01;
alter index idx_eo_pk_orderfee logging parallel 1;
-- 恢复表t_xxx数据
update t_xxx a
set a.orderid = (select b.orderid from t_xxx_180313_1548 b
where a.pk_orderfee = b.pk_orderfee
)
where exists (select 1
from t_xxx_180313_1548 b
where a.pk_orderfee = b.pk_orderfee
)
恢复语句执行过程
经验教训:
整个处理过程历时近40分钟,虽然最后解决了问题,也未对业务造成太大影响,但好好回顾一下,很多地方做的不够好……
ps:好久没处理过这么紧急的问题,不禁想起,毕业前几年在lenovo维护工厂系统时,整个车间上千名工人原地站着,等着你把系统问题解决……现在回想起来,当时还是蛮淡定和习惯的,现在反而多了一些杂念和不习惯,还好脑袋比以前要清晰一些……
1. 紧急应对方案在哪
不可否认,应对逻辑操作失误还是缺乏经验,也没有制定成熟的应对方案,接下来得好好整理下备份恢复的事情了
Oracle DBA高效入职指南的276页-如何快速恢复刚删除的表及其数据,很值得参考
2. 心态可否再稳一些
太久没处理紧急问题,而且这类问题刚好是我的软肋,刚开始确实有些紧张
3. 开发可否再完善一些
失误sql竟然是从系统界面发起的,可想系统的防呆措施有待提升……
目前开发有权限直接操作数据库,是否回收一下呢?我也想,需要人手……
领取专属 10元无门槛券
私享最新 技术干货