Oracle用にsysbenchをビルドしてハマる。

RHEL5.5で、Oracle 11g r2用にsysbench 0.4.12をビルドしようとしてハマったのでメモ。ハマった原因は2つ。一つは、sysbench自体のバグ。もう一つはOracle Call Interfaceを使うためのライブラリ指定。

sysbenchのバグ。

こっちは、すでに RHEL5.3Fedora8 でも昨年の4月、7月にバグ報告されているのだがまだ修正されていない。原因は./configureを実行してMakefileを作成する際にソースツリーにAUTHORSファイルとNEWSファイルが無いため、引数チェックに記述されている文字”X”がlibtoolスクリプト用のオプションと連結された変なlibtoolスクリプトが作成されるため。なので、makeを実行すると、

../libtool: line 838: X--tag=CC: command not found
../libtool: line 871: libtool: ignoring unknown tag : command not found
../libtool: line 838: X--mode=link: command not found
../libtool: line 1004: *** Warning: inferring the mode of operation is deprecated.: command not found
../libtool: line 1005: *** Future versions of Libtool will require --mode=MODE be specified.: command not found
../libtool: line 2231: X-g: command not found
../libtool: line 2231: X-O2: command not found
../libtool: line 2231: X-rdynamic: command not found
../libtool: line 1951: X-L/usr/lib/mysql: No such file or directory
../libtool: line 2400: Xsysbench: command not found
X: user not authorized to run the X server, aborting.
../libtool: line 2412: Xsysbench: command not found
../libtool: line 2420: mkdir /.libs: No such file or directory
mkdir: cannot create directory `/.libs': Permission denied
make[2]: *** [sysbench] エラー 1
make[2]: ディレクトリ `/home/user/tmp/sysbench-0.4.12/sysbench' から出ます
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ `/home/user/tmp/sysbench-0.4.12/sysbench' から出ます
make: *** [all-recursive] エラー 1
../libtool: line 838: X--tag=CC: command not found

のような形でエラーになってしまう。これはDebianでも同じ。これは、AUTHORS, NEWSファイルを作成し、下記の手順を実行してやれば回避できる。

$ touch AUTHORS NEWS
$ autoreconf -ifv

または

$ libtoolize --force --copy
$ aclocal
$ autoconf
$ touch AUTHORS NEWS
$ automake

なのでDebianのソースパッケージではちゃんとAUTHORS, NEWSファイルが作成されている。Upstreamにフィードバックしてないとは考えにくいのと、昨年のバグが放置されているところを見ると、sysbench自体の開発が止まっているんだろうかねぇ…。

Oracle Call Interfaceを使うためのライブラリ指定。

sysbenchはもともとMySQL用だが、PostgreSQLやOracle用にもOLTPのベンチマークに使える。Oracleで使うためには、Oracle Call Interfaceを使う必要があるのだが、sysbench自体にはMySQL以外のビルド方法についてはちゃんとドキュメント揃っていない。ググってみると、

$ ./configure --without-mysql --with-oracle
$ make
# make install

で行ける、となっているのが多いのだが、実際のところはこのままではビルドできず、もうちょっとgccやlink用のオプション指定が必要だったりする。んで、どうすれば良いかというと、以下のように環境変数指定する。 [1]

export CFLAGS="-I${ORACLE_HOME}/rdbms/public"
export CXXFLAGS="$CFLAGS"
export LDFLAGS=-L${ORACLE_HOME}/lib
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib

LDFLAGSで無くても良いんだけど、-Lでライブラリのパスを指定になかなか気づかなくて四苦八苦した。orz

なので、こんなスクリプトを書いて、展開したソースツリー内で実行すればビルドできる。

#!/bin/bash

export ORACLE_HOME=<your oracle client path>
export CFLAGS="-I${ORACLE_HOME}/rdbms/public"
export CXXFLAGS="$CFLAGS"
export LDFLAGS=-L${ORACLE_HOME}/lib
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib

libtoolize --force --copy
aclocal
autoconf
touch AUTHORS NEWS
automake

./configure --without-mysql --with-oracle
make
make check

ビルドしたら、make installでインストールしておこう。

環境変数LD_LIBRARY_PATHは必要か?

環境変数LD_LIBRARY_PATHは指定しないでもビルドはできるが、makeの最後にlinkを実行するので、設定していないと、Oracleのライブラリとリンクできなくてそこでコケる。また、sysbenchを実行するユーザにはLD_LIBRACY_PATHを設定してやっていないと、make install後にsysbench自体はパスが通っていても、実行時にリンクできないのでまたまたコケる。ほんでまた、Oracleのインストールパスは、oracleユーザのホームディレクトリにインストールしていたりすると、~oracle/app/oracle/product/11.2.0/client_1自体へのアクセス権がないことが多いので、やっぱり実行時にリンクできずにコケるので、注意するがヨロシ。

[1]$ORACLE_HOMEはOracle使いには当たり前なんだろうけど、Oracleのインストールパス。ここでは、Oracle Clientなので、/opt以下にインストールしていたら、”/opt/app/oracle/product/11.2.0/client_1”になる。