Unbuntu 9.10 Server に MySQL 5.1 と InnoDB Plugin と Q4M をインストール。

MySQLはソースからではなく、aptitudeでdpkg版を入れて、それにInnoDB PluginとQ4Mをインストールする。


MySQLインストール

$ sudo aptitude install mysql-server libmysqlclient16-dev

途中でrootパスワードの設定を求められので、入力すると完了。
Ubuntu 9.10 からはMySQL 5.1が標準でインストールされる。リリースノート和訳
libmysqlclient16-devもMySQL関連の諸々をインストールしたりする際に必要なので、インストールしといた方が俄然良い。


インストールされたバージョンは5.1.37。

$ dpkg -l | grep mysql
ii  libdbd-mysql-perl                   4.011-1ubuntu1                    A Perl5 database interface to the MySQL data
ii  libmysqlclient-dev                  5.1.37-1ubuntu5                   MySQL database development files
ii  libmysqlclient16                    5.1.37-1ubuntu5                   MySQL database client library
ii  libmysqlclient16-dev                5.1.37-1ubuntu5                   MySQL database development files - empty tra
ii  mysql-client-5.1                    5.1.37-1ubuntu5                   MySQL database client binaries
ii  mysql-common                        5.1.37-1ubuntu5                   MySQL database common files (e.g. /etc/mysql
ii  mysql-server                        5.1.37-1ubuntu5                   MySQL database server (metapackage depending
ii  mysql-server-5.1                    5.1.37-1ubuntu5                   MySQL database server binaries
ii  mysql-server-core-5.1               5.1.37-1ubuntu5                   MySQL database core server files

InnoDB Plugin インストール

MySQLのバージョンが5.1.38以上であればInnoDB Pluginが同梱されているが、イントールされたのが5.1.37なので別途イントールするべし。


本家INNOBASE社のサイトに最新版(1.0.4)のMySQL 5.1.37向けのバイナリが用意されてるので、これを使う。
本家サイトのインストール手順はこちら

1. ダウンロードして、展開してコピー。

libmysqlclient16-devをインストールしてない場合は、/usr/lib/mysql/plugin/がない。

$ sudo /etc/init.d/mysql stop
$ wget http://www.innodb.com/download/innodb_plugin/innodb_plugin-1.0.4-linux-i686-glibc23.tar.gz
$ tar zxvf innodb_plugin-1.0.4-linux-i686-glibc23.tar.gz
$ cd innodb_plugin-1.0.4-linux-i686-glibc23/
$ sudo cp ha_innodb.so /usr/lib/mysql/plugin/
2. /etc/mysql/my.cnfに設定を追加。
[mysqld]
ignore_builtin_innodb
plugin_load=innodb=ha_innodb.so;innodb_trx=ha_innodb.so;innodb_locks=ha_innodb.so;innodb_lock_waits=ha_innodb.so;innodb_cmp=ha_innodb.so;innodb_cmp_reset=ha_innodb.so;innodb
_cmpmem=ha_innodb.so;innodb_cmpmem_reset=ha_innodb.so
3. mysqldを起動する。
$ sudo /etc/init.d/mysql start
4. show pluginsで確認して、ha_innodb.soが読み込まれてればOK。
$ mysql -uroot -p
Enter password:

mysql> show plugins;
+---------------------+----------+--------------------+--------------+---------+
| Name                | Status   | Type               | Library      | License |
+---------------------+----------+--------------------+--------------+---------+
| binlog              | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| partition           | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| ARCHIVE             | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| BLACKHOLE           | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| CSV                 | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| FEDERATED           | DISABLED | STORAGE ENGINE     | NULL         | GPL     | 
| MEMORY              | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| MyISAM              | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| MRG_MYISAM          | ACTIVE   | STORAGE ENGINE     | NULL         | GPL     | 
| InnoDB              | ACTIVE   | STORAGE ENGINE     | ha_innodb.so | GPL     | 
| INNODB_TRX          | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
| INNODB_LOCKS        | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
| INNODB_LOCK_WAITS   | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
| INNODB_CMP          | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
| INNODB_CMP_RESET    | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
| INNODB_CMPMEM       | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
| INNODB_CMPMEM_RESET | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so | GPL     | 
+---------------------+----------+--------------------+--------------+---------+
17 rows in set (0.00 sec)

mysql>quit;


InnoDB Plugin が如何に素晴らしいかは専門家の方々の記事を読めば一目瞭然。
Open database life: InnoDB Plugin 1.0.4 - InnoDB史上極めて重要なリリース
SSDの真の性能を引き出す MySQL 5.1.38 InnoDB Plugin - SH2の日記

注意

Ubuntu 9.10 をインストールした直後の状態だと、上記の手順通りに実行してもha_innodb.soが読み込まれない。
なぜならAppArmorが動いているから。


AppArmorを止めるか、プロファイルを追加するかという事になるわけだが、迷わず止めた。
止め方はこちら

Q4Mインストール

こちらはMySQL 5.1.37向けのバイナリはないので、最新版をソースからコンパイルする。
MySQLのソースも必要になるので、これはdpkg用のやつを使う。


本家サイトのインストール手順はこちら

1. 必要になるライブラリなどをインストール。

libssl-devはコンパイル時に、dpkg-debはソースパッケージが展開される際に必要になる。
コンパイル時に必要なg++やlibstdc++なんかも一緒にインストールされるので一石二鳥。
ちなみに、gccとかlibc6-devなんかはlibmysqlclient16-devをインストールした時に入っている。

$ sudo aptitude install libssl-dev dpkg-dev
2. ソースパッケージを取得。

ダウンロード後に展開してpatchあてまでやってくれる。
aptitudeでソースはどうやって取得するんだ?

$ cd /tmp
$ sudo apt-get source mysql-server
3. Q4Mをダウンロードして、コンパイルして、インストール

'--with-mysql'の指定だけだと、make時にヘッダが読み込めなくてエラーになるので、CPPFLAGも指定してやる。
0.8.5以降はboostのヘッダが同梱されているので、boostをインストールしなくてもコンパイル出来る。

$ wget http://q4m.31tools.com/dist/q4m-0.8.9.tar.gz
$ tar zxvf q4m-0.8.9.tar.gz
$ cd q4m-0.8.9
$ ./configure CPPFLAGS=-I/usr/include/mysql  --with-mysql=/tmp/mysql-dfsg-5.1-5.1.37
$ make
$ sudo make install
$ mysql -uroot -p -f mysql < support-files/install.sql

4. show pluginsで確認して、libqueue_engine.soが読み込まれてればOK。

InnoDB Plugin の場合と同様AppArmorが動いてると読み込まれない。

$ mysql -uroot -p
Enter password: 

mysql> show plugins;
+---------------------+----------+--------------------+--------------------+---------+
| Name                | Status   | Type               | Library            | License |
+---------------------+----------+--------------------+--------------------+---------+
| binlog              | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| partition           | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| ARCHIVE             | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| BLACKHOLE           | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| CSV                 | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| FEDERATED           | DISABLED | STORAGE ENGINE     | NULL               | GPL     | 
| MEMORY              | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| MyISAM              | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| MRG_MYISAM          | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     | 
| InnoDB              | ACTIVE   | STORAGE ENGINE     | ha_innodb.so       | GPL     | 
| INNODB_TRX          | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| INNODB_LOCKS        | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| INNODB_LOCK_WAITS   | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| INNODB_CMP          | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| INNODB_CMP_RESET    | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| INNODB_CMPMEM       | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| INNODB_CMPMEM_RESET | ACTIVE   | INFORMATION SCHEMA | ha_innodb.so       | GPL     | 
| QUEUE               | ACTIVE   | STORAGE ENGINE     | libqueue_engine.so | GPL     | 
+---------------------+----------+--------------------+--------------------+---------+
18 rows in set (0.00 sec)

mysql> quit;
5.テストも実行してみる

DBIとかDBD::mysqlはMySQLをインストールした時に、依存関係でインストールされてる。
その他のテストに必要なモジュールもdpkg版があったのでそっちをインストール。
DBI_PASSWORDにはmysqlのrootのパスワードを入れる。

$ sudo aptitude install libdata-compare-perl liblist-moreutils-perl
$ mysqladmin -uroot -p create test
$ DBI_PASSWORD='passowrd' ./run_tests.pl
t/01-base-rnd_pos.........................ok                                 
t/01-base.................................ok                                 
t/02-queue-cond...........................ok                                 
t/02-queue-owned-delete...................ok                                 
t/02-queue................................ok                                 
t/03-queue-error-wait.....................ok                                 
t/03-queue-error..........................ok                                 
t/04-blob-cond............................ok                                 
t/04-blob.................................ok                                 
t/05-multireader..........................

Multireader benchmark result:
    Number of messages: 6400
    Number of readers:  32
    Elapsed:            1.647 seconds
    Throughput:         3885.558 mess./sec.

t/05-multireader..........................ok                                 
t/05-multirw..............................ok 1/4                             

Multi-reader-writer benchmark result:
    Number of messages: 6400
    Number of readers:  32
    Elapsed:            2.315 seconds
    Throughput:         2764.806 mess./sec.

t/05-multirw..............................ok                                 
t/05-multiwait............................ok 1/4                             

Multi-reader-writer benchmark result under semi-starvation:
    Number of messages: 6400
    Number of readers:  32
    Elapsed:            2.694 seconds
    Throughput:         2375.909 mess./sec.

t/05-multiwait............................ok                                 
t/06-multi................................ok                                 
t/07-trans................................ok                                 
t/08-forward..............................ok                                 
t/09-pqueue-single-table-wake-listener....ok                                 
t/09-pqueue-single-table..................ok                                 
t/10-largedata............................skipped
        all skipped: set BIG_TESTS=1 to run theese tests
All tests successful, 1 test skipped.
Files=18, Tests=68921, 183 wallclock secs (77.56 cusr +  7.83 csys = 85.39 CPU)

$ mysqladmin -uroot -p drop test