web-dev-qa-db-ja.com

InnoDBは未使用のディスク領域を解放しますか?

バグのため、500M行の大きなMySQL関連付けテーブルが最近1B行にバルーン化されました(現在は修正されています)。ディスク使用量は130GBから240GBになりました。

残念ながら、このサーバーには標準的な対策(OPTIMIZEまたはALTER TABLE table ENGINE=InnoDB、ダンプと再構築、一時テーブルへの構築と古いテーブルの名前変更と削除など)。残りは50GBです。

ここに質問があります:

私はこれまで1億行以上(1Bから850Mまで)を正常に削除しましたが、ディスク使用量は実際に10GB(250GBまで)増加しています。はい、新しいレコードも毎秒追加されていますが、追加されるよりもはるかに速く削除しています。

  1. InnoDBはこのスペースを解放しますか?
  2. 行数を減らしているのにテーブルのディスク使用量が増えるのはなぜですか?

通常のソリューションが適合しない場合に、未使用のディスク領域を再利用するためのその他のアドバイスはありますか?

2
Ryan

個々のテーブル(.ibd)のInnoDBテーブルスペースサイズはOPTIMIZEALTER TABLE ... ENGINE=InnoDB;で削減できますが、システムテーブルスペースファイルibdata1は縮小できません。

元に戻すログでのibdata1の増加の原因。

2013年7月以降、これについての記事を書いています 。私は最初にこの現象についてPerconaの投稿 暴走したメインInnodbテーブルスペースの理由 から学びました。

提案#1

新しくインストールされたインスタンスでmysqlを実行している別のサーバーにデータをmysqldumpする場合、それにレプリケーションをセットアップし、フェイルオーバーして古いマスターを破棄することができます。

提案#2

別のサーバーがない場合は、アプリケーションを停止し、データをmysqldumpし、すべてのDBをドロップし、mysqlをシャットダウンし、ibdata1を削除し、mysqlを開始します(これにより、ibdata1が再作成され、mysqldumpがリロードされます)。私の非常に古い投稿を参照してください 方法:mysql InnoDBストレージエンジンをクリーンアップしますか?

3
RolandoMySQLDBA