MAMPのMySQLのibdata1を圧縮する

MAMPのMySQLにテストデータをガシガシ入れてデータコンバートのバッチ(コマンドラインのPHP)を開発していたら、MacBook AirのSSDの空き容量が少なくなってきたことに気が付きました。開発プロジェクトも一段落したので、データを消すことにしました、が、データを消しても空き容量が一向に増えません。
調べてみると、MySQLのデータ領域であるibdata1が数GBに膨れ上がっていました。SQLServerでいうところのDBCC SHRINKFILEみたいなコマンドも残念ながら無さそうです。
ibdata1を縮小させるには、一旦データをexportしてibdata1を削除してから再度データをimportするという美しいまでの力技が必要でした。運用中のDBサーバでは絶対にやりたくない作業なので、サーバでは運用前にきちんと肥大化しない設定をしておかないといけないですね。
余談ですが、SQLServerを使った後にMySQLを使うと、SHRINKFILEを始め、こんな機能も無いの?と最初は思います。でも、使っているとそのシンプルさが運用のしやすさに繋がっていることに気が付きます。mysqldumpを使ってバックアップすると、中身は単にSQL文が書いてある、というのも初めは衝撃でしたが、バイナリになって中身がわからないSQLServerのバックアップファイルよりずっと安心出来ます。複雑なSQLServerのレプリケーションにも泣かされましたが、MySQLのmaster-slaveの関係はずっとシンプルで、障害発生時の再構築も容易です。柔軟にサーバを増やせるクラウドと組み合わせてコンシューマ向けのサービスを展開するには最適ですね。もちろんライセンス費用は比べるのも馬鹿らしい程の差です。

それはさておき、最短でibdata1を縮小する方法です。まずは可能ならば要らないデータをdeleteなりtruncateなりで削除してください。終わったら、全DBをdumpします。
MAMPのmysqldumpは、/Applications/MAMP/Library/binにあります。

$ cd /Applications/MAMP/Library/bin
$ ./mysqldump -u root -p --all-databases > /tmp/all-dump.sql

パスワードを入力すると、dumpファイルが生成されます。
その後、自分で作成した各データベースをdropしていきます。information_schema、mysql、performance_schemaはdropしなくても大丈夫です。
そして、一旦MAMPのコントロールパネルから「サーバを停止」を使ってMySQLを停止します。単純にMAMPを終了させるのでも大丈夫です。そしたら、ibdata1と、ついでにib_logfileを削除してしまいましょう。

$ cd /Applications/MAMP/db/mysql
$ rm ibdata1 ib_logfile0 ib_logfile1

終わったら再度MAMPを起動して、今度はdumpをもどしてやります。

$ cd /Applications/MAMP/Library/bin
$ ./mysql -u root -p < /tmp/all-dump.sql

これで終了です。
かなり大雑把な方法なので、重要なデータの場合は慎重かつ自己責任で!w

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク