0

我们在尝试 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 语句中。

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

知道这背后的原因可能是什么吗?

最好的问候亚瑟

4

1 回答 1

0

亚瑟,

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

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

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


现在谈谈解决方案。

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

    1. 创建了第一个的新表副本。
    2. 插入表 2 select * from table1 where (匹配所有行的过滤器)
    3. 重新创建表索引
    4. 重命名的表
  3. 根据损坏数据的严重程度,有时您无法一次选择导出所有“好”数据,您需要解决“坏”数据,请查看这篇 IBM 文章: 卸载表损坏


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

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

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