システム開発ブログ

企画開発部

データベース

my.cnfでinnodb関連の設定後、MySQLが起動しなくなった

MySQLのインストールを行う際、
インストール後一度サーバが起動するか確認したあとに、
MySQLのパラメータ設定を行う人が多いかと思います。
innodbを使用する場合、my.cnfの innodb_data_file_path の設定を
行う方が多いと思いますが
設定後、MySQLが起動エラーになってしまった場合の対処法をお知らせします。

まず、innodb_data_file_pathのパラメータの意味について簡単に説明します。
innodbでは ib_dataやib_log で始まる名前のファイルにデータやログが書き込まれます。
記述法は以下のようになります。
innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
この設定では、ibdata1 というファイルを2GB確保し、
足りなくなった場合は ibdata2 というファイルに10MBずつ自動拡張することになります。

2GBのファイルを確保する作業は、設定した後初めてMySQLを起動した際に行われます。
その際、既にサイズの異なるibdata1 というファイルがある場合、起動時にエラーとなります。

起動時のエラー内容は、MySQLのデータファイルが保存されるディレクトリ内の
ホスト名.err というファイルで確認できます。
今回検証している端末は、CentOS5.4にrpmでMySQLをインストールしているので
/var/lib/mysql にログが出力されているので確認してみます。

InnoDB: Error: data file /var/lib/mysql/ibdata1 is of a different size
InnoDB: 640 pages (rounded down to MB)
InnoDB: than specified in the .cnf file 128000 pages!
InnoDB: Could not open or create data files.
InnoDB: If you tried to add new data files, and it failed here,
InnoDB: you should now edit innodb_data_file_path in my.cnf back
InnoDB: to what it was, and remove the new ibdata files InnoDB created
InnoDB: in this failed attempt. InnoDB only wrote those files full of
InnoDB: zeros, but did not yet use them in any way. But be careful: do not
InnoDB: remove old data files which contain your precious data!

このエラーを見れば、ibdata1 のファイルサイズが異なるため、
InnnoDBがエラーになっていることがわかります。

このエラーを解消するには、MySQLのデータディレクトリからib_ で始まるファイルを
削除する必要があります。

どんなファイルがあるか確認してみます。

[root@test mysql]# ll
合計 20612
-rw-rw---- 1 mysql mysql 5242880 6月 6 16:09 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 6月 6 16:08 ib_logfile1
-rw-rw---- 1 mysql mysql 10485760 6月 6 16:09 ibdata1
drwx--x--x 2 mysql mysql 4096 6月 3 20:08 mysql
-rw-rw---- 1 mysql mysql 263 6月 3 20:57 mysql-bin.000001

ib_logfile0, ib_logfile1, ibdata1が余計なファイルなので、削除してしまいます。

rm -rf ib_logfile0
rm -rf ib_logfile1
rm -rf ibdata1

その後、再度MySQLを起動します。

/etc/init.d/mysql start

今回、2GBの固定ファイルを確保するよう設定したので、起動完了までしばらく待ちます。
サイズをもっと小さくすれば、起動はすぐに終わると思います。

Starting MySQL............................. [ OK ]
上記のように起動OKの文字が表示されましたので、再度 MySQLのデータディレクトリを確認します。
-rw-rw---- 1 mysql mysql 104857600 6月 6 16:38 ib_logfile0
 -rw-rw---- 1 mysql mysql 104857600 6月 6 16:38 ib_logfile1
-rw-rw---- 1 mysql mysql 2097152000 6月 6 16:38 ibdata1
-rw-rw---- 1 mysql mysql 10485760 6月 6 16:38 ibdata2

2GBのibdata1と10MBのibdata2ファイルが作成されており、
起動も正常にできるようになりました。


運用後にデータが増え、自動データ拡張が頻発するとパフォーマンスが悪くなります。
自動拡張が始まってしまった後は、
innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend

innodb_data_file_path = ibdata1:5000M;ibdata2:10M:autoextend
等にしてしまうと、またibdata1のサイズが異なるため、MySQLが起動しなくなります。
その際は、一度データベースのdumpを取って退避した後に、
ibで始まるファイルを削除し、my.cnfの設定変更後、MySQLを起動しdumpファイルを
インポートする作業を行う必要があります。
データベースが巨大化すればするほど、作業に時間もかかりますし、
作業リスクも多くなるので、構築段階でのサイジングはしっかり行わなければいけませんね。

※参考サイト MySQL5.1リファレンスマニュアル(Innodb設定)

この記事に関連する記事の一覧


システム開発ブログ

Twitterでilovex_officialをフォローしてください

カテゴリー

以前の部署別ブログ

ページのトップ