我正在计划将 DB2 8.1 数据库从糟糕的 IBM 编码迁移到 UTF-8,以支持更多语言等。我遇到了一个困扰我的问题。
关于这次迁移的一些注意事项:
- 我们使用 db2move 来导出和加载数据,并使用 db2look 获取数据库的详细信息(表空间、表、键等)。
- 我们发现加载过程与 db2move 导入配合得很好,但是,数据需要 7 个小时才能加载,当我们实际在主数据库上完成转换时,这是不可接受的停机时间。
- 我们现在使用 db2move load,它的速度要快得多,因为它似乎只是简单地将数据放入其中,而不进行完整性检查。这导致了我当前的问题。
完成 db2move 加载过程后,几个表处于检查待处理状态,需要进行完整性检查。完整性检查通过以下方式完成:
设置完整性。立即检查
这对大多数表都有效,但是有些表会出现错误:
DB21034E 该命令被作为 SQL 语句处理,因为它不是有效的命令行处理器命令。在 SQL 处理期间,它返回:
SQL3603N 通过 SET INTEGRITY 语句检查数据处理时发现完整性违规,涉及名为“blah.SQL120124110232400”的约束。SQLSTATE=23514
互联网告诉我,解决这个问题的方法是根据实际表创建一个异常表,并告诉 SET INTEGRITY 命令将任何异常发送到该表(如下所示):
db2 创建表 blah_EXCEPTION 如 blah db2 SET INTEGRITY FOR blah IMMEDIATE CHECKED FOR EXCEPTION IN blah USE blah_EXCEPTION
现在,这是我遇到的具体问题!以上强制所有有问题的行到指定的异常表。好吧,这真是太棒了,但是我不能在这个转换中丢失数据,这简直是不可接受的。互联网和 IBM 对将违规行为发送到异常表然后“处理异常表中的数据”有一个模糊的描述。不幸的是,我不清楚这是什么意思,我希望有聪明的人知道并能帮助我,让我知道如何从这些表中检索这些数据并将数据放在原始/正确的表中,而不是这些异常表中。
如果您有任何疑问,请告诉我。谢谢!
答案1
这个问题的解决方案是,数据库中的某些字符在从 IBM-1252 编码转换为 UTF-8 后违反了特定表的限制。限制几乎总是字符限制。修复这些数据后,我们就不会再遇到数据转换问题。然而,这是一个漫长而可怕的过程。