Data Transmission Service (DTS) は、構造化されたエラーコードでエラーを報告します。このページを使用して、根本原因を特定し、問題を解決してください。
表示されているエラーメッセージの例は参照用です。実際のメッセージはフォーマットが異なる場合があります。
問題の特定
どのエラーコードが該当するかわからない場合は、以下の現象を参考にしてください:
| 現象 | 考えられるエラーコード |
|---|---|
| 再起動直後にタスクが失敗する | DTS-50019、DTS-51009 |
| ターゲットテーブルに列が見つからない | DTS-30018、DTS-30019、DTS-70019 |
| SQL 実行が失敗する | DTS-10046、DTS-30020、DTS-70004 |
| ソースデータベースに接続できない | DTS-60001、DTS-61015 |
| ターゲットデータベースに接続できない | DTS-71016 |
| Redis に接続できない | DTS-10015 |
| データ書き込みが失敗する、またはテーブルが満杯である | DTS-30011 |
| バイナリログの解析が失敗する | DTS-1051009 |
| テーブルまたはデータベースが見つからない | DTS-70002 |
| メタデータの保存が失敗する | DTS-30005 |
エラーリファレンス
DTS-51009 — データキャッシュからの読み取り接続タイムアウト
例:
DTS-31009: In process of processing data (recordRange: 5799806987638145024) failed cause:
CriticalAnyAllException: capture-dstore: DTS-51009: Failed to fetch records from dstore
TimeoutException: Failed to get offsets by times in 120000 ms原因:ネットワークジッターにより、データ書き込みモジュールとデータキャッシュモジュール間の接続が中断され、読み取り操作がタイムアウトしました。
修正:タスクを再起動します。それ以上エラーが発生せずに再開された場合は、追加の操作は必要ありません。
DTS-50019 — 指定された時点のデータを読み取れない
例:
DTS-31009: In process of processing data (recordRange: 9117052685537771520) failed cause:
CriticalAnyAllException: capture-dstore: DTS-51009: Failed to fetch records from dstore
CriticalAnyAllException: capture-dstore: DTS-50019: seek timestamp for topic [-0]
with position [{"timestamp":1621516671, "offset":-1}] failedエラーメッセージ内のタイムスタンプは UNIX タイムスタンプです。UNIX タイムスタンプコンバーターを使用して、対応する協定世界時 (UTC) を取得してください。
このエラーは、タスクが再開する必要のある時点のデータがデータキャッシュに保持されていないことを意味します。DTS は、直近 24 時間または 50 GB の増分データログのみを保持します。次の 3 つのシナリオで、この保持期間を超えてしまう可能性があります:
原因 1:タスクの一時停止時間が長すぎる
タスクが一時停止されると、DTS はバックグラウンドでログの期限切れ処理を続行します。タスクが 6 時間以上一時停止したままである場合、再開に必要なログはキャッシュに存在しなくなります。
必要な時点がソースデータベースのバイナリログまたは redo ログの範囲内にまだある場合は、Alibaba Cloud テクニカルサポートに連絡してデータを再読み込みしてください。
そうでない場合は、新しいタスクを作成します。再発を防ぐため、実行中のタスクを 6 時間以上一時停止しないでください。
原因 2:障害発生後、タスクが長時間停止したままになっている
タスクが失敗し、迅速に回復されない場合、タスクが再開される前に必要なログがキャッシュから期限切れになります。
根本的なエラーを修正してから、新しいタスクを作成します。エラーが発生した場合は、ログの期限切れを避けるために迅速に対処してください。
原因 3:完全データ移行に時間がかかりすぎた
DTS は、完全移行または同期が開始された瞬間から増分ログのキャッシュを開始します。完全データ移行または同期が長時間にわたる場合、タスク開始後にキャッシュされたデータログが DTS によってクリアされている可能性があります。その結果、増分データの解析に使用されるデータログが不完全になります。
新しいタスクを作成します。開始する前に、データ量を推定してください。大規模なデータセットの場合は、移行を複数のタスクに分割して、各実行がログ保持期間内に収まるようにします。
DTS-30018、DTS-30019、DTS-70019 — ターゲットテーブルに列が見つからない
例:
DTS-30019: Can not find column [column_in_source<-->column_in_target] in target table db_name.table_name
DTS-70019: Can not find column[column_in_source<-->column_in_target]in target table db_name.table_name原因 1:タスクの設定時に、移行タイプとしてスキーマ移行が選択されていませんでした。スキーマ移行がないと、DTS はターゲットテーブルの構造を作成しないため、列が存在しません。
原因 2:タスクの設定後にソースデータベースまたはターゲットデータベースで DDL 文が実行され、スキーマに不整合が生じました。
修正:ソースデータベースとターゲットデータベースのテーブルスキーマを一致させてから、タスクを再起動します。
どちらの原因も当てはまらない場合は、以下の追加手順を試してください:
移行タスクを再起動して、再開されるか確認します。
影響を受けるテーブルを選択したオブジェクトから削除し、再度追加してリトライします。
DTS-10046、DTS-30020 — SQL 実行の失敗
例:
DTS-10046: execute sql: CREATE TABLE if not exists `dts`.`table_name` (...) failed.
Create TransactionTable failed. cause: MySQLSyntaxErrorException:
CREATE command denied to user 'username'@'ip_address' for table 'table_name'ほとんどの場合、このエラーコードとともにデータベースエンジンのエラーメッセージが含まれています。SQL 文とデータベースのエラーメッセージを確認して、具体的な失敗原因を特定してください。
原因:データベースアカウントに必要な権限 (上記の例では CREATE TABLE) がありません。
修正:不足している権限をデータベースアカウントに付与し、操作をリトライします。
DTS-70004 — 文の実行の失敗
DTS-70004 は複数の失敗シナリオをカバーしています。エラーメッセージを以下のいずれかのバリアントと照合してください。
バリアント:AnalyticDB for MySQL でサポートされていない DDL
例:
DTS-70004: execute statement failed: /*dts_id=dtsaaaaaaaaaa*/alter table `xxx`.`yyy`
modify column `aaa` INT default 0 comment 'bbb'
cause: SQLException: modify column type is not supported, col=x, oldType=bigint, newType=int原因:DTS が、AnalyticDB for MySQL でサポートされていない DDL 文を同期しようとしました。DTS はサポートされていない DDL を自動的にスキップできないため、同期タスクは停止します。
修正:
データベース全体を同期する必要がない場合:影響を受けるテーブルを選択したオブジェクトから削除し、ターゲットデータベースから削除してから、再度選択したオブジェクトに追加します。DTS はスキーマと既存データを再同期し、サポートされていない DDL 文はスキップされます。
データベース全体を同期する必要がある場合:AnalyticDB for MySQL に、ソーステーブルと同じスキーマで名前が異なる一時テーブル (テーブル A) を作成します。
INSERT INTO SELECTを実行して、ソーステーブルからテーブル A にデータをコピーします。元のターゲットテーブル (テーブル B) を削除します。RENAMEを実行して、テーブル A の名前をテーブル B に変更します。同期タスクを再起動します。
バリアント:ターゲットデータベースがシャットダウンされている
例:
DTS-70004: execute statement failed: ...
error detail message: Server shutdown in progress
MySQLNonTransientConnectionException: Server shutdown in progress原因:ターゲットデータベースで SHUTDOWN 操作が実行され、DTS が変更を適用するために必要な接続が切断されました。
修正:ターゲットデータベースが実行中であることを確認してから、同期タスクを再起動します。
バリアント:リモートログインが拒否された
例:
DTS-70004: execute statement failed: ...
cause: SQLException: null, message from server:
"Host '192.10.XX.XX' is not allowed to connect to this MySQL server"原因:ターゲットの MySQL データベースが DTS 接続をブロックしています。これは、DTS サーバーの IP が許可リストにないか、データベースアカウントにリモートログイン権限がないことが原因です。
修正:
許可リストの設定を確認します。詳細については、「オンプレミスデータベースのセキュリティ設定に DTS サーバーの CIDR ブロックを追加する」をご参照ください。
データベースアカウントにリモートログイン権限があることを確認します。
問題を修正した後、タスクを再起動します。
バリアント:テーブルが存在しない
例:
DTS-70004: execute statement failed: ...
error detail message: Table 'xxx.yyy' doesn't exist
MySQLSyntaxErrorException: Table 'xxx.yyy' doesn't exist原因:ターゲットテーブルが存在しません。削除されたか、スキーマ移行中に作成されなかったかのいずれかです。
修正:
テーブルがターゲットデータベースから削除されたかどうかを確認します。
スキーマ移行が正常に実行され、テーブルが作成されたかどうかを確認します。
問題を修正した後、タスクを再起動します。
バリアント:列を NULL にできない
例:
error detail message: Column 'aaa' cannot be null
MySQLIntegrityConstraintViolationException: Column 'aaa' cannot be null原因:データベースの整合性制約に違反しています。たとえば、NOT NULL の列に NULL 値が挿入されています。
修正:
ソーステーブルとターゲットテーブルのスキーマを比較し、一貫性を保ちます。
違反の原因となったデータレコードを修正します。
タスクを再起動します。
バリアント:INSERT 権限が拒否された
例:
error detail message: INSERT command denied to user 'user'@'100.104.175.31' for table 'yyy'
MySQLSyntaxErrorException: INSERT command denied to user 'user'@'100.104.175.31' for table 'yyy'原因:ターゲットデータベースアカウントに、ターゲットテーブルに対する INSERT 権限がありません。
修正:エラーメッセージに記載されている権限をターゲットデータベースアカウントに付与し、タスクを再起動します。
DTS-70002 — データベースまたはテーブルが見つからない
例:
DTS-70002: get table detail info failed after 151 times (user: db_name, database: table_name)
MySQLSyntaxErrorException: Table 'db_name.table_name' doesn't exist原因:スキーマ移行が正常に完了しなかったため、ターゲットデータベースにテーブルが作成されませんでした。
修正:エラーメッセージで指定されたデータベースとテーブルがターゲットに存在しないことを確認します。見つからない場合は、次の手順を実行します:
同期タスクの場合:選択したオブジェクトからテーブルを削除し、再度追加します。DTS はスキーマを再作成し、データを再同期します。
移行タスクの場合:新しいタスクを作成します。
DTS-60001 — ソースデータベースに接続できない
例:
DTS-60001: Create connection failed (url: ip_address:port, user: username)
cause: SQLException: Access denied for user 'username'@'ip_address' (using password: YES)原因:ソースデータベースのユーザー名またはパスワードが正しくありません。Access denied メッセージは、接続がデータベースに到達したものの、認証で拒否されたことを示しています。
修正:ユーザー名とパスワードを修正し、タスクを再起動します。
認証情報が正しいにもかかわらずエラーが続く場合は、以下を確認してください:
| 確認項目 | 操作 |
|---|---|
| データベースのステータス | ソースデータベースが実行中で、接続を受け入れていることを確認します |
| パスワードの変更 | アカウントのパスワードが最近変更されたかどうかを確認します |
| 許可リストの設定 | DTS サーバーの IP 範囲をデータベースの許可リストに追加します。詳細については、「オンプレミスデータベースのセキュリティ設定に DTS サーバーの CIDR ブロックを追加する |
| 接続数制限 | ソースデータベースが最大接続数に達しているかどうかを確認します |
DTS-61015 — ソースデータベースの接続数制限に到達
例:
DTS-61015: Create connection failed (url: ip_address:port, user: username)
cause: MySQLNonTransientConnectionException: Data source rejected establishment of connection,
message from server: "Too many connections"原因:ソースデータベースが最大接続数に達しました。サーバーは、DTS からのものを含むすべての新しい接続試行を拒否しています。
修正:ソースデータベースの接続数制限を増やし、タスクを再起動します。
接続数が問題でない場合は、以下も確認してください:
| 確認 | 操作 |
|---|---|
| データベースのステータス | ソースデータベースが実行中であることを確認します |
| パスワードの変更 | アカウントのパスワードが最近変更されたかどうかを確認します |
| 許可リストの設定 | DTS サーバーの IP 範囲を追加します。詳細については、「オンプレミスデータベースのセキュリティ設定に DTS サーバーの CIDR ブロックを追加する |
DTS-71016 — ターゲットデータベースに接続できない
このエラーには、ターゲットデータベースから返されるエラーメッセージに基づいて 2 つの一般的なバリアントがあります。
例 1:
DTS-71016: connect target failed (url: jdbc:mysql://ip_address:port?parameters)
cause: MySQLNonTransientConnectionException: Data source rejected establishment of connection,
message from server: "Too many connections"原因:ターゲットデータベースが最大接続数に達し、すべての新しい接続試行を拒否しています。
修正:ターゲットデータベースの接続数制限を増やし、タスクを再起動します。
例 2:
DTS-71016: connect target failed (url: jdbc:mysql://ip_address:port?parameters)
cause: SQLException: null, message from server:
"Host 'ip_address' is blocked because of many connection errors;
unblock with 'mysqladmin flush-hosts'"原因:同じ IP アドレスからの連続した接続失敗が多すぎたため、MySQL がそのホストを自動的にブロックしました。これは、失敗した試行回数が MAX_CONNECTION_ERRORS のしきい値を超えたときにトリガーされる MySQL の自己保護メカニズムです。
修正:ターゲットデータベースのエラーを修正します。たとえば、MAX_CONNECTION_ERRORS パラメーターの値を増やします。その後、タスクを再起動します。
DTS-10015 — Redis に接続できない
例:
DTS-10015: unreachable redis network.
JedisConnectionException: Could not get a resource from the pool
JedisConnectionException: Failed connecting to ip_address:port
ConnectException: Connection timed out (Connection timed out)原因:Redis サーバーで例外が発生し、到達不能になりました。
修正:Redis サーバーのステータスを確認し、実行中でアクセス可能であることを確認してから、タスクをリトライします。
DTS-30005 — メタデータの保存の失敗
例:
DTS-30005: save changed job progress info failed
cause: SQLException: result content unexpected. expect 3 time 1, actually [2, 1, 1]原因:ソースデータベースに、大文字と小文字の区別のみが異なる名前のテーブルが 2 つ含まれています (例:TABLE と table)。DTS はこれらを競合する識別子として扱い、メタデータを保存できません。
修正:ソースデータベースのテーブル名を確認します。競合するテーブルのいずれかの名前を変更し、タスクを再起動します。
DTS-30011 — データ書き込みの失敗
DTS-30011 は、いくつかの書き込み失敗シナリオをカバーしています。エラーメッセージを適切なバリアントと照合してください。
バリアント:テーブルが満杯
例:
DTS-30011: put 2048 records error, ...
cause: BatchUpdateException: The table 'yyy' is full
SQLException: The table 'yyy' is full原因 1:ディスクが満杯です。
修正:ディスクのサイズを変更して容量を追加し、タスクを再起動します。
原因 2:テーブルがデータベースレベルのサイズ制限に達しました。
修正:データベースレベルでテーブルサイズの制限を増やし、タスクを再起動します。MySQL については、「B.3.2.10 The table is full」をご参照ください。
バリアント:ロック待機タイムアウト
例:
DTS-30011: put 2048 records error, ...
cause: BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction原因:ターゲットデータベースでロック待機タイムアウトが発生しました。別のセッションが影響を受ける行のロックを保持しており、タイムアウト期間内に解放していません。
修正:ターゲットの MySQL データベースで以下の文を実行して、ブロッキングロックを特定し、解決します:
SHOW FULL PROCESSLIST;
SELECT * FROM innodb_trx;ロックの競合を解決した後、タスクを再起動します。
バリアント:ターゲットデータベースが読み取り専用
例:
DTS-30011: put 2048 records error, ...
cause: SQLException: The MySQL server is running with the --read-only option
so it cannot execute this statement原因:ターゲットデータベースが読み取り専用モードになっています。DTS は読み取り専用インスタンスにデータを書き込むことができません。
修正:
読み取り専用の状態を確認します:
SELECT @@read_only;結果が
1の場合は、読み取り専用モードを無効にします:SET GLOBAL read_only=0;タスクを再起動します。
DTS-1051009 — バイナリログ解析の失敗
例:
java.IOEException: java.lang.IllegalArgumentException:
Valid type fail, Column: column_name, Type: type_number原因:MySQL バイナリログに保存されているテーブルスキーマが、DTS に保存されているスキーマと一致しません。これは、テーブルスキーマを変更する DDL 文がバイナリログに書き込まれない場合に発生します。たとえば、列の型を変更する (例:INT(11) から BIGINT(20) へ) 前に SET SESSION sql_log_bin=0 が使用された場合などです。DDL の変更がログに記録されないため、DTS はそれを解析できず、内部スキーマがソースと同期しなくなります。
修正:Alibaba Cloud テクニカルサポートに連絡して、DTS に保存されているスキーマメタデータを再読み込みしてください。