AWS DMS タスクの最中に一括操作が失敗したことが原因で Amazon Redshift が個別モードに切り替えられた理由をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2019 年 10 月 2 日

ターゲットとして Amazon Redshift にデータを移行する AWS Database Migration Service (AWS DMS) タスクがあるのですが、一括操作が失敗したために、タスクが個別処理モードに変更されました。この問題をトラブルシューティングする方法を教えてください。

簡単な説明

タスクの変更データキャプチャ (CDC) フェーズ中、AWS DMS は単一のスレッドを使用してソースから変更データを読み取り、ターゲットに変更を適用します。スレッドはソースの変更率に応じて、一度に特定数のトランザクションのみを処理できるため、スレッドはソースとターゲットを同期させることができない場合があります。これは、OLAP エンジンではコミットが高額であるため、Amazon Redshift が AWS DMS のターゲットである場合に頻繁に発生します。デフォルトでは、AWS DMS は バッチ適用モードを使用して変更をバッチ単位で処理します。バッチ適用モードを使用する場合、AWS DMS は以下を実行します。

  1. バッチ適用設定によって制御されるバッチから変更点を収集します。
  2. バッチからターゲットインスタンスへの変更のすべてを含む差分変更テーブルを作成します。 
  3. トランザクションをグループ化し、ターゲットに一括適用するアルゴリズムを使用します。

Amazon Redshift にデータをレプリケートしている移行タスクでバッチの適用に問題がある場合でも、AWS DMS はバッチ全体を失敗させません。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)

Amazon Redshift は、複雑な分析クエリを実行するために最適化された OLAP データウェアハウスです。ただし、OLTP データベースからトランザクションの変更を実行すると、Amazon Redshift のパフォーマンスに影響する可能性があります。その結果、バッチ適用が失敗して AWS DMS が個別処理モードに切り替わる、AWS DMS が個別処理モードでトランザクションを実行している間中、ターゲットレイテンシーが増加することがわかります。AWS DMS が一括適用に切り替わると、ターゲットレイテンシーは減少します。

この問題を解決するには、Amazon Redshift ターゲットに接続します。次に、awsdms_apply_exceptions テーブルから出力を取得し、バッチの失敗の原因となったクエリを特定します。

select * from public.awsdms_apply_exceptions order by 4 desc;

バッチが失敗する原因となったクエリ (更新の競合や制約違反など) を見つけたら、競合を解決してタスクが個別処理モードに移行しないようにすることができます。