web-dev-qa-db-ja.com

MySQL InnoDBがテーブルからデータ行を削除した後にディスク容量を解放しない

InnoDBストレージエンジンを使用するMySQLテーブルが1つあります。約200万行のデータが含まれています。テーブルからデータ行を削除しても、割り当てられたディスク領域は解放されませんでした。 optimize tableコマンドを実行した後、ibdata1ファイルのサイズも縮小しませんでした。

MySQLからディスク容量を再利用する方法はありますか?

私は悪い状況にあります。このアプリケーションは約50の異なる場所で実行されており、現在、ほとんどすべての場所でディスク領域の不足の問題が発生しています。

126
Sumit Deo

MySQLはibdata1のサイズを縮小しません。今まで。 optimize tableを使用して、削除されたレコードから使用されているスペースを解放しても、後で再利用されます。

別の方法は、サーバーが innodb_file_per_table を使用するように構成することですが、これにはバックアップ、データベースの削除、復元が必要になります。良い面は、テーブルの.ibdファイルがoptimize tableの後に縮小されることです。

130
Leonel Martins

私自身も同じ問題を抱えていました。

何が起こるかというと、データベースを削除しても、innodbはまだディスク容量を解放しません。エクスポート、mysqlの停止、ファイルの手動削除、mysqlの起動、データベースとユーザーの作成、インポートを行う必要がありました。行数が200MBしかなかったのに感謝しますが、250GBのinnodbファイルを節約しました。

設計上失敗

35
gilm

innodb_file_per_table を使用しない場合、ディスク容量の再利用は可能ですが、非常に退屈で、かなりのダウンタイムが必要です。

How To は非常に詳細ですが、関連する部分を以下に貼り付けました。

スキーマのコピーもダンプに保持してください。

現在、システムテーブルスペースからデータファイルを削除することはできません。システム表領域のサイズを小さくするには、次の手順を使用します。

Mysqldumpを使用して、すべてのInnoDBテーブルをダンプします。

サーバーを停止します。

Ibdataおよびib_logファイルを含む、既存のすべてのテーブルスペースファイルを削除します。情報のバックアップコピーを保持する場合は、MySQLインストールのファイルを削除する前に、すべてのib *ファイルを別の場所にコピーします。

InnoDBテーブルの.frmファイルを削除します。

新しい表領域を構成します。

サーバーを再起動します。

ダンプファイルをインポートします。

23
FlipMcF

10年後、私は同じ問題を抱えていました。次の方法で解決しました。

  • 残っているすべてのデータベースを最適化しました。
  • サービス(Windows + r-> services.msc)でコンピューターとMySQLを再起動しました

それがすべてです:)

1
Matheus Douglas

スペース再利用の問題を解決する他の方法は、テーブル内に複数のパーティションを作成することです-範囲ベース、値ベースのパーティション、およびパーティションをドロップ/切り捨ててスペースを再利用します。これにより、特定のパーティションに保存されたデータ全体が使用するスペースが解放されます.

次のようなテーブルのパーティション分割を導入する場合、テーブルスキーマにいくつかの変更が必要になります-一意のキー、パーティション列を含むインデックスなど。

1