RDS インスタンスが [ロック中] 状態になると、INSERT および UPDATE ステートメントは失敗します。原因を特定し、インスタンスのロックを解除して、再発を防止します。
ロック動作の理解
[ロック] 状態の影響は、データベースエンジンバージョンとマイナーエンジンバージョンによって異なります。
MySQL 5.6、5.7、8.0 (マイナーエンジンバージョン 20190815 以降)
ApsaraDB RDS は、ロックの原因に基づいて操作を制限するために、3 つのロックタイプを使用します。
| ロックタイプ | ブロック対象 | トリガー条件 |
|---|---|---|
LOCK_WRITE_GROWTH |
ディスク使用量を増加させる操作 (INSERT, UPDATE)。読み取りクエリは引き続き機能します。DELETE はディスク使用量を増加させるバイナリログを生成するため、領域を解放するには DELETE の代わりに DROP または TRUNCATE を使用してください。 | プライマリインスタンスのストレージが満杯です。 |
LOCK_READ |
すべての読み取りおよび書き込み操作。 | 読み取り専用インスタンスのストレージが満杯です。 |
LOCK_WRITE |
LOCK_WRITE_GROWTHDROP および TRUNCATE を含むすべての書き込み操作 ( の制限のスーパーセット)。 |
インスタンスの有効期限切れ、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
ロックの原因に関係なく、すべての操作がブロックされます。
原因の診断
[基本情報] ページで、[使用状況の統計] セクションを確認します。考えられる原因は次の 2 つです。
-
原因 1:ストレージ容量の枯渇。
-
原因 2:Alibaba Cloud アカウントの料金滞納、または RDS インスタンスの有効期限切れ。
原因 1:ストレージ容量枯渇の解決
ストレージ容量を拡張するか、ストレージを解放することができます。ストレージの拡張はより速く、データの削除を回避できます。
オプション 1: ストレージ容量の拡張 (推奨)
-
インスタンス ページに移動します。上部メニューで、インスタンスが存在するリージョンを選択し、インスタンス ID をクリックします。
-
[基本情報] ページで、[構成情報] セクションに移動し、[仕様変更] をクリックしてストレージ容量を拡張します。
-
支払いを完了します。[基本情報] ページの右上隅にある
アイコンをクリックして、[タスク] ページで進捗を監視します。
所要時間はストレージタイプによって異なります。
| ストレージタイプ | 所要時間 | 注意 |
|---|---|---|
| プレミアムローカル SSD | 状況による | インスタンス間のデータ移行が発生する場合があります。約 30 秒の一時的な接続断が想定されます。オフピーク時間帯に拡張し、アプリケーションが自動的に再接続することを確認してください。 |
| クラウドディスク | 約 5 分 | MySQL と PostgreSQL:一時的な接続断はありません。SQL Server:約 30 秒の一時的な接続断が発生する場合があります。オフピーク時間帯に拡張するか、アプリケーションが自動的に再接続することを確認してください。特定の RDS インスタンスは、データ損失なしでストレージ容量の拡張をサポートします。これにより、ワークロードが中断されることはありません。 |
ApsaraDB RDS コンソールにログインし、左側メニューで [タスクセンター] をクリックして進捗を確認することもできます。
オプション 2: ストレージの解放
データを削除する前に、必ずバックアップを作成してください。可能であれば、データ損失を避けるために、代わりにストレージを拡張してください。
-
インスタンス ページに移動します。リージョンを選択し、インスタンス ID をクリックします。
-
左側メニューで [モニタリングとアラート] をクリックし、データタイプ別のストレージ使用量を確認します。

-
最も多くの領域を消費しているストレージカテゴリに基づいてデータを削除します。
一時ファイル (temp_file_size メトリック)
ApsaraDB RDS for MySQL は、ソート、グループ化、または結合操作のための一時テーブルと、大規模なトランザクションをコミットする前のバイナリログキャッシュファイルを生成します。これらの一時ファイルは、ディスク領域を使い果たす可能性があります。
解決手順については、「一時ファイルによってストレージ容量が使い果たされ、ApsaraDB RDS for MySQL インスタンスがロック状態になった場合の対処方法」をご参照ください。
ログファイル (binlog_size および general_log_size メトリック)
| データベースエンジン | 解決策 |
|---|---|
| MySQL | [モニタリングとアラート] ページでストレージ使用量を確認し、ログファイルを削除します。詳細については、「バイナリログファイルによって 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 Explorer と監査の有効化:SQL Explorer と監査機能を有効にして、ストレージの急増を引き起こす SQL ステートメントを特定し、最適化してください。
ストレージの自動拡張の有効化:ストレージが不足したときにシステムが容量を拡張するように、ストレージの自動拡張を設定してください。詳細については、MySQL、PostgreSQL、および SQL Server のガイドをご参照ください。
SQL ステートメントの最適化:大規模なデータセットを処理するクエリで ORDER BY および GROUP BY 句を頻繁に使用すると、大規模な一時ファイルが生成されるため、使用を避けてください。
よくある質問
大量のデータを削除した後も LOCK_WRITE_GROWTH がアクティブなのはなぜですか?
DELETE を実行すると、レコードは再利用可能としてマークされますが、基盤となるディスクファイルは縮小されず、テーブルスペースも解放されません。テーブルスペースを解放するには、OPTIMIZE TABLE ステートメントを使用してください。詳細については、「OPTIMIZE TABLE ステートメントを使用して ApsaraDB RDS for MySQL インスタンスのテーブルスペースを解放する方法」をご参照ください。
ストレージが十分にあるか、インスタンスが更新されているにもかかわらず、インスタンスがまだロックされているのはなぜですか?
構成変更などのタスクがまだ進行中です。タスクが完了すると、インスタンスは自動的にロック解除されます。[基本情報] ページの右上隅にある
アイコンをクリックして、[タスク] ページでタスクの進捗を確認してください。
インスタンスが「ロック中」状態のときに、インスタンスの仕様を変更できますか?
ストレージの枯渇が原因でインスタンスがロックされている場合は、仕様をアップグレードまたはダウングレードできます。料金滞納など他の理由でロックされている場合は、まず支払い問題を解決してください。
インスタンスが廃止されたインスタンスタイプを使用しています。ストレージを拡張してロックを解除するにはどうすればよいですか?
まずインスタンスタイプを現在利用可能なインスタンスタイプに変更してから、ストレージを拡張してください。利用可能なインスタンスタイプについては、「プライマリ ApsaraDB RDS インスタンスタイプ」をご参照ください。
インスタンスがロックされているにもかかわらず、ストレージ使用量が増え続けるのはなぜですか?
INSERT と UPDATE はブロックされますが、読み取りクエリはログファイルや一時データを生成する可能性があり、ストレージ使用量が増加する原因となります。