Oracleから RDS for PostgreSQLへDMS移行後の検証状態が「Mismatched records」になったときの対処方法

2023.11.03

困っていた内容

オンプレミスのDBサーバ(oracle)から RDS for PostgreSQL への移行を実施しています。
DMS移行後に検証状態が「Mismatched records」となり移行先の該当レコードのカラム末尾に、移行元にはない「半角スペース」が追加されており一部のレコードでのみ差異が生じています。

どう対応すればいいの?

本件は、ソースの当該列の値にNULL 文字(文字コードが 0 の文字)が含まれることが考えられます。
可能であればソース側で事前にNULL 文字を削除していただくのが良いかと存じます。

DMS のデータ検証は元のデータ同士を比較するため、結果今回のようにレコード不一致が生じることになります。 このレコード不一致エラーが出ないようにするには、以下AWSドキュメントにございますようにデータ検証時にソースの列値内のNULL 文字を空白に置き換えるようにすることです。


{
    "rule-type": "validation",
    "rule-id": "1",
    "rule-name": "1",
    "rule-target": "column",
    "object-locator": {
        "schema-name": "Test-Schema",
        "table-name": "Test-Table",
        "column-name": "Test-Column"
    },
    "rule-action": "override-validation-function",
    "source-function": "REPLACE(${column-name}, chr(0), chr(32))",
    "target-function": "${column-name}"
}        

JSON エディタを使用して検証ルールを変更する

しかし、この置換処理はNULL 文字を含まないすべての行に対しても実行されるため、データ検証にオーバーヘッドが生じることになります。
可能であれば、やはりソース側で事前にNULL 文字を削除していただくのが良いかと存じます。

Oracle から PostgreSQL にデータを移行する場合、DMS はNULL 文字を空白に置き換えるようです。

Oracle から PostgreSQL への移行で、Oracle の列に NULL 文字 (16 進数値 U + 0000) が含まれている場合、AWS DMS は NULL 文字をスペース (16 進数値 U + 0020) に変換します。これは、PostgreSQL の制限によるものです。

AWS Database Migration Service のターゲットとして PostgreSQL を使用する場合の制限

また以下ドキュメントの通りPostgreSQL の文字データ型の値はNULL 文字を格納できません。

Regardless of the specific character set, the character with code zero (sometimes called NUL) cannot be stored.
(Google機械翻訳内容)
特定の文字セットに関係なく、コード 0 の文字 (NUL と呼ばれることもあります) は格納できません。

8.3. Character Types

参考資料

AWS DMS shows records Mismatched records and it shows around 600 records mismatched

AWS DMS のソースデータベースとターゲットデータベース間のデータ不一致の問題をトラブルシューティングするにはどうすればよいですか?