AWS Database Migration Service (AWS DMS)AWS データベース移行サービス (AWS DMS) タスクを使用して、Amazon Redshift にデータを移行したいと考えています。しかし、タスクにレイテンシーまたはデータ不整合の問題があり、「XXXXBulk apply operation failed.Trying to execute bulk statements in 'one-by-one' mode XXXXX」などのログエントリが表示されます。
簡単な説明
Amazon Redshift はオンライン分析処理 (OLAP) データウェアハウスであり、コストがかかるため頻繁にトランザクションを処理するようには設計されていません。デフォルトでは、AWS DMS はバッチ適用モードを使用して変更をバッチ単位で処理します。Redshift が個別モードで実行されている場合、DMS タスクは変更をターゲットに適用しなかったため、データの不整合やレイテンシーの問題が発生していました。バッチ適用モードを使用する場合、AWS DMS は以下を実行します。
- バッチ適用設定によって制御されるバッチから変更点を収集します。
- バッチからターゲットインスタンスへの変更のすべてを含む差分変更テーブルを作成します。
- トランザクションをグループ化し、ターゲットに一括適用するアルゴリズムを使用します。
Amazon Redshift にデータをレプリケートしている移行タスクでバッチを適用できない場合でも、AWS DMS はバッチ全体を失敗させません。AWS DMS はバッチを分割し、個別モードに切り替えてトランザクションを適用します。AWS DMS が、バッチの失敗の原因となったトランザクションを検出すると、そのトランザクションを Amazon Redshift ターゲットの awsdms_apply_exceptions テーブルにログ記録します。次に、AWS DMS は、バッチのすべてのトランザクションがターゲットに適用されるまで、バッチ内の他のトランザクションを 1 つずつ適用していきます。最後に、AWS DMS は新しいバッチのためバッチ適用モードに戻り、別のバッチが失敗しない限り、バッチ適用を使用し続けます。
解決策
AWS DMS タスクログを確認することで、バッチが失敗し、AWS DMS が 個別モードを使用したかどうかを確認できます。バッチが失敗し、AWS DMS が個別モードに切り替わるたびに、次のログエントリが表示されます。
[TARGET_APPLY ]I: Bulk apply operation failed.Trying to execute bulk statements in 'one-by-one' mode (bulk_apply.c:2175)
この状況が生じた場合、AWS DMS はバッチ内のトランザクションで問題が発生するまで、トランザクションをターゲットに順次適用します。AWS DMS で問題が発生したときは、トランザクションがログに記録され、次のようなログエントリが表示されます。
[TARGET_APPLY ]W: Source changes that would have had no impact were not applied to the target database.Refer to the 'awsdms_apply_exceptions' table for details. (endpointshell.c:5984)
注: AWS DMS タスクのタスク設定で制御テーブルスキーマを指定しない限り、awsdms_apply_exceptions テーブルがデフォルトでパブリックスキーマに作成されます。
AWS DMS はトランザクションをログ記録した後、そのバッチからすべてのトランザクションの適用を完了します。次に、AWS DMS は再度、バッチ適用に切り替わります。ログには、次のようなメッセージが表示されます。
[TARGET_APPLY ]I: Switch back to bulk apply mode (bulk_apply.c:4751)
オンライントランザクション処理 (OLTP) データベースからトランザクションの変更を実行すると、Amazon Redshift のパフォーマンスに影響する可能性があります。バッチ適用が失敗して、AWS DMS は個別モードに切り替わります。AWS DMS が個別モードでトランザクションを実行している間、ターゲットレイテンシーは増加します。AWS DMS が一括適用に切り替わると、ターゲットレイテンシーは減少します。
この問題を解決するには、Amazon Redshift ターゲットに接続します。次に、次のコマンドを実行して awsdms_apply_exceptions テーブルから出力を取得し、バッチの失敗の原因となったクエリを特定します。
select * from public.awsdms_apply_exceptions order by 4 desc;
バッチが失敗した原因となったクエリを見つけたら、エラーを確認します。問題を解決して、タスクが個別モードに移行しないようにすることができます。
関連情報
AWS DMS 移行のデバッグ: What to do when things go wrong
Using an Amazon Redshift database as a target for AWS Database Migration Service