为什么Informix dbexport会生成损坏的数据?

时间:2013-11-11 11:37:12

标签: informix

我在尝试dbexport / dbimport Informix数据库时遇到了一个奇怪的情况。 导入数据库时​​我们得到错误: 1213 - 字符到数字转换错误 我检查了导入停止的位置。

我编辑了相应的文件(sed -n'1745813,1745815p'table.unl)并看到了看起来已损坏的数据。

3.0]26.0]018102]0.0]20111001.0]0.0]77.38]20111012.0]978]04]0.0072]6.59]6.59]29.93]29.93]77.38]
3.0]26.0]018102]0.0]20111001.0]0.0]143.69]20111012.0]978]04]0.0144]6.59]6.59]48.79]48.79]143.69]
]0.000/]]-0.000000000000000000000000000000000000000000000000000044]8\00\00\07Ú\00\00Õ²\00\00\07P27\00\00\07Ú\00\00i]-0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000999995+']-49999992%(000000000000000000.0]-989074999997704800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0]-999992%(0000000000000000000000.0]]]Ú\00\00]*00000015056480000000000000000000000000000000000000000000000000000000000.0]-92%'9999)).'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0]-;24944999992%(000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0]-81%-999994;2475200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0]]-97704751999992%(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0]

前两行都行。其余的似乎是腐败的数据。 我不知道数据是如何出现的,因为它没有出现在select语句中。

我只导出了受影响的表,并发现存在相同的数据。 我找了一个匹配所有行的过滤器,我在另一个导出中使用它。这次腐败数据不存在。

有关这背后可能是什么原因的任何想法?

最诚挚的问候 亚瑟

1 个答案:

答案 0 :(得分:0)

亚瑟,

尝试回答这个问题,为什么数据库会生成损坏的数据 你需要调查。 常见原因是:

  • 在您的操作系统/硬件上发生了一些崩溃
  • 发生一些能量不足
  • 在您的数据库中发生了一些崩溃,或者某些管理员杀死了他们的进程。
  • 在上述任何问题之后,您的FS会损坏并且可能在恢复(fsck)时弄乱数据库数据 可能你正在使用日记FS,其中ext3,ext4,ntfs是......

如果你对之前描述的任何事件一无所知,你需要调查我们的Informix数据库的online.log,寻找引擎的任何启动,而不是之前的常规关闭。查看您的操作系统日志也有助于发现任何非自愿重启操作系统(缺乏能量或崩溃)。


关于解决方案。

  1. 恢复备份
    然后你可以导出损坏的表,并在你的dbexport替换它。 您可以使用archecker执行此操作。 (必须是10.FC4的Informix版本格式化程序) 如果需要,本文可能会对您有所帮助:Table Level Restore - Pretty Useful Stuff
  2. 像评论中的描述一样导出你的表格 但这不会恢复损坏的数据,他们只会“保存”“好”数据并丢弃“坏”数据。

      
        
    1. 创建了第一个的新表副本。
    2.   
    3. 在表2中插入select * from table1 where(我的过滤器匹配所有行)
    4.   
    5. 重新创建表索引
    6.   
    7. 重命名表格
    8.   
  3. 根据损坏的数据有多糟糕,有时您无法在一次选择中导出所有“好”数据,您需要解决“坏”数据,请查看此IBM文章: Unloading around table corruption


  4. 防止此类问题或轻松恢复的方法

    首先,当然,没有办法防止任何崩溃......
    你可以做的是尽量减少任何碰撞后的伤害。

    1. 不要使用日志文件系统! (在linux上,使用ext2 FS或RAW设备)
    2. 在Informix配置中启用KAIO(用于RAW)或DIRECT_IO(任何FS)。
      这将阻止数据库使用操作系统缓存,从而使在磁盘上写入数据的过程更加安全。在某些情况下,这可能会减慢或加速数据库,这取决于您的硬件/存储。
    3. 将备份配置为工作并以某种频率进行测试/检查 我建议配置完整数据库+逻辑日志备份的备份。
    4. 根据Informix的版本和您拥有的许可证,您可能有权配置冷RSS服务器(“群集”辅助节点),该服务器将在不同服务器上作为主动 - 被动模式运行,并将大大降低您的机会在主服务器崩溃后丢失任何数据。
    5. 发生任何崩溃后,运行oncheck以检测是否发生了一些损坏: How to use oncheck to detect corruption