ibdata1をtable毎に作ってサイズ分散させる

連休明けたら MySQL のibdata1が9.1GBとかになってて焦った焦った。
ってのも12GBで割ってあるパーティションにDBが設置してあるので、
パンパンになってしまうとDBが動かなくなっちまう。ま、全部消えてしまっても良かったのですが。

概ね原因は見つけられてるので、今回はなんとかする方法として
いろんな実験をやりつつibdata1のダイエットに挑戦してみました。
(結果、サイズを小さくする事が出来なかったのですが、なんとかする方法は編み出しました)

ibdata1をテーブル毎に分けてサイズ分散する手順
  1. サービス停止
  2. mysqlとかを止めます。

    バックアップ
    論理的に
    mysqldump -u root -p -x --all-databases > mysql_all.sql
    物理的に
    tar czpvf /hd/admin/mysql.tgz /var/db/mysql/

  3. データベースのデータ削除
  4. 既存データの削除
  5. ・サーバアカウントを抽出して drop table [account]; -> create table [account];
    ・ibdata* ib_logfile* ファイルの削除

  6. my.cnfにibdata1の設定行を追加
  7. innodb_file_per_table=1
    innodb_data_file_path = ibdata1:10M:autoextend:max:512M

  8. mysql を立ち上げてバックアップからのリストア
  9. mysql -u root -p < /hd/admin/mysql_all.sql

これでテーブル毎にibdataができるようになったはず。
でも私の場合、ibdata1自体は小さくなりましたが、各table毎に出来たibdファイルが全然大きくて全然問題解決になりませんので、次の方法で対処してみました。

dbファイルを違うパーティションに移動する手順
  1. データベースファイルを別のパーティションにコピー
  2. コピーしたファイルを所有者を mysql:mysql に変更
  3. 実態があった所からコピー先にシンボリックリンクを設置

正直、問題を先送りにしただけのオススメできない方法ですが、
こうしないとやり過ごせない事もあります、きっと。

別件だけど、いや別件でもないけど、こまめにalter table [table] ENGINE InnoDB;でibdファイルの最適化が出来ると書いてあったのだけど、私の環境では完了しないでセッションが切れてしまう。どうして?

—————–
version
mysql Ver 14.14 Distrib 5.5.28, for FreeBSD9.1 (amd64) using 5.2

0
カテゴリー未分類

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です