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

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

最終更新日:Nov 09, 2025

DELETE 文を使用して MySQL テーブルから大量のデータを削除しても、ディスク領域は直接解放されません。この文は、データベースレコードまたはデータページを再利用可能としてマークするだけです。表領域を再利用してディスク使用量を削減するには、OPTIMIZE TABLE コマンドを実行する必要があります。

前提条件

  • OPTIMIZE TABLE 文をサポートするのは、InnoDB および MyISAM エンジンのみです。

  • インスタンスの残りのディスク領域は、最適化するテーブルのサイズ以上である必要があります。

    説明

    インスタンスの残りのディスク領域が不十分な場合は、まずディスク領域をスケールアウトする必要があります。操作が完了したら、必要に応じてディスク領域をスケールインできます。システムは差額を返金します

考慮事項

  • まず大量のデータを削除する必要があります: DELETE 文を使用して最初に大量のデータを削除しない限り、OPTIMIZE TABLE コマンドは表領域の使用量を効果的に削減しません。

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

  • 解放後、テーブルとインデックスの統計情報が変更されない場合があります: ディスク領域は解放されますが、MySQL のテーブル統計情報は迅速にリフレッシュされません。詳細については、「OPTIMIZE TABLE コマンドを実行した後、ApsaraDB RDS for MySQL インスタンスのディスク領域が変わらないのはなぜですか?」をご参照ください。

  • パフォーマンスへの影響とピーク時間のリスク: ApsaraDB RDS for MySQL 5.7 および 8.0 では、OPTIMIZE TABLE コマンドはオンライン DDL メソッドを使用して実行され、同時 DML 操作をサポートします。ただし、大きなテーブルでこのコマンドを実行すると、I/O およびバッファーリソースの使用量が急増する可能性があります。これにより、テーブルロックやリソース競合が発生する可能性があります。ピーク時間帯には、インスタンスが利用できなくなったり、モニタリングが中断されたりすることさえあります。したがって、サービスに影響を与えないように、このコマンドはオフピーク時間帯に実行する必要があります。

コマンドラインの使用

  1. クライアントから ApsaraDB RDS for 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 を使用して ApsaraDB RDS for MySQL インスタンスにログオンします

  2. 左側のナビゲーションウィンドウで、ターゲットインスタンスを見つけてインスタンス ID をクリックします。ターゲットデータベースをダブルクリックします。テーブルを右クリックし、[一括操作] を選択します。

  3. 領域を解放するテーブルを選択し、[テーブルメンテナンス] > [テーブルの最適化] を選択します。Optimize table

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

参考資料

テーブルの断片から領域を再利用する

よくある質問

ApsaraDB RDS for MySQL インスタンスでOPTIMIZE TABLE コマンドを実行してもディスク領域が変更されないのはなぜですか?

問題の説明

ApsaraDB RDS for MySQL の公式チュートリアルに従って、DELETE コマンドを使用して大量のデータを削除し、その後 OPTIMIZE TABLE コマンドを実行して表領域を再利用します。直後に、information_schema.tables の DATA_FREE フィールドをクエリすると、値が更新されていないことがわかります。これにより、ディスク領域が解放されず、操作が効果的でなかったと結論付けるかもしれません。

原因

ディスク領域は実際に解放されています。この問題は、MySQL のテーブル統計情報が迅速にリフレッシュされないために発生します。この問題は、20250531 より前のマイナーエンジンバージョンを実行している ApsaraDB RDS for MySQL 5.6、5.7、および 8.0 インスタンスで一般的です。これらのバージョンでは、OPTIMIZE TABLE コマンドを実行してもテーブルとインデックスの統計情報が自動的に更新されません。その結果、information_schema.tables の DATA_FREE 値は更新されず、実際の領域使用量を正確に反映できません。詳細については、「Bug #117426: optimize table does not update table and index stats」をご参照ください。

ソリューション

  • 推奨ソリューション: マイナーエンジンバージョンを 20250531にアップグレードする (MySQL 8.0 の場合)

    この問題は、ApsaraDB RDS for MySQL 8.0 マイナーエンジンバージョン 20250531 で修正されています。このアップグレードにより、OPTIMIZE TABLE コマンドがテーブルステータスを更新しない問題が修正されます。OPTIMIZE TABLE コマンドを実行すると、統計情報が自動的にリフレッシュされ、DATA_FREE 値が実際の領域使用量を正しく反映します。

  • 一時的な回避策: 統計情報を強制的にリフレッシュする (短期間でアップグレードできないシナリオの場合) 短期間でデータベースバージョンをアップグレードできない場合は、OPTIMIZE TABLE コマンドが実行されたテーブルで ALTER TABLE table_name ENGINE=InnoDB; コマンドを実行できます。このコマンドは、テーブルを強制的に再構築し、統計情報を更新します。コマンドが実行されると、information_schema.tables の DATA_FREE 値は解放された領域を正しく表示します。

ApsaraDB RDS for MySQL インスタンスで DELETE コマンドを実行してもディスク領域が解放されないのはなぜですか?

ApsaraDB RDS for MySQL では、DELETE 文はレコードの場所またはデータページを再利用可能としてマークするだけであり、ディスクファイルサイズは変更されません。その結果、表領域はすぐには再利用されません。この動作により、インスタンスのストレージ領域を消費する断片化が発生します。

ネイティブ DDL 操作と DMS ロックフリースキーマ進化の 2 つのソリューションが利用可能です。いずれかのソリューションを使用する前に、インスタンスに十分な空き領域があることを確認してください。これにより、ストレージがいっぱいになった場合にインスタンスがロックされるのを防ぎます。

  • コマンドを使用して断片化を管理する: OPTIMIZE TABLEALTER TABLE <table_name> ENGINE=InnoDB; などの DDL 操作を実行して、テーブルデータとインデックススキーマを再編成します。これにより、断片化された領域が解放されます。

    重要

    メタデータロックが他の操作をブロックするのを防ぐため、オフピーク時間帯にネイティブ DDL コマンドを実行してください。詳細については、「考慮事項」をご参照ください。

  • DMS ロックフリースキーマ進化を使用する: メタデータロックを回避するには、DMS ロックフリースキーマ進化を使用して、断片化されたテーブル領域を再利用します。

ApsaraDB RDS for MySQL インスタンスで TRUNCATE または DROP コマンドを実行してもディスク領域が解放されないのはなぜですか?

ApsaraDB RDS for MySQL で、TRUNCATE または DROP 操作を実行した後にディスク領域が解放されない場合は、次の手順に従ってください:

  1. 領域解放ロジックの確認

    TRUNCATE または DROP コマンドを実行した後、インスタンスのディスク使用量をモニタリングして領域が解放されたかどうかを確認します。通常、ディスク使用量の減少は、削除されたテーブルのサイズがインスタンスの総領域に占める割合を反映します。

  2. 古い情報に依存しない

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

  3. 非同期削除の影響

    インスタンスで Alibaba Cloud の大容量ファイルの非同期パージ機能などの非同期削除機能が有効になっている場合、テーブルファイルが占有する領域はすぐには解放されません。代わりに、バックグラウンドプロセスが徐々に領域をクリーンアップします。この非同期プロセスが完了するのを待つ必要があります。プロセスが終了した後にのみディスク領域が解放されます。