7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Fusic Advent Calendar 2017

Day 2

AWS Database Migration Service データ移行時におけるエラーレコードの特定方法

Posted at

こんにちは。
Fusic Advent Calendar 2017 2日目は 若干ニッチなお話をさせていただきます。

AWS Database Migration Service とは

AWS Database Migration Service (AWS DMS) は、Oracle、PostgreSQL、Microsoft SQL Server、Amazon Redshift、Amazon Aurora、MariaDB、MySQL など、幅広く使用されている商用およびオープンソースデータベースとの間でデータを移行できます。このサービスでは、Oracle から Oracle など、同機種間の移行をサポートしているほか、Oracle から MySQL、MySQL から Amazon Aurora など、異なるデータベースプラットフォーム間の異機種の移行もサポートしています。
AWSユーザーガイドより抜粋

今回は DMS を使用した初期データ移行時に、
エラーが発生した際の、原因の特定方法を紹介します。

エラーが発生したテーブルのみを指定してタスクを実行

当たり前のことなのですが、
エラーが発生した際は、対象のテーブルのみを指定してタスクを作成・実行してみましょう。
その際、ロギングの有効化は忘れずに。
※ CloudWatch にログが出力されます。

実行後、CloudWatchログを確認してみてください。

エラー部分のログの例

2017-12-01T10:44:43 [TARGET_LOAD     ]E: Failed to wait for previous run (csv_target.c:937)
2017-12-01T10:44:43 [TARGET_LOAD     ]E: Failed to start load process for file '2' [1020403] (csv_target.c:1300)
2017-12-01T10:44:43 [TARGET_LOAD     ]E: Failed to load file '2' [1020403] (csv_target.c:1407)
2017-12-01T10:44:43 [TASK_MANAGER    ]W: Table 'db_name'.'table_name' (subtask 1 thread 1) is suspended (replicationtask.c:2094)
2017-12-01T10:44:43 [TARGET_LOAD     ]E: Failed to load data from csv file. [1020403] (odbc_endpoint_imp.c:5233)

  • エラーが特定出来た → おしまい
  • エラーが特定出来ない → 次へ進む

タスクのログレベルを上げる

エラーの原因となっている コンポーネントアクティビティ (↑の例だと TARGET_LOAD ) のログレベルを

  • LOGGER_SEVERITY_DEBUG

もしくは

  • LOGGER_SEVERITY_DETAILED_DEBUG

に設定します。

参照) AWS Database Migration Service ユーザーガイド

なお、ログレベルの変更は 2017/12/2 現在 Management Console からは行うことが出来ません。
AWS CLI より、

  1. aws dms describe-replication-tasks で タスク の情報を抽出
  2. ↑の情報から ReplicationTaskSettings.Logging.LogComponents の対象となる コンポーネントアクティビティ のログレベルを変更したタスクを複製

といった流れで別タスクを作成します。
別タスクを実行後、CloudWatchログを確認してみてください。

エラー部分のログの例

2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Going to load file '/rdsdbdata/data/tasks/HU2DPNPG5RNCUJDBZPZZYTI5J4/data_files/1/LOAD00000002.csv'  (csv_target.c:1285)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Load data command. Path: , Exe name: psql, Exe params: -h rds_name.ccsis9ijpw43.ap-northeast-1.rds.amazonaws.com -p 5432 -U ***** -w -d db_name -c """\\copy \""db_name\"".\""table_name\"" from '/rdsdbdata/data/tasks/HU2DPNPG5RNCUJDBZPZZYTI5J4/data_files/1/LOAD00000002.csv' WITH DELIMITER ',' CSV NULL 'attNULL' ESCAPE '\\'"""  (provider_syntax_manager.c:2595)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Before wait for command  (csv_target.c:827)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  wait for load command process returned status '10'  (csv_target.c:839)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Load command output: psql: /usr/lib64/libcom_err.so.2: no version information available (required by /rdsdbbin/attunity-2.3.0.R1/lib/libgssapi_krb5.so.2), psql: /usr/lib64/libcom_err.so.2: no version information available (required by /rdsdbbin/attunity-2.3.0.R1/lib/libkrb5.so.3), ERROR:  date/time field value out of range: "0000-00-00 00:00:00", CONTEXT:  COPY table_name, line 83299, column deleted: "0000-00-00 00:00:00"  (csv_target.c:895)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Failed to wait for previous run  (csv_target.c:937)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Failed to start load process for file '2' [1020403]  (csv_target.c:1300)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Failed to load file '2' [1020403]  (csv_target.c:1407)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Failed to load data from csv file. [1020403]  (odbc_endpoint_imp.c:5233)
2017-12-01T11:03:24 [TARGET_LOAD     ]D:  Handling End of table 'db_name'.'table_name' loading failed by subtask 1 thread 1 [1020403]  (endpointshell.c:2147)
2017-12-01T11:03:24 [TARGET_LOAD     ]E:  Failed to wait for previous run  (csv_target.c:937)
2017-12-01T11:03:24 [TARGET_LOAD     ]E:  Failed to start load process for file '2' [1020403]  (csv_target.c:1300)
2017-12-01T11:03:24 [TARGET_LOAD     ]E:  Failed to load file '2' [1020403]  (csv_target.c:1407)
2017-12-01T11:03:24 [TASK_MANAGER    ]W:  Table 'db_name'.'table_name' (subtask 1 thread 1) is suspended  (replicationtask.c:2094)
2017-12-01T11:03:24 [TARGET_LOAD     ]E:  Failed to load data from csv file. [1020403]  (odbc_endpoint_imp.c:5233)

※↑の例だと5行目にエラーの原因が出力されていますね

  • エラーが特定出来た → おしまい
  • エラーが特定出来ない → 次へ進む

S3 に出力したファイルを見て実際のレコードを特定する

ターゲットエンドポイントをS3に指定したタスクを作成し、実行します。
前述のエラーの例の場合、83299行目にエラーが発生しています。(line 83299)
S3に出力されたファイルを確認することで、
エラーが発生したレコードを特定することが可能です。

  • エラーが特定出来た → おしまい
  • エラーが特定出来ない → 次へ進む

サポートに問い合わせる

ターゲットエンドポイントの "追加の接続属性" に「keepCSVFiles=true;keepErrorFiles=true」を設定し、
タスク実行時にレプリケーションインスタンス上に、一時的に保存される移行対象テーブルのデータを、
永続的に保存するようにします。
ただ、2017/12/2 現在では、レプリケーションインスタンスには、
AWSの中の人しかログイン出来ません。
設定後、タスクを再実行し、移行対象テーブルのデータを保存したら、
AWSサポートに問合せてみましょう。

ここまでやったらエラーは特定できてる!…はず

明日のAdvent Calendarは Fusicの核弾頭 @Junkins です。
皆様、お楽しみに!

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?