经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle整表数据被误删除之寻踪
来源:cnblogs  作者:大山与人  时间:2020/12/8 9:01:14  对本文有异议

问题描述

  1. 开发同事在在14点左右发现任务表task_info数据不正确,3个小时之前的数据消失了,数据截止时间11:38:27

问题分析

  1. 查询过dba_source,只找到一个删除该表的存储过程,而且也不会造成这种情况;

  2. 根据现象,怀疑有人在11:38左右做了delete操作且没有写where条件,把整表数据全部删除;

  3. 关联查询dba_hist_active_sess_history,gv$sql未发现相关语句

  4. 关联查询gv$active_session_history,gv$sql也未发现相关语句

  5. 可能时间太久,sql已经不在缓存中 ,根据推测时间精确查找gv$active_session_history,发现有delete操作,且通过等待事件参数和object_id都确定为这个表,但是sql缺失,不能确定是否是该条记录,且通过machine等信息看,还是一个iis站点程序,一般情况程序不会犯这等错误

    1. select t.* from v$active_session_history t where t.sample_time
    2. between to_date('2020-11-26 11:36:00','yyyy-mm-dd hh24:mi:ss')
    3. and to_date('2020-11-26 11:40:00','yyyy-mm-dd hh24:mi:ss')
    4. and t.SQL_OPNAME not in ('SELECT','INSERT','UPDATE')
  6. 通过logminer解析日志查看相关信息

    • 恢复相关时刻的日志

      1. select t.FIRST_TIME,
      2. t.NAME,
      3. t.BLOCKS * t.BLOCK_SIZE / 1024 / 1024 size_mb,
      4. t.NEXT_TIME,
      5. t.COMPLETION_TIME
      6. from v$archived_log t
      7. order by first_time desc;
    • 通过rman恢复相关归档日志

      1. run{
      2. ALLOCATE CHANNEL CH1 DEVICE TYPE DISK;
      3. ALLOCATE CHANNEL CH2 DEVICE TYPE DISK;
      4. ALLOCATE CHANNEL CH3 DEVICE TYPE DISK;
      5. ALLOCATE CHANNEL CH4 DEVICE TYPE DISK;
      6. set archivelog destination to '+DG_FLASH_ARCH';
      7. restore archivelog from time 'sysdate-5/24';
      8. }
    • 执行logminer

      1. begin
      2. dbms_logmnr.add_logfile('+dg_flash_arch/rac/ARCHIVELOG/2020_11_26/thread_2_seq_119065.391.1057504707',dbms_logmnr.new);
      3. --dbms_logmnr.add_logfile('+DG_FLASH_ARCH/rac/archivelog/2020_11_26/thread_2_seq_119065.391.1057504707',dbms_logmnr.ADDFILE);
      4. end;
      5. begin
      6. dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
      7. end;
      8. create table t1 tablespace USERS as
      9. select * from v$logmnr_contents where table_name='TASK_INFO' and OPERATION='DELETE';
      10. select t1.machine_name,t1.client_id,t1.* from t1 order by t1.client_id desc;
      11. begin DBMS_LOGMNR.END_LOGMNR();end;
  7. 查询machine_name,client_id,session#编号信息都是没有有效信息

  8. 最后发现有解析redo结果中有事务id,对比v$active_session_history中之前找到的那条记录,发现解析出来的事务号跟其一致,这下就证实了是程序删除的

  9. 问题回转给开发查找代码,最终找到相应代码,并整改。

总结

查找过程中,线索屡次中断,还好没放弃,最后意外通过事务号一锤定音。

原文链接:http://www.cnblogs.com/startupforce/p/14043330.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号