很悲催,以为在客户那边的数据有问题删掉就行了,结果告诉我那是客户的正常使用的数据,我也是一脸懵逼。特此警戒自己和大家,开发的沟通很重要很重要很重要。然后就开始了找回丢失数据的漫长(一天)道路。
1.首先我使用的是plsql的oracle可视化界面的空间,我先查看了下历史执行的语句记录Ctrl+e,可以看到所有近期执行的sql语句,发现并没有使用语句做删除的,是直接在数据库进行操作的,还是用语句操作的好,整还是得整规范的。另寻他路;
2.使用 Oracle Database 10g 中的闪回表特性。
2.1alter table 表名 enable row movement; 允许移动
2.2 查询删除数据的时间点的数据(也就是闪回至该时间点之前的数据)
select * from WMS_TEST as of timestamp to_timestamp('2016-02-26 12:10:00','yyyy-mm-dd hh24:mi:ss'); (如果不是,则继续缩小范围)
2.3 恢复删除且已提交的数据
flashback table wms_out_end_product_item to timestamp to_timestamp('2016-04-1 14:30:00','yyyy-mm-dd hh24:mi:ss');
2.4 alter table 表名 disable row movement; 使用完之后关闭
操作了这个方法之后,确实发现在昨天晚上8点左右删的数据中的一步,在执行的过程中则报了个快照过久的异常。OMG,发现时间是过得差不多一天了,去查了一下了解到,如果oracle没有设置过快照保存的时间,最多也就一天可以,有些还没一天,看具体的环境。用这个方法找回了两天数据。
3.没退路了。只好找到原来的系统设置好的每天自动更新数据库的位置,取出了当天凌晨数据库自动的备份文件.dbm,创建一个新的 数据库,把数据导过来,再找到当时删除的记录,说干就干,做事情,解决问题,你一下解决不了,就不要多想 了,感觉改变策略执行下一个问题,这样处理问题的效率比较高,人的想法也会比较积极(跑偏了),继续先拿着他们的压缩包搭建一个数据库。导出数据库的脚本语句:
Expdp zjshnew/zjshnew@ZJSHNEW directory=dir_dp dumpfile=ZHSH20171213.dmp logfile=ZJSHNEW20171213.log schemas=zjshnew
3.1先创建数据库, 数据库的名称和用户名称密码 以及表空间名与客户那边的最好保持一致,以免出错。
3.2创建表空间语句:
create tablespace zczg logging datafile 'D:appAdministratororadatazczgzczg.dbf' ---实际实例目录 size 50m autoextend on next 50m maxsize 20480m extent management local;
3.3创建数据库日志文件语句:
create temporary tablespace zczg_temp tempfile 'D:appAdministratororadatazczgzczg_temp.dbf'---实际实例目录 size 50m autoextend on next 50m maxsize 20480m extent management local;
3.4创建用户语句:
create user zczg identified by zczg default tablespace zczg temporary tablespace zczg_temp;
3.5授权给用户语句:
grant connect,resource to zczg; grant dba to zczg;
3.6做一个脚本.bat,数据库导入文件:
Impdp zhgh/zhgh@zhgh directory=dir_dp dumpfile=ZHGH_DB_20170913.DMP remap_schema
=zhgh:zhgh transform=segment_attributes:n logfile=zhgh.log