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

ApsaraDB RDS:MySQL インスタンスで OPTIMIZE TABLE コマンドを使用して表領域を解放する

最終更新日:Jul 22, 2025

MySQL テーブルに大量のデータが含まれている場合、DELETE 文を使用してデータをクリーンアップしてもディスク容量は直接解放されません。データベースレコードまたはデータページが再利用可能としてマークされるだけです。実際に表領域を解放し、ディスク使用量を削減するには、OPTIMIZE TABLE を使用できます。

前提条件

  • InnoDB エンジンと MyISAM エンジンのみが OPTIMIZE TABLE 文をサポートしています。

  • インスタンスの残りのディスク容量は、解放されるテーブルの容量以上である必要があります。

    説明

    インスタンスの残りのディスク領域が不足している場合は、まずディスク領域のスケールアップが必要です。操作完了後、必要に応じてディスク領域をスケールダウンできます。システムにより差額の返金も行われます。

考慮事項

  • 最初に大量のデータを削除する必要がありますDELETE を使用して最初に大量のデータを削除しないと、OPTIMIZE TABLE を直接実行しても表領域の使用量は効果的に削減されません。

  • ディスク使用量の一時的な増加OPTIMIZE TABLE を実行すると、MySQL は再編成されたデータを格納するための一時テーブルを作成します。これにより、ディスク容量が一時的に増加します。操作が完了すると、一時テーブルは削除され、ディスク使用量は通常に戻ります。

  • パフォーマンスへの影響とピーク時のリスク。RDS MySQL 5.7 および 8.0 では、OPTIMIZE TABLE はオンライン DDL を使用して実行され、同時 DML 操作をサポートしています。ただし、大きなテーブルでこの操作を実行すると、突然の IO およびバッファリソースの消費が発生し、テーブルロックまたはリソース競合のリスクがあります。ビジネスのピーク時には、インスタンスが使用できなくなったり、監視が中断されたりする可能性があります。そのため、通常のビジネス運用への影響を避けるために、この操作はビジネスのオフピーク時に実行することをお勧めします。

CLI を使用して表領域を解放する

  1. クライアント経由で RDS MySQL インスタンスに接続する

  2. 必要に応じて、DELETE 文を使用して不要なデータをクリーンアップします。

  3. OPTIMIZE TABLE コマンドを実行して表領域を解放します。

    OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
    説明
    • <$Database1> と <$Database2> はデータベース名、<Table1> と <Table2> はテーブル名です。

    • InnoDB エンジンで OPTIMIZE TABLE 文を実行すると、次のメッセージが表示されます。これは正常な実行結果であるため、無視してかまいません。「ok」が返されることを確認してください。詳細については、「OPTIMIZE TABLE Statement」をご参照ください。

      Table does not support optimize, doing recreate + analyze instead

DMS を使用して表領域を解放する

  1. DMS 経由で RDS MySQL インスタンスにログオンする

  2. 左側のペインで、ターゲットインスタンスのインスタンス ID を選択し、ターゲットデータベースをダブルクリックし、任意のテーブル名を右クリックして、[一括操作] を選択します。

  3. 容量を解放するテーブルを選択し、[テーブルメンテナンス] > [テーブルの最適化] を選択します。优化表

  4. 表示されるダイアログボックスで、変更情報が正しいことを確認し、[確認] をクリックします。

参照

テーブルの断片化スペースを解放する

FAQ

RDS MySQL で DELETE が容量を解放しない場合の対処方法

RDS MySQL では、DELETE 文を使用してデータを削除する場合、このコマンドはレコードの場所またはデータページを再利用可能としてマークするだけで、ディスクファイルサイズは変更されません。つまり、表領域は直接解放されません。この動作により、表領域が直接解放されなくなり、インスタンスストレージ容量を占有するインスタンスストレージ容量の断片化が発生します。

以下に、ネイティブ DDL または DMS ロックフリースキーマ進化の 2 つのソリューションを示します。いずれかのソリューションを実行する前に、インスタンス容量がいっぱいになることによるインスタンスロックを回避するために、インスタンスに十分な残りの容量があることを確認する必要があります

  • コマンドによる容量断片化の整理OPTIMIZE TABLE または ALTER TABLE <table_name> ENGINE=InnoDB; などの DDL 操作を実行して、テーブルデータとインデックス構造を再編成し、断片化された容量を解放します。

    重要

    ネイティブ DDL コマンドを使用する場合は、メタデータロックブロッキングを回避するために、ビジネスのオフピーク時に実行する必要があります。詳細については、「考慮事項」をご参照ください。

  • DMS ロックフリースキーマ進化を使用する:メタデータロックを回避する場合は、DMS ロックフリースキーマ進化 を使用してテーブルの断片化スペースを解放することを検討できます。

RDS MySQL で TRUNCATE または DROP が容量を解放しない場合の対処方法

RDS MySQL で、TRUNCATE または DROP 操作を実行した後にディスク容量が解放されない場合は、次の手順に従って対処できます。

  1. 容量解放ロジックの確認

    TRUNCATE または DROP を実行した後、インスタンスのディスク使用率を監視して、領域が解放されたかどうかを確認します。通常、インスタンスの総領域に対する削除されたテーブルのサイズの割合が、ディスク使用率の低下として反映されます。

  2. 古い情報への依存を避ける

    information_schema.tables または RDS コンソール([自律型サービス] > [クイック診断] > [容量分析])でテーブルサイズを確認すると、データ更新の遅延により表領域が変更されていないように見える場合があります。そのため、主にディスク使用量を判断基準にすることをお勧めします。

  3. 非同期削除の影響

    インスタンスで非同期削除(Alibaba Cloud の Purge Large File Asynchronously など)が有効になっている場合、テーブルファイルによって占有されている容量はすぐに解放されませんが、バックグラウンドプロセスによって徐々にクリーンアップされます。この場合、ディスク容量が最終的に解放されるまで、非同期プロセスが完了するのを待つ必要があります。