InnoDBのPageサイズのお話

詳しくはMyNA(日本MySQLユーザ会)のMLにて.

行サイズの最大値についての話からInnoDBのPageサイズを変更する→ソース改変→コンパイルと膨らんで楽しすぎw

あーん、全てまとめてWikiに書いてこっちのBlogにもアップしたいけど、じかんがー.

そろそろ寝ないと明日のJBoss Clusterセミナー最終日に支障がw 英語でのセミナー受講@1日あたり6時間,これは知的体力を相当消耗するのですよ・・・.たっぷり睡眠とらないとやばい.

でもなぜか自宅鯖にSSHでつないで(ニューヨークのホテルからシアトルの自宅につないで)コンパイル中.ウヒヒ.腹減ってきたー :P

P.S.
(たぶんここは見てないとおもうけど)投稿者さん、そういえばずっと気になってるんだけど、2通目で晒したprintStackTraceに社名はいってますやん・・・.その行から上だけをこぴればいいのに :P まあそれはさておき、リコンパイルOKな姿勢がGoodJobです.



ソース修正、コンパイル、インストールは上手くいったかに見えた.

しかしmysql_install_db実行後,サーバを起動しようとすると

060216 22:33:48  mysqld started
InnoDB: Error: tablespace size must be at least 10 MB
060216 22:33:48 Can't init databases
060216 22:33:48 Aborting

060216 22:33:48  InnoDB: Warning: shutting down a not properly started
                 InnoDB: or created database!
060216 22:33:48 /home/miracle/software/mysql/compiled/libexec/mysqld: Shutdown Complete

060216 22:33:48  mysqld ended

なんかに引っかかってInnoDBが起動できない.普通はインストール直後の初回起動時にibdata1を自動的に作ってくれるんだけどな.おかしい.



追記:
元のソースに戻してリコンパイルしたら,ちゃんと初回起動時にibdata1が作成された!! MySQL 4.0.21でやっているんだけど・・・.なぜだー.

InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
060216 23:02:36  InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
060216 23:02:36  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
060216 23:02:36  InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
060216 23:02:37  InnoDB: Started
libexec/mysqld: ready for connections.
Version: '4.0.21'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

えーい

> grep -R 'The first specified data file' .
Binary file ./sql/mysqld matches
Binary file ./innobase/srv/libsrv.a matches
./innobase/srv/srv0start.c:             "InnoDB: The first specified data file %s did not exist:\n"
Binary file ./innobase/srv/srv0start.o matches
> less ./innobase/srv/srv0start.c



srv0start.cを読むと,どうもエラーメッセージ

if (sum_of_new_sizes < 640) {
	  fprintf(stderr,
	  "InnoDB: Error: tablespace size must be at least 10 MB\n");
	  return(DB_ERROR);
}

この"at least 10 MB"というのはハードコーディングされているから10MBと言っているだけで,Pageサイズを変更した場合にはそれに従って大きなデータファイルが最小限必要になるようである.

でもってデータファイルだけでなくログファイルとログバッファもそれぞれ増やす必要あり.

まあ途中から予想できた方もいるかもですが.

で,こんな感じでオプションを指定してあげれば無問題.

--innodb_data_home_dir=
--innodb_data_file_path=/foobar/ibdata1:100M:autoextend
--innodb_log_file_size=50M
--innodb_buffer_pool_size=200M

ちゃんと起動するし,Pageサイズによる1行辺りのデータ制限もちゃんとでかくなる.

やばいーもう夜中の3時になってしまう.寝ます.