すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB RDS for MySQL の読み取り専用インスタンスにおける同期の遅延の原因と解決策

最終更新日:Aug 21, 2026

読み取り専用 RDS インスタンスは、MySQL ネイティブのログベースの非同期レプリケーションまたは準同期レプリケーションを使用して、プライマリインスタンスとの同期を維持します。このメカニズムは遅延を引き起こす可能性があり、一時的なデータ不整合や、バイナリログの蓄積による読み取り専用インスタンスのストレージ容量の枯渇につながることがあります。

プライマリ RDS インスタンスで大量のログが生成されている場合、その読み取り専用 RDS インスタンスがロックされることがあります。

このドキュメントを参考に、レプリケーション遅延メトリクスを解釈し、根本原因を特定して問題を解決してください。

レプリケーション遅延の測定方法

SHOW SLAVE STATUS \G の出力にある Seconds_Behind_Master フィールドは、レプリケーションの遅延を秒単位で報告します。

遅延の計算式: 遅延 = 現在時刻 - (読み取り専用インスタンスで適用中のトランザクションがプライマリ RDS インスタンスでコミットされた時刻)

読み取り専用インスタンスで次のステートメントを実行して、現在のレプリケーションステータスを確認します。

SHOW SLAVE STATUS \G

確認すべき主要なフィールド:

フィールド 確認事項
Slave_IO_Running Yes である必要があります。No はレプリケーションが破損していることを示します。
Slave_SQL_Running Yes である必要があります。No はレプリケーションが破損していることを示します。
Seconds_Behind_Master レプリケーションの遅延 (秒単位)。0 は読み取り専用インスタンスが追いついたことを意味します。NULL はレプリケーションがアクティブでないことを意味します。
Exec_Master_Log_Pos この値が変化しないまま Seconds_Behind_Master が上昇し続ける場合、SQL スレッドが大規模なトランザクションまたはデータ定義言語 (DDL) 操作でスタックしています。
Last_IO_Error / Last_SQL_Error I/O スレッドまたは SQL スレッドのエラーメッセージ (もしあれば)。

遅延が 1 秒以下の場合:無視すべきケース

報告される遅延が 1 秒以下の場合、通常は実際の問題を示しているわけではありません。その理由として、以下の 2 つの一般的な原因が挙げられます。

モニタリングの粒度。モニタリングの時間範囲が 6 分を超えて設定されている場合、デフォルトのモニタリング粒度は最大で 30 秒になることがあります。表示される値はその間隔の平均値であり、瞬間的な測定値ではありません。1 秒粒度の測定値を取得するには、ApsaraDB RDS コンソールの [パフォーマンス傾向] タブに移動し、モニタリングの時間範囲を 6 分未満に設定します。

秒をまたぐサンプリング。サンプリングポイントは常に最も近い秒に切り捨てられます。あるトランザクションが 1 秒以内に開始し、次の秒で完了した場合、実際の遅延が 1 秒未満であっても、遅延計算では 1 秒と報告されます。以下の表は、この動作を示しています。

トランザクション プライマリでのコミット時刻 読み取り専用でのコミット時刻 現在時刻 報告される遅延
Trx1 00:00:00.30 00:00:00.50 00:00:00.35 0 (0.35) - 0 (0.30) = 0 秒
00:00:00.45 0 (0.45) - 0 (0.30) = 0 秒
Trx2 00:00:00.90 00:00:01.10 00:00:00.95 0 (0.95) - 0 (0.90) = 0 秒
00:00:01.05 1 (1.05) - 0 (0.90) = 1 秒

誤検知を避けるため、読み取り遅延のアラートしきい値は 1 秒より大きく設定してください。

遅延が 1 秒超の場合:原因の特定と修正

1 秒を超える持続的な遅延は調査が必要です。以下のセクションでは、最も一般的な 5 つの原因、それぞれの確認方法、および解決方法について説明します。

重要

インスタンス仕様の変更やデータ変更などの設定変更を行う前に、スナップショットを作成するか、ログバックアップを有効にしてデータを保護してください。Alibaba Cloud マネジメントコンソールで機密情報に関する権限を付与した場合、または機密情報を送信した場合は、できるだけ早くその機密情報を変更することを推奨します。機密情報には、ユーザー名とパスワードが含まれます。

原因 1:読み取り専用インスタンスの仕様不足

