1. ホーム
  2. mysql

[解決済み] MySQLでibdata1ファイルを縮小/パージする方法

2022-03-17 14:51:07

質問

つまり、Rスクリプトを実行するたびに、新しいデータベース(A)を作成し、新しいテーブル(B)を作成し、Bにデータをインポートし、必要なものを得るためにクエリを送信し、その後Bを削除し、Aを削除しています。

MySQLには何も保存していないのに、ibdata1ファイルはすでに100MBを超えています。

MySQLのデフォルト設定をほぼそのまま使っているのですが、一定期間後にibdata1ファイルを自動的に縮小・消去する方法はありますか?

解決方法を教えてください。

その ibdata1 が縮小されないのは、MySQL の特に厄介な機能です。その ibdata1 ファイルは、すべてのデータベースを削除し、ファイルを削除し、ダンプを再ロードしない限り、実際に縮小することはできません。

しかし、インデックスを含む各テーブルが個別のファイルとして保存されるように MySQL を設定することができます。その場合 ibdata1 が大きくなることはありません。によると ビル・カーウィンのコメント これは、MySQL のバージョン 5.6.6 でデフォルトで有効になっています。

しばらく前になりますが、これをやってみました。しかし、各テーブルに別々のファイルを使用するようにサーバーをセットアップするためには my.cnf を有効にしてください。

[mysqld]
innodb_file_per_table=1

https://dev.mysql.com/doc/refman/5.6/en/innodb-file-per-table-tablespaces.html

からスペースを取り戻したいので ibdata1 の場合、実際にはファイルを削除する必要があります。

  1. を行う。 mysqldump すべてのデータベース、プロシージャ、トリガーなどの を除く mysqlperformance_schema データベース
  2. すべてのデータベースを削除する 上記2つのデータベースを除く
  3. mysqlを停止する
  4. 削除 ibdata1ib_log ファイル
  5. mysqlの起動
  6. ダンプからのリストア

手順5でMySQLを起動すると ibdata1ib_log ファイルが再作成されます。

これで準備万端です。分析用の新しいデータベースを作成すると、テーブルが別々の ibd* ファイルではなく ibdata1 . 通常、データベースをすぐに削除するため ibd* のファイルは削除されます。

http://dev.mysql.com/doc/refman/5.1/en/drop-database.html

ご覧になったことがある方も多いのではないでしょうか。
http://bugs.mysql.com/bug.php?id=1341

コマンドを使用することで ALTER TABLE <tablename> ENGINE=innodb または OPTIMIZE TABLE <tablename> を使えば、ibdata1 からデータページとインデックスページを別々のファイルに抽出することができます。しかし、上記の手順を踏まない限り、ibdata1は縮小されません。

については information_schema を削除する必要はありませんし、削除することも可能です。実際には、テーブルではなく、読み取り専用のビューの束に過ぎないのです。そして、それらに関連するファイルはなく、データベースディレクトリすらありません。その informations_schema はメモリのdb-engineを使用しており、mysqldの停止/再起動時に削除/再生成されます。参照 https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .