155

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

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

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

4

11 に答える 11

153

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

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

于 2009-08-14T23:13:03.787 に答える
50

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

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

設計上失敗します。

于 2009-12-25T20:55:02.897 に答える
27

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

ハウツーはかなり詳細ですが、関連する部分を以下に貼り付けました.

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

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

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

サーバーを停止します。

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

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

新しいテーブルスペースを構成します。

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

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

于 2012-01-19T19:45:16.680 に答える
1

領域再利用の問題を解決する他の方法は、テーブル内に複数のパーティションを作成することです - 範囲ベース、値ベースのパーティションを作成し、パーティションを削除/切り捨てて領域を再利用します。これにより、特定のパーティションに格納されているデータ全体で使用されている領域が解放されます。

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

于 2015-02-10T07:22:00.640 に答える
-2

MySQL Inodb エンジンのテーブルからデータを削除した後にディスク領域を再利用するには、いくつかの方法があります。

最初から innodb_file_per_table を使用しない場合は、すべてのデータをダンプし、すべてのファイルを削除し、データベースを再作成してデータを再度インポートすることが唯一の方法です (上記の FlipMcF の回答を確認してください)。

innodb_file_per_table を使用している場合は、試してみてください。

  1. すべてのデータを削除できる場合、truncate コマンドはデータを削除し、ディスク容量を再利用します。
  2. Alter table コマンドは、テーブルを削除して再作成し、ディスク領域を再利用できるようにします。したがって、データを削除した後、何も変更しないalter tableを実行してハードディスクを解放します(つまり、テーブルTBL_Aにはcharset uf8があり、データを削除した後、ALTER TABLE TBL_A charset utf8を実行します->このコマンドはテーブルから何も変更しませんが、mysqlにテーブルを再作成させて回復させますディスクスペース
  3. TBL_A と同様に TBL_B を作成します。保持したい選択データを TBL_A から TBL_B に挿入します。TBL_A を削除し、TBL_B を TBL_A に名前変更します。この方法は、削除する必要がある TBL_A とデータが大きい場合に非常に効果的です (MySQL innodb の削除コマンドはパフォーマンスが非常に悪い)。
于 2016-04-25T17:07:27.273 に答える