PolarDB for MySQL クラスタの各仕様には、最大ストレージ容量があります。 データ、ログ、一時ファイルの継続的な増加により、ストレージ容量が一杯になる可能性があります。 これにより、クラスタが読み取り専用モードでロックされ、ビジネス運用に影響を与える可能性があります。 ストレージリソースを効果的に管理し、クラスタの安定性を確保するために、このトピックではストレージ容量の構成について説明し、使用状況の表示、さまざまなファイルのクリーンアップ、容量の解放を行うための方法を提供します。
ストレージ容量の構成
PolarDB for MySQL ストレージ容量の構成を理解することは、効果的な管理に役立ちます。 これにより、問題を正確に特定し、適切な最適化対策を講じることができます。
データファイル:データテーブルやインデックスなど、ビジネスデータを保存します。
ログファイル:主にバイナリログ、REDO ログ、UNDO ログが含まれます。 これらのログファイルは、大規模なトランザクションまたは高並列書き込み操作を実行すると急速に増加します。
説明PolarDB for MySQL クラスタでは、バイナリロギングはデフォルトで無効になっています。 代わりに、より効率的な物理ログ(REDO ログ)が使用されます。 クラスタでバイナリロギングが有効になっていない場合は、この情報を無視できます。
一時ファイル:一時テーブルファイルは、ソート(ORDER BY)、グループ化(GROUP BY)、結合クエリなどの操作を実行すると生成されます。 また、コミットされていない大規模なトランザクションも一時的なバイナリログキャッシュファイルを生成します。
システムファイル:データディクショナリ、トランザクション情報、二重書き込みバッファーなど、データベース操作に必要なコアコンポーネントを保存します。 これらのファイルは、InnoDB エンジンの自己管理の基盤です。 データの整合性とクラスタの回復を確保するために不可欠です。 これらのファイルを直接操作することはできません。
ストレージ容量の使用状況を表示する
クラスタのストレージ容量の使用状況は、次の 2 つの方法で表示できます。
PolarDBコンソール に移動します。 ターゲットクラスタの 概要 ページで、[分散ストレージ] セクションのストレージ容量を表示します。

PolarDBコンソール に移動します。 ターゲットクラスタの ページで、スペースの分析 タブの特定の時点におけるストレージ容量の使用状況を表示します。

