RDS インスタンスが [ロック中] 状態になると、INSERT および UPDATE ステートメントは失敗します。このトピックでは、原因、それぞれの解決策、および再発防止策について説明します。
ロック動作の理解
[ロック中] 状態は、お使いのデータベースエンジンバージョンとマイナーエンジンバージョンによって影響が異なります。
MySQL 5.6、5.7、および 8.0 (マイナーエンジンバージョン 20190815 以降)
ApsaraDB RDS は、ロックの原因に基づき、3 つのロックタイプを使用して操作を制限します。
| ロックタイプ | ブロック対象 | トリガー条件 |
|---|---|---|
LOCK_WRITE_GROWTH |
ディスク使用量を増加させる操作 (INSERT、UPDATE)。読み取りクエリは引き続き機能します。領域を解放するには、DELETE の代わりに DROP または TRUNCATE を使用します。これは、DELETE がディスク使用量を増加させるバイナリログを生成するためです。 | プライマリインスタンスのストレージ枯渇。 |
LOCK_READ |
すべての読み取りおよび書き込み操作。 | 読み取り専用インスタンスのストレージ枯渇。 |
LOCK_WRITE |
DROP と TRUNCATE を含むすべての書き込み操作 (LOCK_WRITE_GROWTH の制限のスーパーセット)。 |
インスタンスの有効期限切れ、ApsaraDB MyBase クラスターでのホストの有効期限切れ、またはインスタンスの移行。 |
LOCK_WRITE_GROWTH がアクティブな場合、SQL 文は次のエラーを返します:
ERROR 1290 (HY000): The MySQL server is running with the LOCK_WRITE_GROWTH option so it cannot execute this statement
MySQL 5.1、5.5、およびマイナーエンジンバージョンが 20190815 より前の MySQL 5.6/5.7/8.0
ロックの原因に関係なく、すべての操作がブロックされます。
原因の診断
RDS インスタンスの [基本情報] ページで、[使用統計] セクションを確認します。考えられる 2 つの原因は次のとおりです。
-
原因 1:ストレージ容量が枯渇している。
-
原因 2:Alibaba Cloud アカウントに料金滞納があるか、RDS インスタンスの有効期限が切れている。
原因 1 の解決策:ストレージ容量の枯渇
ストレージ容量を拡張するか、領域を解放するかの 2 つのオプションがあります。ストレージの拡張はより速く、データ削除を必要としません。
オプション 1:ストレージ容量の拡張 (推奨)
-
インスタンスページに移動します。上部メニューで、インスタンスのあるリージョンを選択し、インスタンス ID をクリックします。
-
[基本情報] ページで、[設定情報] セクションの [仕様変更] をクリックして ストレージ容量を拡張します。
-
支払いを完了します。[基本情報] ページの右上隅にある
アイコンをクリックすると、[タスク] ページで進捗状況を確認できます。
必要な時間はストレージタイプによって異なります。
| ストレージタイプ | 期間 | 注意事項 |
|---|---|---|
| プレミアムローカル SSD | 状況による | インスタンス間のデータ移行が発生する場合があります。約 30 秒の一時的な接続断が予想されます。オフピーク時に拡張し、アプリケーションが自動的に再接続することを確認してください。 |
| クラウドディスク | 約 5 分 | MySQL と PostgreSQL:一時的な接続断はありません。SQL Server:約 30 秒の一時的な接続断が発生する場合があります。オフピーク時に拡張するか、アプリケーションが自動的に再接続するようにしてください。特定の RDS インスタンスは、データ損失なしでストレージ容量の拡張に対応しています。これにより、ワークロードが中断されることはありません。 |
拡張後、インスタンス ID と接続文字列は変更されません。ただし、プレミアムローカル SSD の拡張によってインスタンス間のデータ移行がトリガーされた場合など、IP アドレスが変更されることがあります。IP アドレスの代わりに接続文字列 (ドメイン名) を使用してインスタンスに接続してください。
ApsaraDB RDS コンソールにログインし、左側のナビゲーションペインで[タスクセンター]をクリックして進捗状況を確認することもできます。
オプション 2:ストレージの解放
データを削除する前に、必ずバックアップを作成してください。可能な場合は、データ損失を避けるために、代わりにストレージを拡張してください。
-
インスタンスページに移動します。リージョンを選択し、インスタンス ID をクリックします。
-
左側のナビゲーションペインで、[モニタリングとアラート] をクリックして、データタイプ別のストレージ使用量を表示します。

