日期:2014-05-16  浏览次数:20727 次

oracle 数据库 批量导入数据后,两天后数据神秘失踪
现在遇到一个特别奇特的问题,因为系统是个比较大型的系统,包含好几个区域的数据
  前两天因为系统上线的需要对就系统数据进行大批量的数据迁移,发现了这个问题,求
高手赐教啊!!!
  问题是这样的,三天前开始 导入旧系统数据,共分为三个区的数据 每个区导入数据大概为 4个G左右
  每次导入完成后,存储过程的日志都会把执行完成的数据量记录下来的。前两天都没发现问题,但是今天发现了个
奇特的问题,之前导入的数据 无故突然开始丢失,人员表数据 丢失上万,单位信息表八百多的数据,现在基本上没有了,还剩下 数十条数据;这也意味着 之前的迁移数据基本废了;
  请问大家这个事情 可能出现的原因都是那些呢??? 
  (排除原因1:批量数据迁移未提交;这是不可能的 因为前天导入后 昨天程序里还能查到数据,今天就没有了;)
  (排除原因2:手动删除数据:这是不可能的;没人会做这种事)
 
  现在发现的可能异常: 数据库回滚段一直是满的;前天开始系统数据库服务器备份因为空间不足而发生了异常;但是不知道这会不会影响对数据库数据的迁移结果;


  总之,现在问题就是 之前迁移完成的数据,在今天 陆陆续续消失了…… 
  求解……

------解决方案--------------------
未提交之前,数据在DB Buffer里面(也有可能已经输出到磁盘),回滚段中的数据使用来rollback的。
如果是磁盘空间不足导致错误,日志里面会有输出的。
查下告警文件吧,告警文件位于BACKGROUND_DUMP_DEST参数指定的目录下,文件名alert_<ORACLE_SID>.log。
------解决方案--------------------
探讨
引用:
排除原因1:批量数据迁移未提交;这是不可能的 因为前天导入后 昨天程序里还能查到数据,今天就没有了
有可能,存在回滚段内和内存中,过了1天,被覆盖了


LOGMINER分析下,确认下是否提交了,还有看看之后是否有谁做了其他的操作了

(排除原因2:手动删除数据:这是不可能的;没人会做这种事)
一切皆有可能,

看看日志里有什么信息


你好,请教……

------解决方案--------------------
先来温习下COMMIT语句处理顺序:
当事务提交时,Oracle分配一个唯一的顺序号SCN(System Change Number)给事务。数据库恢复总是基于该SCN号来进行处理。SCN号是记录在控制文件、数据文件、块头及重做日志文件中。
1.COMMIT处理步骤:
Oracle 在下面情况提交事务:
l 发出一个COMMIT语句。
l 执行DDL语句时。
l 离开Oracle时
Oracle处理COMMIT的顺序是:
1)服务器为每个COMMIT产生一个SCN。使改变永久化。
2)LGWR进程将日志缓冲区数据并带有SCN一起写到重做日志文件。
3)服务器释放表级和行级锁。
4)用户被提示COMMIT完成。
5)服务器使事务已完成。


如果commit了,是会写入到redo日志里的,同时事务就算结束了,如果写磁盘报错,那么数据就会丢失,数据库并不会进行回滚的,但是归档文件里是有数据记录的,前提是开归档,呵呵
我的库经常遇到这个问题,最大文件到达32G了,就会丢失一部分数据,我看到报警后处理后,恢复正常