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


140

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

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

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


optimizeコマンドも実行した後、ibdata1ファイルのサイズは減少しませんでした。
Sumit Deo

4
そのコメントはあなたの答えに編集されてから削除されると思います
Ben Millwood

stackoverflow.com/q/11751792/82114の重複の可能性 (ただし、これは最初にここにありました)
FlipMcF

1
「最適化テーブルコマンドの実行後にibdata1ファイルのサイズが減少することもありませんでした」とは、innodb_file_per_tableオフになっているためです。on最近のバージョンのMySQLでは、このオプションがデフォルトで有効になっています。
会計士م'19

「optimize table xxxx」を実行すると、「Tableは最適化をサポートしていません。代わりに再作成+分析を実行しています」というメッセージが表示されました。その後、シェルで「du -h / var / lib / mysql」を実行すると、データベースが縮小したことがわかりました。
user1097111

回答:


137

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

代わりにを使用するようにサーバーを設定することもできますinnodb_file_per_tableが、これにはバックアップ、データベースの削除、復元が必要になります。良い面は、テーブルの.ibdファイルがoptimize table


4
InnoDB file-per-tableモードの状態に関するMySQL 5.5ドキュメント「既存のテーブルで[InnoDB file-per-table]機能を利用するには、file-per-table設定をALTER TABLE t ENGINE=INNODBオンにして、既存のテーブルで実行できます。 」これは、この機能をオンにして、ALTER TABLEコマンドで別のInnoDBファイルを使用するように既存のテーブルを「変換」し、テーブルを最適化してサイズを縮小できることを意味します。ただし、完了したら、(巨大な)ソースInnoDBファイルを削除する方法を理解する必要があります...
Josh

9
これは技術的に質問に答えると思いますが、このトピックを検索する大多数の人々は、この回答では提供されない、スペースを縮小/再利用する実際のプロセスを探していると思います。
Manachi 2017

@Manachiプロセスは、「innodb_file_per_tableを使用するようにサーバーを構成する」、「サーバーをバックアップする」、「データベースを削除する」、mysqlを停止し、.ibdを削除し、サーバーを起動してデータベースを復元することです。MySQL 5.5以降では、Joshの発言を使用できます。すべてのテーブルを変更した後、サーバーを停止し、巨大な.ibdを削除して再起動します。
Leonel Martins

39

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

何が起きるかというと、データベースを削除しても、innodbはディスク領域を解放しません。私はエクスポート、mysqlの停止、ファイルの手動削除、mysqlの起動、データベースとユーザーの作成、そしてインポートを行わなければなりませんでした。200MB相当の行しかありませんでしたが、250GBのinnodbファイルを節約できました。

設計により失敗します。


10
ええ、それは間違いなく失敗です。
trusktr 2013年

1
MySql 5.5にも同じ問題があります。「テーブルの最適化」を実行して、28GBテーブルのディスク使用量を減らしました。この操作は、おそらく元のクローンの最適化されたクローンを作成しようとしたため、パーティション上のすべてのスペースを使い果たしました。これで「テーブルの最適化」が失敗し、データベース全体をドロップした後でも、パーティションにスペースが残っていません...非常に残念です。
バジリコーデ2015

1
そして4年以上後、MySQLで同じ問題に遭遇しました。MS SQLは似ています。dba.stackexchange.com/questions/47310/...
チャバ・トス

24

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

どのようにするためには、かなりで、深さである-しかし、私は、以下の関連部分を貼り付けました。

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

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

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

サーバーを停止します。

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

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

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

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

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


手順などをありがとう- 「どのようにする」リンクはもう、この情報が含まれていないafaict
オーランド

3

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

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

それだけです:)


1

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

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


0

1年前、私はmysql5.7バージョンでも同じ問題に直面し、ibdata1は150 GBを占めていました。だから私は元に戻すテーブルスペースを追加しました

Mysqldumpバックアップを取る
mysqlサービスを停止
するデータディレクトリからすべてのデータを削除
する現在のmy.cnfのUNDOテーブルスペースパラメータの下に追加

 #undo tablespace
  innodb_undo_directory =  /var/lib/mysql/
  innodb_rollback_segments = 128 
  innodb_undo_tablespaces = 3
  innodb_undo_logs = 128  
  innodb_max_undo_log_size=1G
  innodb_undo_log_truncate = ON

mysqlサービス
ストアmysqldumpバックアップを開始します。

問題は解決しました!!


-1

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

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

innodb_file_per_tableを使用している場合は、

  1. すべてのデータを削除できる場合、truncateコマンドはデータを削除し、ディスクスペースを再利用します。
  2. テーブル変更コマンドは、テーブルを削除して再作成し、ディスクスペースを再利用できるようにします。したがって、データを削除した後、何も変更しない変更テーブルを実行してhardiskを解放します(つまり、テーブルTBL_Aには文字セットuf8があります。データを削除した後、ALTER TABLE TBL_A文字セットutf8を実行します。ディスクスペース
  3. TBL_AのようにTBL_Bを作成します。保持する選択データをTBL_AからTBL_Bに挿入します。TBL_Aをドロップし、TBL_Bの名前をTBL_Aに変更します。この方法は、TBL_Aと削除に必要なデータが大きい場合に非常に効果的です(MySQL innodbの削除コマンドはパフォーマンスが非常に悪い)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.