-
最も多くの領域を消費しているストレージカテゴリに基づいてデータを削除します。
一時ファイル (temp_file_size メトリック)
ApsaraDB RDS for MySQL は、ソート、グループ化、または結合操作のための一時テーブルと、大規模なトランザクションをコミットする前のバイナリログキャッシュファイルを生成します。これらの一時ファイルは、ディスク領域を使い果たす可能性があります。
解決手順については、「一時ファイルによってストレージ容量が枯渇したために ApsaraDB RDS for MySQL インスタンスがロック中になった場合の対処法」をご参照ください。
ログファイル (binlog_size および general_log_size メトリック)
| データベースエンジン | 解決策 |
|---|---|
| MySQL | [Monitoring and Alerts] ページでストレージ使用状況を表示し、ログファイルを削除します。「バイナリログファイルによって ApsaraDB RDS for MySQL インスタンスのストレージ容量が枯渇した場合の対処法」および「ApsaraDB RDS for MySQL の一般クエリログ機能に関する FAQ」をご参照ください。 |
| PostgreSQL | ログファイルは手動では削除できません。非アクティブなレプリケーションスロットを削除すると、AliPG が WAL ログを自動的に削除できるようになります。「ApsaraDB RDS for PostgreSQL インスタンスの WAL ログ管理機能の使用」をご参照ください。 |
| SQL Server | ログファイルは手動では削除できません。代わりに、ApsaraDB RDS コンソールでトランザクションログを圧縮します。 |
データファイル (user_data_size メトリック)
MySQL:
-
次のステートメントを実行して、最大のテーブルを見つけます:
SELECT TABLE_NAME, concat(round((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024,2),'MB') AS DATA FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<データベース名>' ORDER BY DATA + 0 DESC; -
不要なテーブルを削除します:
DROP TABLE <テーブル名>; -
システムがインスタンスのロックを解除するまで約 5 分間待ちます。
PostgreSQL:
-
DMS を使用して RDS インスタンスに接続します。「DMS を使用して ApsaraDB RDS インスタンスにログインする」をご参照ください。
接続できない場合は、まずストレージ容量を拡張し、ディスク領域を解放してから、必要に応じてストレージ容量を減らすことができます。「インスタンス仕様の変更」をご参照ください。
-
次のステートメントを実行して、最大のテーブルを見つけます:
SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') AS size FROM information_schema.tables ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC; -
不要なテーブルを削除します:
DROP TABLE <テーブル名>; -
システムがインスタンスのロックを解除するまで約 5 分間待ちます。
SQL Server:
「ApsaraDB RDS for SQL Server インスタンスのストレージ不足問題のトラブルシューティング」の手順に従ってください。
システムファイル (undolog_size メトリック)
InnoDB テーブルでの長時間実行クエリと大規模な同時データ変更が組み合わさると、システムが過剰な undo ログを生成し、ストレージ容量を使い果たす可能性があります。
解決手順については、「システムファイルの蓄積によるストレージ不足のトラブルシューティング」をご参照ください。
原因 2 の解決策:料金滞納またはインスタンスの有効期限切れ
将来のロックの防止
予期しないロックを回避するために、以下を設定してください。
支払いと有効期限の通知設定:
-
ApsaraDB RDS コンソールにログインします。
-
右上隅の
アイコンをクリックして、[メッセージセンター] を開きます。 -
左側のナビゲーションペインで、[共通設定] をクリックします。
-
[通知タイプ] 列で [製品の支払い延滞、利用停止、リリース間近の通知] を選択し、[変更] をクリックします。
-
アラート連絡先を選択し、[保存] をクリックします。
ストレージ使用状況アラートの設定:ストレージ使用状況のアラートルールを設定し、ストレージ使用率が 90% を超えたときにアラートがトリガーされるようにします。
SQL エクスプローラーと監査の有効化: SQL エクスプローラーと監査機能を有効にする。 ストレージ使用量が急増した場合、[監視とアラート] ページで急増中に実行された SQL ステートメントをクエリして最適化します。
ストレージの自動拡張の有効化:ストレージの自動拡張を設定して、ストレージが少なくなったときにシステムが容量を拡張するようにします。MySQL、PostgreSQL、および SQL Server のガイドをご参照ください。
SQL 文の最適化:大規模なデータセットを処理するクエリでは、ORDER BY 句や GROUP BY 句を頻繁に使用しないでください。これらは大規模な一時ファイルを生成するためです。
よくある質問
大量のデータを削除した後も LOCK_WRITE_GROWTH がアクティブなのはなぜですか。
DELETE を実行すると、レコードは再利用可能としてマークされますが、基になるディスクファイルが縮小されたり、テーブルスペースが再利用されたりすることはありません。テーブルスペースを解放するには、OPTIMIZE TABLE ステートメントを使用してください。「OPTIMIZE TABLE ステートメントを使用して ApsaraDB RDS for MySQL インスタンスのテーブルスペースを解放する方法」をご参照ください。
ストレージが十分であるか、インスタンスが更新されているにもかかわらず、インスタンスがまだロックされているのはなぜですか。
設定変更などのタスクがまだ進行中です。タスクが完了すると、インスタンスは自動的にロック解除されます。[基本情報] ページの右上隅にある
アイコンをクリックすると、[タスク] ページでタスクの進行状況を確認できます。
ディスク使用率がすでに 100% を下回っているにもかかわらず、インスタンスがまだロックされており、タスクが進行中でない場合、これは想定内の動作です。ロック解除は瞬時に行われるわけではありません。定期的な検出サイクルでディスク使用率をチェックし、使用率が 100% 未満であることが確認されるとロック解除タスクがディスパッチされ、そのタスクが実行されるという 3 つの段階を経ます。通常、インスタンスはディスク使用率が 100% を下回ってから 10 分以内に自動的にロック解除されます。
ロック状態のインスタンスの仕様は変更できますか?
ストレージが枯渇したためにインスタンスがロックされている場合は、はい、仕様をアップグレードまたはダウングレードできます。料金滞納など他の理由でロックされている場合は、まず支払い問題を解決してください。
使用しているインスタンスが廃止されたインスタンスタイプの場合、ストレージを拡張してロックを解除するにはどうすればよいですか。
まずインスタンスタイプを利用可能なインスタンスタイプに変更してから、ストレージを拡張してください。利用可能なインスタンスタイプについては、「プライマリ ApsaraDB RDS インスタンスタイプ」をご参照ください。
インスタンスがロックされているにもかかわらず、ストレージ使用量が増え続けるのはなぜですか。
INSERT と UPDATE はブロックされますが、読み取りクエリは引き続きログファイルや一時データを生成する可能性があります。これにより、ストレージ使用量が増加します。