その他
    ホーム 技術発信 DoRuby MySQLのストレージエンジン変更

    MySQLのストレージエンジン変更

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    君は知っているか? MySQLに、ストレージエンジンというものがある事を。

     【知っている】 → え?知ってる?じゃあもう読まなくてもいいかもね。(次回にご期待ください)

     【知らない】 → そうか・・・・あんた、オレと同じだな。(続きをお読みください)

    ストレージエンジンていうのは、SQLの実データがどのような形式で、
    どのように格納されているかを管理している部分で、それらのデータ
    にアクセスする処理を行うとの事。

    で、以下の二つが代表的なものだそうです。

    【MyISAM(マイアイサム)】
    ・テーブル単位のファイルによるデータ構造を持つ。
    ・トランザクション機能がない分、軽快に動作する。
    ・ロックはテーブル単位でかかる。
    ・参照系クエリが大部分を占める場合に有効。

    【InnoDB(イノディービィー)】
    ・テーブルスペース内に複数のテーブルやインデックスを格納するデータ構造を持つ。
    ・トランザクション機能をサポートしている。
    ・ロックは行(レコード)単位でかかる。
    ・更新系クエリが多い場合に有効。

    さて、自分が扱っているサーバは複数のバッチ処理を同時に行っていたり
    するので、今回、MyISAM(デフォルト)からInnoDBに変更してみようと
    いう話になりました。
    今回は、その手順について説明します。(ちなみに次回はない)

    まず、既にInnoDBになってたら意味ないので、
    現在の設定を確認します。
    mysql> show engines;

    | Engine   | Support   | Comment |
    +———+———-+———————————————–+
    | MyISAM  | DEFAULT | Default engine as of MySQL 3.23 ….|
    | MEMORY | YES        | Hash based, stored in memory, useful for ….|
    | InnoDB   | DISABLED | Supports transactions, row-level locking, ….|
    (以下略)

    OH!NO!
    「InnoDB」は「DISABLED」になってんじゃん!?
    というわけで、/etc/my.cnfを修正します。以下の部分を変更してください。
    # vi /etc/my.cnf

    default_table_type=MYISAM
     ↓
    default_table_type=InnoDB

    では、mysqlを止めます。
    # /etc/init.d/mysqld stop

    さて、この後、mysqlを起動すれば設定は反映されるんだけど、
    ここにちょっとした罠があるんですわ。
    /var/lib/mysql に移動してくだされ。
    # cd /var/lib/mysql # ls

    この中に ib_logfile0 ib_logfile1 ibdata1 といったファイルがある場合
    は削除しておくがよろし。(心配だったら移動させてもよろし)
    こいつらがいると、InnoDBの設定後にMySQLを起動した場合、
    MySQLが立ち上がらないんですよ。

    さて、上の作業が終わったら、いよいよmysqlの起動です。
    # /etc/init.d/mysqld start

    どう?立ち上がった?
    ま、いいや。

    設定が反映されたか確認します。
    > show engines;

    これで新しく作られたテーブルのストレージエンジンは、
    特に明示しない限りInnoDBになります。

    だが、ちょっと待て。
    既存のテーブルに関してはどうすんだよ?と。

    そう。ストレージエンジンはテーブル単位で指定するので、
    既存のテーブルは頑張って一つずつ設定していかなければ
    ならんのです。
    alter table テーブル名 engine=innodb;

    こいつをひたすら繰り返せ!
    面倒だったらシェルでバッチ作って回してもいいかもね。
    君ならできるはずだ!

    以上、大した内容じゃないのにいっぱい書いてしまった。
    お粗末さまでした。