Oracle用にsysbenchをビルドしてハマる。¶
RHEL5.5で、Oracle 11g r2用にsysbench 0.4.12をビルドしようとしてハマったのでメモ。ハマった原因は2つ。一つは、sysbench自体のバグ。もう一つはOracle Call Interfaceを使うためのライブラリ指定。
sysbenchのバグ。¶
こっちは、すでに RHEL5.3 や Fedora8 でも昨年の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自体へのアクセス権がないことが多いので、やっぱり実行時にリンクできずにコケるので、注意するがヨロシ。
Footnotes
- 1
$ORACLE_HOMEはOracle使いには当たり前なんだろうけど、Oracleのインストールパス。ここでは、Oracle Clientなので、/opt以下にインストールしていたら、”/opt/app/oracle/product/11.2.0/client_1”になる。