中級プログラマの自宅でPHP ブログ

自宅用ポータルシステム「MyHome Portal」をオープンソースで公開。MyHome Portalの説明とエンハンス情報。

MySQLのストレージエンジンをInnoDBにする方法

MyHome Portalでは、MySQLのストレージエンジンはMyISAMを使っています。

MySQLの代表的なストレージエンジンには、MyISAMInnoDBがありますが、

【漢(オトコ)のコンピュータ道:MyISAMからInnoDBへ切り替えるときの注意点】

http://nippondanji.blogspot.com/2009/02/myisaminnodb.html

によれば、MyISAMの欠点として以下のものが上げられています。

トランザクション対応ではない。

・クラッシュセーフではない。

・更新と参照が入り乱れた場合の同時実行性能がよくない。

・テーブルが大きく(数億行とか)なるとINSERTの性能が劣化する。

2番目の「クラッシュセーフではない」というのが一番気になるとところです。

ということで、MyHome PortalのストレージエンジンをInnoDBにしたい方のための簡単な手順を以下に書きます。

なお、トラブルが発生してもサポートできませんので、あくまでも自己責任でお願いいたします。事前にMyISAMの状態でバックアップをとっておいてください。

以下、MySQL管理者ユーザーrootのパスワードを「kanri789」、インストールドライブを「D:」として説明します。

●1.XAMPPは初期状態では、InnoDBが使えませんので、InnoDBを有効にする必要があります。

【参考:XAMPP環境でMySQLInnoDBを有効にする】

http://code.xenophy.com/?p=127

[xamppインストールディレクトリ]/mysql/bin/my.cnf

(例:D:\xampp\mysql\bin\my.cnf)

を以下のように編集して、MySQLを再起動します。

skip-innodbの先頭に#を頭につけてコメントアウトします。

skip-innodbの下4行のinnodb_...の頭の#を外します。

その他innodb_...は任意で設定してください。

------------------------------------------------------

#skip-innodb

innodb_data_home_dir = "D:/xampp/mysql/"

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = "D:/xampp/mysql/"

innodb_log_arch_dir = "D:/xampp/mysql/"

# You can set .._buffer_pool_size up to 50 - 80 %

# of RAM but beware of setting memory usage too high

innodb_buffer_pool_size = 16M

innodb_additional_mem_pool_size = 2M

# Set .._log_file_size to 25 % of buffer pool size

innodb_log_file_size = 5M

innodb_log_buffer_size = 8M

innodb_flush_log_at_trx_commit = 1

innodb_lock_wait_timeout = 50

------------------------------------------------------

コマンドプロンプトで、以下を実行してMySQLを再起動します。

net stop mysql

net start mysql

------------------------------------------------------

●2.MyHome Portalの実運用データベースの更新系テーブルをInnoDBにします。

コマンドプロンプトで、以下を実行します。

「ERROR 1025 (HY000): Error on rename ...」

というエラーが出る場合があります。その場合は、以下の一連の処理を再実行します。多分2度目はエラーが出ません。

------------------------------------------------------

mysql -u root -pkanri789

use _mydb_abook;

ALTER TABLE m_abook ENGINE=InnoDB;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_check_caption ENGINE=InnoDB;

use _mydb_account;

ALTER TABLE m_account ENGINE=InnoDB;

ALTER TABLE m_friends ENGINE=InnoDB;

ALTER TABLE m_public ENGINE=InnoDB;

ALTER TABLE z_loginlog ENGINE=InnoDB;

use _mydb_bbs;

ALTER TABLE m_bbs ENGINE=InnoDB;

ALTER TABLE m_category ENGINE=InnoDB;

use _mydb_calendar;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_schedule ENGINE=InnoDB;

ALTER TABLE m_todo ENGINE=InnoDB;

use _mydb_chat;

ALTER TABLE m_messages ENGINE=InnoDB;

use _mydb_diary;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_marker ENGINE=InnoDB;

ALTER TABLE m_schedule ENGINE=InnoDB;

use _mydb_index;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_homepage ENGINE=InnoDB;

ALTER TABLE m_oftenuse ENGINE=InnoDB;

use _mydb_kakeibo;

ALTER TABLE m_chokin ENGINE=InnoDB;

ALTER TABLE m_ginkou ENGINE=InnoDB;

use _mydb_memo;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_memo ENGINE=InnoDB;

use _mydb_rss;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_rss ENGINE=InnoDB;

use _mydb_sticky;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_notes ENGINE=InnoDB;

use _mydb_study;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_category2 ENGINE=InnoDB;

ALTER TABLE m_mycheck ENGINE=InnoDB;

ALTER TABLE m_study ENGINE=InnoDB;

use _mydb_zid_mgr_a;

ALTER TABLE m_category ENGINE=InnoDB;

ALTER TABLE m_pass ENGINE=InnoDB;

use _mydb_zid_mgr_b;

ALTER TABLE m_pass2 ENGINE=InnoDB;

exit;