#バドシス 〜 日々のことを続く限り書いてみようと思って 〜

三日坊主が得意ですが、頑張って日々のことを書いていこうと思います。

MySQLの不要データを削除した話

f:id:mizominton:20170726201530p:plain

データの増減が激しいから調べて!!

 

と丸投げされましたw

 

mysql メンテナンス」 とか mysql データ量」とかいろいろググってみたのでまとめます。

 

結論

 

data_freeが大量にありましたので削除しました。

 

ピンとこない人は下へどうぞ!!

 

 

 

data_freeってなんぞ??

data_freeとは、SQLでUPDATEやDELETEをした時に発生するゴミのようなものです。

UPDATEはともかくDELETEでもゴミが発生しちゃうんですね・・・。

 

それから何か復元とかできるのかもですが、それは違う話なので今後の課題でw

 

調べ方

SQLコマンドは下記サイトのものをそのまま使わせていただきました。

SELECT table_name "Table", engine,table_rows "Table Rows", ( data_length + index_length ) / 1024 / 1024 / 1024 "Data (GB)", ( data_free )/ 1024 / 1024 / 1024 "Free Space (GB)" FROM information_schema.TABLES WHERE table_schema=database() ORDER BY (data_length+index_length) desc limit 10;

qiita.com

 

そうすると、Free Space(GB)で10GBもあるデータがあったりしてもうビックリ!

テーブル名から処理を追ってみるとなんと毎日何千件ものデータをDeleteしているバッチが・・・。

 

絶対こいつのせいや・・・・。

 

最適化コマンド

SQLコマンドとしては、

 

OPTIMIZE TABLE table_name;

 

でいけるのですが、ここで豆知識。

設定されてないと、「Table does not support optimize, doing recreate + analyze instead」なんて不安なメッセージが出ることがあります。

 

ただこれ、調べてみると代わりに

 

ALTER TABLE table_name ENGINE InnoDB;

 

というコマンドが実行されて最適化してくれるみたいです。

実際最適化されてたし、大丈夫なんでしょうね。

 

詳細は下記のマニュアル頑張って読んでみてください!

 

MySQL :: MySQL 5.7 Reference Manual :: 13.7.2.4 OPTIMIZE TABLE Syntax

 

注意

安易に最適化コマンド打つと死んでしまうかもしれません。

 

理由としてはALTER TABLEをする時にロックがかかるから。

 

10GB最適化するのにどれくらいのメモリを食うとかいろいろ検証しないとですが、なんにせよ夜中にやった方が安心そうですね。

 

SHOW PROCESSLIST

 

とかコマンド打ってプロセスが複数走ってないかとか確認してからやると安心かもです。