現象: レプリケーションは、I/O スレッド (プライマリからバイナリログを取得) と SQL スレッド (ローカルで適用) を使用します。両方のスレッドは、IOPS (1 秒あたりの I/O 処理) を含む I/O リソースをめぐって競合します。読み取り専用インスタンスが必要な IOPS を維持できない場合、遅延が発生します。

確認方法: ApsaraDB RDS コンソールで、読み取り専用インスタンスの [モニタリングとアラート] に移動します。CPU 使用率、メモリ使用量、I/O 帯域幅、または IOPS が常に上限に達していないか確認します。[基本情報] ページの [設定情報] セクションでインスタンスタイプを確認することもできます。詳細については、「読み取り専用 ApsaraDB RDS for MySQL インスタンスのインスタンスタイプ (x86)」および「読み取り専用 ApsaraDB RDS for MySQL インスタンスのインスタンスタイプ (ARM)」をご参照ください。

解決策: 読み取り専用インスタンスを、プライマリインスタンスと同等かそれ以上の仕様にアップグレードしてください。詳細については、「ApsaraDB RDS for MySQL インスタンスの仕様変更」をご参照ください。

原因 2:プライマリインスタンスにおける高い秒間トランザクション数 (TPS)

現象: 単一の SQL スレッドが、レプリケートされたすべてのトランザクションを読み取り専用インスタンス上で直列に適用します。プライマリインスタンスが大量の同時書き込みを処理する場合、読み取り専用インスタンスは追いつけなくなります。

確認方法: プライマリインスタンスまたは読み取り専用インスタンスの [ダッシュボード] ページに移動し、TPS メトリクスを確認します。詳細については、「ApsaraDB RDS for MySQL インスタンスのダッシュボード機能の使用」をご参照ください。

解決策: プライマリインスタンスで大規模なトランザクションを最適化または分割して、トランザクションあたりの書き込み量を減らし、各トランザクションが SQL スレッドを保持する時間を短縮してください。

原因 3:プライマリインスタンスでの大規模トランザクション

現象: 大量のデータに対する UPDATEDELETEINSERT...SELECTREPLACE...SELECT などの操作は、大きなバイナリログエントリを生成します。読み取り専用インスタンスは、プライマリがトランザクションを実行したのと同じ時間をかけて適用する必要があります。たとえば、プライマリで 80 秒かかった削除は、レプリケーションにも 80 秒かかります。

さらに、複数のテーブルに対する同時トランザクションはサポートされていますが、特定のテーブルのトランザクションをレプリケートするスレッドは一度に 1 つだけであるため、遅延が悪化する可能性があります。

確認方法: 読み取り専用インスタンスで SHOW SLAVE STATUS \G を実行し、Seconds_Behind_Master が増加し続ける一方で Exec_Master_Log_Pos が変化しないことを確認します。次に SHOW PROCESSLIST を実行して、特定の SQL スレッドを特定します。バイナリログが ROW 形式に設定されている場合、いずれかのバイナリログファイルが max_binlog_size のしきい値を超えているか確認します。

SHOW BINARY LOGS;

File_sizemax_binlog_size を超えている場合、大規模なトランザクションが原因である可能性が高いです。

また、SHOW SLAVE STATUS \G の出力でロック待機状態を調べて、メタデータロック (MDL) の競合を確認します。

解決策: 大規模なトランザクションをより小さなバッチに分割します。たとえば、DELETE ステートメントに WHERE 句で行制限を追加して、各バッチが管理可能な数の行を処理するようにし、読み取り専用インスタンスが追いつけるようにします。

原因 4:プライマリインスタンスでの長時間実行 DDL

現象: レプリケーションは、DDL ステートメントを直列に適用します。大きなテーブルに対する CREATE INDEXALTER TABLE ADD COLUMNREPAIR TABLE などの DDL 操作は、完了するまですべての後続レプリケーションをブロックする可能性があります。多数の一時テーブルを生成するスロークエリは、ディスク I/O を消費することで問題を悪化させます。

これとは別に、読み取り専用インスタンスで進行中のクエリや開いているトランザクションは、プライマリから到着する DDL ステートメントをブロックする MDL 競合を引き起こす可能性があります。

確認方法:

  • バイナリログファイルが切り捨てられずに蓄積されていないか確認します。これは DDL のバックログを示します。

  • 読み取り専用インスタンスで次のステートメントを実行して、ロックの競合を確認します。

    SHOW ENGINE INNODB STATUS \G
  • 次のステートメントを実行して、現在使用中のテーブルを特定します。

    SHOW OPEN TABLES;

    in_use = 1 のテーブルはロックされており、レプリケーションをブロックしている可能性があります。

  • OPTIMIZEALTERREPAIRCREATE などの DDL 関連操作のスロークエリログを確認します。詳細については、「スロークエリログ分析」をご参照ください。

解決策:

プライマリからの DDL ステートメントが読み取り専用インスタンスのメタデータロックによってブロックされている場合:

  1. 読み取り専用インスタンスで SHOW PROCESSLIST; を実行して、メタデータロックを待機している SQL スレッドを見つけます。

  2. ロックを保持しているセッションを終了して、レプリケーションを再開します。詳細については、「Data Management Service (DMS) を使用してメタデータロックを解放する」をご参照ください。

原因 5:プライマリキーがなく一意のインデックスのみを持つテーブル

現象: テーブルにプライマリキーがなく、NULL 値を含む一意のインデックスのみが存在する場合、レプリケーションの SQL スレッドは、オプティマイザが推奨する実行計画の代わりに、一意のインデックスの実行計画を使用します。これは、WHERE 句によってより効率的な検索が可能であったとしても発生します。これにより、レプリケーション中にフルテーブルスキャンが強制され、論理読み取りが大幅に増加し、SQL スレッドが低速化します。

確認方法: プライマリインスタンスで次のクエリを実行して、プライマリキーのないテーブルを特定します。

SELECT tab.table_schema AS database_name, tab.table_name
FROM information_schema.tables tab
LEFT JOIN information_schema.table_constraints tco
  ON tab.table_schema = tco.table_schema
  AND tab.table_name = tco.table_name
  AND tco.constraint_type = 'PRIMARY KEY'
WHERE tco.constraint_type IS NULL
  AND tab.table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
  AND tab.table_type = 'BASE TABLE'
ORDER BY tab.table_schema, tab.table_name;

クエリによって返されたテーブルについて、sys.schema_index_statistics ビューを使用して、一意のインデックスに NULL 値が含まれているかどうかを確認します。

解決策: プライマリキーのないテーブルに明示的なプライマリキーを追加してください。

よくある質問

なぜ一部の読み取り専用インスタンスでは 1 秒の遅延が表示され、他のインスタンスでは表示されないのですか?

各読み取り専用インスタンスは、わずかに異なるタイミングで収集プロシージャを開始します。サンプリングポイントが秒の境界をまたぐと 1 秒の遅延が報告されますが、またがない場合は 0 秒と報告されます。これは測定上のアーティファクトであり、レプリケーションパフォーマンスの実際の差ではありません。詳細については、「遅延が 1 秒以下の場合:無視すべきケース」をご参照ください。

1 秒の遅延は、インスタンスに影響が出ていることを意味しますか?

いいえ。報告された 1 秒の遅延は、実際の遅延が発生したことを意味するものではありません。この値は、真の同期の遅延ではなく、計算上の丸めを反映しています。これらの誤検知を除外するために、プロキシまたはアラートの読み取り遅延しきい値を 1 秒より大きく設定してください。

「ReplicationInterrupted」エラーが表示された場合、または「Slave_SQL_Running」や「Slave_IO_Running」のアラートがトリガーされた場合はどうすればよいですか?

次の項目を順番に確認してください。

  1. ストレージ容量。読み取り専用インスタンスのストレージが不足すると、受信したバイナリログを書き込めなくなります。[基本情報] ページの [使用統計] セクションでストレージ使用量を確認してください。

  2. レプリケーションの遅延。5 分間のウィンドウ内で遅延が継続的に 5 秒を超えると、アラートがトリガーされます。プライマリインスタンスでの高い書き込み量や大規模なトランザクションが最も可能性の高い原因です。現在の遅延を表示するには、[モニタリングとアラート] > [標準モニタリング] に移動し、[セカンダリインスタンスのレプリケーション遅延 (秒)] メトリクスを確認してください。

  3. スロークエリログ。読み取り専用インスタンスでのスロークエリは、SQL スレッドのパフォーマンスを低下させ、レプリケーションの遅延を増幅させる可能性があります。[ログ] > [スロークエリログ] でログを確認するか、[自律サービス] > [スロークエリログ] に移動してください。

上記のいずれにも該当しない場合、システムが自動的にレプリケーションの中断を検出し、解決します。