データファイルをクリーンアップし、表領域を解放する
データファイルが長時間整理されていない場合、PolarDB for MySQL クラスタは過剰なストレージ容量を消費する可能性があります。 また、DELETE コマンドを使用してデータを削除する場合、システムはレコードの場所またはデータページを再利用可能としてマークするだけです。 テーブルファイルのサイズを直接縮小することはありません。 これにより、大量の領域の断片化が発生し、ストレージ領域が占有されたままになります。
データファイルをクリーンアップすると、コンソールインターフェイスの更新に時間がかかる場合があります。 しばらくお待ちください。
ファイルをクリーンアップする
不要になったテーブルの場合は、TRUNCATE TABLE または DROP TABLE コマンドを使用して、占有されているすべての領域を迅速に解放します。
データの損失を防ぐために、この操作を実行する前にデータをバックアップしてください。
表領域を解放する
断片化が大きく、保持する必要があるテーブルの場合は、オフピーク時に OPTIMIZE TABLE コマンドを実行します。 この操作により、テーブルが再構築され、断片化が解消され、空き領域が解放されます。 また、DMS ツールを使用してこの最適化を実行することもできます。 DMS は速度制限をサポートしているため、ビジネスワークロードへの影響は少ないですが、実行速度は比較的遅くなります。
注意事項
ターゲットテーブルの断片化率が低い場合、
OPTIMIZE TABLEコマンドを実行しても、表領域のサイズはそれほど縮小されません。DATA_FREEビューのinformation_schema.tablesフィールドで、ターゲットテーブルの断片化率を確認できます。OPTIMIZE TABLEコマンドを実行すると、テーブルデータは新しい一時テーブルにコピーされます。 これにより、クラスタのストレージ容量の使用量が一時的に増加します。フルテキストインデックスが含まれていないテーブルの場合、
OPTIMIZE TABLE文はオンライン DDL メソッドを使用して実行され、同時読み取りと書き込みがサポートされます。大きなテーブルで
OPTIMIZE TABLE操作を実行すると、バースト I/O とバッファーの使用量が発生します。 これにより、テーブルのロックとリソースのプリエンプションが発生する可能性があります。 ピーク時のビジネス時間帯にこの操作を実行すると、クラスタが使用できなくなり、モニタリングの中断が発生する可能性があります。 この操作は、オフピーク時に実行してください。
メソッドの比較
ビジネスシナリオに基づいて解放方法を選択できます。
表領域を解放する方法 | 同時読み取りと書き込みをサポート | 実行速度 | 速度制限をサポート | シナリオ |
| はい | 高速 | いいえ | ビジネスワークロードが少なく、実行効率の要件が高いシナリオでは、 |
DMS を使用して表領域を解放する | はい | 低速 | はい | クラスタの負荷には敏感だが、実行効率には敏感でないシナリオでは、DMS ツールを使用してビジネスへの影響を少なくして表領域を解放できます。 これにより、領域解放操作がクラスタのパフォーマンスに与える影響が軽減されます。 |
手順
OPTIMIZE TABLE コマンドを使用して表領域を解放する
次のコマンドを使用して、表領域を解放できます。
OPTIMIZE TABLE [Database1].[Table1],[Database2].[Table2][Database1]と[Database2]はデータベース名です。[Table1]と[Table2]はテーブル名です。InnoDB エンジンで
OPTIMIZE TABLEコマンドを実行すると、「Table does not support optimize, doing recreate + analyze instead」というメッセージが表示されます。 これは通常の応答です。 このメッセージは無視できます。 コマンドがokを返すことを確認します。OPTIMIZE TABLE文の詳細については、「OPTIMIZE TABLE Statement」をご参照ください。
DMS を使用して表領域を解放する
データベースにログインする:PolarDBコンソール に移動します。 ターゲットクラスタの 概要 ページで、右上隅にある データベースにログイン をクリックして、Data Management(DMS)プラットフォームで PolarDB for MySQL クラスタにログインします。
表領域を解放する:左側のナビゲーションウィンドウで、ターゲットクラスタ ID を選択します。 ターゲットデータベースをダブルクリックします。 任意のテーブル名を右クリックし、[テーブルのバッチ操作] を選択します。 [テーブルのバッチ操作] ページで、領域を解放するテーブルを選択し、[テーブルメンテナンス] > [テーブルの最適化] をクリックします。
ログファイルをクリーンアップする
PolarDB for MySQL クラスタでは、大規模なトランザクションの処理により、バイナリログ、REDO ログ、または UNDO ログがすぐに生成される可能性があります。 これにより、大量のストレージ容量が占有されたり、いっぱいになったりする可能性があります。 この場合は、まずストレージ容量の拡張を検討してから、ログファイルが急速に生成される原因を調査してください。
バイナリログ、UNDO ファイル、または REDO ファイルをクリーンアップすると、コンソールインターフェイスの更新に時間がかかる場合があります。 しばらくお待ちください。
バイナリログ
PolarDB for MySQL クラスタでは、バイナリロギングはデフォルトで無効になっています。 代わりに、より効率的な物理ログ(REDO ログ)が使用されます。 クラスタでバイナリロギングが有効になっていない場合は、REDO ログと UNDO ログのクリーンアップ方法を参照してください。
保持ポリシー
バイナリログには、次の 2 つの保持ポリシーがあります。
バイナリロギングを有効にした後、ファイルはデフォルトで 3 日間保存されます。 3 日より古いファイルは自動的に削除されます。
説明2023 年 11 月 23 日より前に購入した PolarDB for MySQL クラスタの場合、バイナリログはデフォルトで 2 週間(14 日間)保存されます。
2024 年 1 月 17 日より前に購入した PolarDB for MySQL クラスタの場合、バイナリログはデフォルトで 1 週間(7 日間)保存されます。
バイナリロギングを無効にした後、既存のバイナリログは無期限に保持され、自動的には削除されません。
説明バイナリログを削除するには、バイナリロギングを有効にし、保持期間パラメーター(
loose_expire_logs_hoursまたはbinlog_expire_logs_seconds)を小さい値に設定し、保持期間が経過した後、ファイルが自動的に削除されるまで待ってから、バイナリロギングを無効にする必要があります。
保持期間を変更する
バイナリログの保持期間を変更しても、一時的な切断は発生せず、クラスタの再起動は不要です。
保持期間の変更により、多くのバイナリログ(例:10 TB)をパージする必要がある場合、パージ中にデータベースの書き込み例外が短時間発生する可能性があります。 そのため、バイナリログが大きい場合は、この操作をオフピーク時に実行してください。 保持期間を複数ステップで短縮して、毎回バイナリログデータの一部をパージします。
パージされたバイナリログは削除され、回復できません。
バイナリログの保持期間は、次の方法で変更できます。
MySQL 5.6:
loose_expire_logs_hoursパラメーターの値を変更することで、バイナリログの保持期間を設定できます。 値は時間単位です。 値の範囲は 0 ~ 2376 です。 デフォルト値は 72 です。 値 0 は、バイナリログが自動的に削除されないことを示します。MySQL 5.7 または MySQL 8.0:
binlog_expire_logs_secondsパラメーターの値を変更することで、バイナリログの保持期間を設定できます。 値は秒単位です。 値の範囲は 0 ~ 4294967295 です。 デフォルト値は 259200 です。 値 0 は、バイナリログが自動的に削除されないことを示します。
履歴ファイルをクリーンアップする
バイナリログの保持期間パラメーター(loose_expire_logs_hours または binlog_expire_logs_seconds)を変更した後、クラスタ内の履歴バイナリログはすぐにパージされません。 この場合、次の 3 つの方法のいずれかを使用して、履歴ファイルをクリーンアップできます。
自動クリーンアップを待つ:クラスタ内の最後のバイナリログが最大サイズ(
max_binlog_sizeパラメーター)に達すると、システムは新しいバイナリログに切り替わり、履歴バイナリログは自動的にパージされます。手動クリーンアップ:特権アカウントを使用して
flush binary logsコマンドを実行し、バイナリログの切り替えをすぐにトリガーして、期限切れのバイナリログをパージします。クラスタを再起動する:クラスタを再起動すると、システムは履歴バイナリログを自動的にパージします。
REDO ログ
PolarDB for MySQL クラスタは、バイナリログの代わりに REDO ログを使用して、プライマリノードと読み取り専用ノード間でデータ同期を実現します。 通常の状況では、ログバックアップが完了した後、手動で介入することなく自動的にクリーンアップされます。
ただし、REDO ファイルキャッシュプールがあるため、REDO ファイルは通常 2 GB ~ 11 GB のストレージ容量を占有し、最大 11 GB です。 これには、バッファープール内の 8 つの REDO ログ(8 GB)、書き込み中の REDO ログ(1 GB)、事前に作成された REDO ログ(1 GB)、最後の REDO ログ(1 GB)が含まれます。
保持期間を変更する
loose_innodb_polar_log_file_max_reuse パラメーターを変更することで、保持するキャッシュされた REDO ファイルの数を調整できます。 これにより、ログ領域の使用量が削減されますが、高負荷下ではパフォーマンスが定期的にわずかに変動する可能性があります。
REDO ログは手動で削除できません。 パラメーターを変更することで、保持するキャッシュされた REDO ファイルの数を調整することによってのみ、ログ領域の使用量を削減できます。
UNDO ログ
PolarDB for MySQL クラスタでは、UNDO ログはマルチバージョン同時実行制御(MVCC)の履歴バージョンとして機能します。 そのため、コミットされていないトランザクション(読み取り専用ノードまたは読み取り/書き込みノードのいずれか)が古い読み取りビューを保持している場合、UNDO ログのクリーンアッププロセスがブロックされ、領域が継続的に累積されます。
コミットされていないトランザクションを特定して終了する
データベースにログインする:PolarDBコンソール に移動します。 ターゲットクラスタの 概要 ページで、右上隅にある データベースにログイン をクリックして、DMS プラットフォームで PolarDB for MySQL クラスタにログインします。
コミットされていないトランザクションを見つける:次のコマンドを実行して、長時間実行されているコミットされていないトランザクションがあるかどうかを確認します。
SELECT * FROM INFORMATION_SCHEMA.innodb_trx;trx_started(トランザクションの開始時刻)が非常に古いトランザクション、またはtrx_state(トランザクションステータス)が長時間RUNNINGになっているトランザクションに細心の注意を払ってください。trx_mysql_thread_id(スレッド ID)の値を記録します。トランザクションを終了する:ビジネスに影響を与えないことを確認した後、KILL コマンドを実行して、ターゲットトランザクションを終了します。
kill [thread ID];
バックグラウンドクリーンアップの進捗状況を確認する
トランザクションに対応するスレッドを終了した後、現在の Undo history の進捗状況を確認する必要があります。 Undo history の長さがまだ急速に増加していることがわかった場合は、バックグラウンドクリーンアップ(パージ)のパフォーマンスを最適化する必要があります。
書き込み負荷が高い場合、PolarDB のポリシーでは、現在の書き込みパフォーマンスが優先されます。 これにより、UNDO ログのクリーンアップが遅れる可能性があります。
クリーンアップの進捗状況を監視する:次のコマンドを実行して、
Undo historyの長さを監視します。SELECT COUNT FROM INFORMATION_SCHEMA.innodb_metrics WHERE name = 'trx_rseg_history_len';この値が 100 万を超える場合、または数分以上にわたって上昇し続け、現在の負荷が実際に高い場合は、クリーンアップ速度が書き込み速度に追いつかないことを意味します。
クリーンアップパラメーターを調整する:クリーンアップ効率を向上させます。
innodb_purge_batch_sizeパラメーターの値を大きくして、各クリーンアップバッチを大きくします。innodb_purge_threadsパラメーターの値を大きくして、クリーンアップスレッドの数を増やします。 クラスタ仕様の CPU コア数と一致するように設定します。説明この操作により、クラスタが再起動されます。 この操作は、オフピーク時に実行してください。
占有されている領域を解放する
Undo history の長さが減少し、安定した後、UNDO ログによって占有されている領域をクリーンアップする場合は、undo log truncation 機能を有効にできます。
機能を有効にする:
innodb_undo_log_truncateパラメーターの値を ONに設定します。トリガーメカニズム:単一の UNDO ファイルのサイズが
innodb_max_undo_log_sizeを超えると、undo log truncationがトリガーされます。バージョンの制限:一部の履歴バージョンには、
undo log truncationに関連するバグがあります。 システムは、これらのバージョンでこのパラメーターを変更する権限を無効にしています。 このような状況が発生した場合は、クラスタの マイナーバージョンを最新バージョンにアップグレードする必要があります。すぐに無効にする:この機能により、クラスタの切り替えまたは再起動中に追加のオーバーヘッドが発生します。 領域が解放されたら、すぐにこのパラメーターを OFF に戻してください。特に、マイナーバージョンのアップグレードなどの O&M 操作を実行する前には必ず行ってください。 必要に応じてのみ有効にしてください。
一時ファイルをクリーンアップする
PolarDB for MySQL クラスタは、複雑なクエリまたは大規模なトランザクションが原因で、多くの一時ファイルを生成する可能性があります。 これにより、大量のストレージ容量が占有されたり、いっぱいになったりする可能性があります。 この場合、「error: 1114 The table '/home/mysql/log/tmp/#sqlxxx_xxx_xxx' is full」などのエラーメッセージが表示される場合があります。
これは、次の 2 つの方法で処理できます。
セッションを終了する
大量の Copy to tmp table 情報または Sending data 情報を含むセッションを終了します。
データベースにログインする:PolarDBコンソール に移動します。 ターゲットクラスタの 概要 ページで、右上隅にある データベースにログイン をクリックして、DMS プラットフォームで PolarDB for MySQL クラスタにログインします。
セッションステータスを表示する:次のコマンドを実行して、データベース内のセッションステータスを表示します。
SHOW PROCESSLIST;ターゲットセッションを見つける:DMS で、クエリ結果の
State列をクリックして、その列のデータをソートできます。Copy to tmp tableメッセージまたはSending dataメッセージが多いセッションを探し、セッション ID を記録します。セッションを終了する:次のコマンドを実行して、ターゲットセッションを終了します。
kill [session ID];重要セッションを終了する前に、操作がビジネスに影響を与えないことを確認してください。
上記の手順を実行してもストレージ容量が解放されない場合は、クラスタ内の各ノードを再起動して、一時ファイルによって占有されているストレージ容量を解放できます。
パラメーターを調整する
PolarDBコンソール に移動します。 ターゲットクラスタの ページで、tmp_table_size パラメーターと max_heap_table_size パラメーターを変更して、一時表領域のサイズを増やします。