Oracle XE
FreeBSD 5.3 に Oracle XE を入れようとしたが、うまくいかない。
基本的に↓ここを参考に。
http://www5f.biglobe.ne.jp/~sempreff/note/FreeBSD/OracleXE.html
パッチを3つともあててカーネルリビルド&再起動、rpm でインストールまでは問題なくいった。
しかし Oracle 起動スクリプト oraclexe.sh の
su -s $ORACLE_OWNER -c "$LSNR start"
の部分で
TNS-01189: The listener could not authenticate the user
というエラーが出てしまう。
そこでこのパッチもあてた。
http://www.freebsd.org/cgi/query-pr.cgi?pr=102956
するとさっきの部分は
(略) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production Start Date 22-FEB-2007 02:40:25 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Default Service XE Listener Parameter File /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/ Listener Log File /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/li Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxx.home.jp)(PORT=1521))) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully
てな感じで起動するようになった。
しかし oraclexe.sh の次の行:
su -s $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" > /dev/null 2>&1
が
ORA-03113: end-of-file on communication channel
というエラーになってしまう。
ORA-03113 はクライアントがリスナーに接続できないときいつも出るエラーで、ここから原因を特定するのは難しいらしい。
お手上げっぽい。
[追記:2007-02-25]
起動スクリプトの "lsnrctl start" の直後あたりで /var/log/messages に次のようなログが発生している。
Feb 24 20:54:20 XXX kernel: pid 1432 (oracle), uid 1002: exited on signal 6 (core dumped)
実行ファイル oracle が abort しているよう。
それから、adapters というのを使ってみたら、こんな出力になった:
$ ./adapters ./oracle Oracle Net transport protocols linked with ./oracle are: Oracle Net naming methods linked with ./oracle are: Oracle Advanced Security options linked with ./oracle are:
これはいいのかなぁ?
[追記:2007-03-23]
Linux バイナリに truss は通用しないけど ktrace/kdump はできるようだ。
まず、oracle が abort() しているのはここ。
7714 6370 oracle CALL kill(0x18e2,0x6) 7715 6370 oracle RET kill 0
そこから少しさかのぼって行くと SEGV との文字が。core ファイルが作られているのもわかる。
7692 6370 oracle NAMI "/compat/linux/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/dbs" 7693 6370 oracle RET chdir 0 7694 6370 oracle CALL getpid 7695 6370 oracle RET getpid 6370/0x18e2 7696 6370 oracle CALL getppid(0x4cd800c8,0x1e8) 7697 6370 oracle NAMI "core_6370" 7698 6370 oracle RET getppid 0 7699 6370 oracle CALL chdir(0x4cd800c8) 7700 6370 oracle NAMI "core_6370" 7701 6370 oracle RET chdir 0 7702 6370 oracle CALL link(0xbe4581c,0x4cd7fec4) 7703 6370 oracle NAMI "core" 7704 6370 oracle RET link JUSTRETURN 7705 6370 oracle PSIG SIGSEGV caught handler=0x4cb1a564 mask=0xae7ef217 code=0xc
さらにさかのぼっていくと SEGV が5、6回出てきて、さらに SIGSYS まで見つかる。
SIGSYS は存在しないシステムコールを呼んだときに現れるシグナルらしい。
7616 6370 oracle CALL #245 7617 6370 oracle RET #245 -1 errno -38 Unknown error: -38 7618 6370 oracle PSIG SIGSYS caught handler=0x4cb1a564 mask=0x80000000 code=0x0
これはまずいようですな。
/usr/src/sys/kern/init_sysent.c, Linux システムコールの /usr/src/sys/i386/linux/linux_syscall.h どちらにも 245 番はなかった。
CVSWeb にある同ファイルの最新版にもないみたいだ。
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/init_sysent.c?rev=1.228;content-type=text%2Fplain
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/i386/linux/linux_syscall.h?rev=1.84;content-type=text%2Fplain
Linux システムコールの 245 番は sys_io_setup io_setup とのこと。
http://hira.main.jp/wiki/pukiwiki.php?%A5%B7%A5%B9%A5%C6%A5%E0%A5%B3%A1%BC%A5%EB%B0%EC%CD%F7%2Flinux2.6
sys_io_setup は aio.c で定義されていると。
http://www.gelato.unsw.edu.au/lxr/ident?i=sys_io_setup
そういえば ports から linux-libaio というのを入れたっけ。
$ pkg_info|grep linux-libaio linux-libaio-0.3.104.2 Linux-native asynchronous I/O access library, Linux binary $ ls -l /compat/linux/usr/lib/*aio* lrwxrwxrwx 1 root wheel 15 2 21 23:41 /compat/linux/usr/lib/libaio.so.1@ -> libaio.so.1.0.1 -rwxr-xr-x 1 root wheel 2588 2 21 23:41 /compat/linux/usr/lib/libaio.so.1.0.0* -rwxr-xr-x 1 root wheel 2584 2 21 23:41 /compat/linux/usr/lib/libaio.so.1.0.1*
確かに入っている。
しかし元のメールを見ると libaio-0.3.104-2.i386.rpm を探してきて入れろと書いてある。
http://lists.freebsd.org/pipermail/freebsd-emulation/2006-June/002257.html
rpmfind からもってきて展開してみたら ports のやつと寸分違わず同じだった。
今日はここまで。
[追記:2007-03-24]
今まで FreeBSD 標準の kdump を使っていたけど、Linux バイナリから作った ktrace.out のダンプ用には /usr/ports/devel/linux_kdump というのがあるらしい。
これは ports からは
===> linux_kdump-1.5_2 does not build with the default linux base, use the package instead. *** Error code 1
とか言われてインストールできなかったので、package からインストール。
使ってみると、今まで
6796 sqlplus CALL openbsd_poll(0)
と表示されていたところが次のように。
6796 sqlplus CALL exit_group(0)
ちゃんと Linux のシステムコール名を表示してくれる模様。
で、linux_kdump でとったダンプを見てみると、SIGSYS が発生しているところは同じだった。ただ、errno がちゃんと表示されている。
6797 oracle CALL #245 6797 oracle RET #245 -1 errno 38 Socket operation on non-socket 6797 oracle PSIG SIGSYS caught handler=0x4cb1a564 mask=0x80000000 code=0x0
でも Linux の errno 38 は ENOSYS (Function not implemented)で、ENOTSOCK は88らしいんだよなあ。
http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html
ダンプ内を errno で検索してみると、もう1箇所発生箇所があった。
6796 sqlplus CALL linux_socketcall(0x7,0xbfbf5658) 6796 sqlplus RET linux_socketcall -1 errno 107 Unknown error: 107
107 は ENOTCONN (Transport endpoint is not connected)らしい。
FreeBSD の /usr/include/errno.h には 107 番は無いことから、linux_kdump は errno に対応するエラー名を FreeBSD の errno.h から取得しているのか?
1個目の errno の付近を見ると、linux_socketcall を何度も呼び出している。2,6,7,f,f ということは、bind, getsockname, getpeername, getsockopt, getsockopt を順に呼んでいる。で、connect されていないから getpeername が失敗しているよう。
http://www.skyfree.org/linux/kernel_network/socket.html
6796 sqlplus CALL linux_socketcall(0x2,0xbfbf5658) 6796 sqlplus RET linux_socketcall 0 6796 sqlplus CALL linux_socketcall(0x6,0xbfbf5658) 6796 sqlplus RET linux_socketcall 0 6796 sqlplus CALL linux_socketcall(0x7,0xbfbf5658) 6796 sqlplus RET linux_socketcall -1 errno 107 Unknown error: 107 6796 sqlplus CALL linux_socketcall(0xf,0xbfbf56f0) 6796 sqlplus RET linux_socketcall 0 6796 sqlplus CALL linux_socketcall(0xf,0xbfbf56f0) 6796 sqlplus RET linux_socketcall 0
ENOTCONN ということは oracle のバグということで本件はクローズしてよい?
http://www.wlug.org.nz/ENOTCONN
[さらに追記]
linux_socketcall の ENOTCONN は致命的ではないのかもしれない。
問題は、startdb.sql の startup コマンドにより実行されるコードの中の SIGSYS である。"FreeBSD io_setup"でぐぐってみたらこんなのが:
http://www.archivesat.com/Development_of_Emulators_of_other_operating_systems/thread1269598.htm
やはり現時点ではこのシステムコールが実装されていないから Oracle 10g は動かないのか。
このパッチを 5.3 に組み込む方向でトライしてみる…と思ったけど極めて困難な感じ。
http://lists.freebsd.org/mailman/htdig/freebsd-database/2005-May/000295.html
[追記:2007-03-25]
filesystemio_options="DirectIO" と書けば非同期IOを使わないようにできるらしいので、 startdb.sqlの中を
startup open pfile=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/dbs/init.ora
のように変えて、init.ora を
--- init.ora.orig Sun Mar 25 00:34:01 2007 +++ init.ora Sun Mar 25 01:59:04 2007 @@ -89,9 +89,10 @@ # db_block_buffers = 550 # MEDIUM # db_block_buffers = 3200 # LARGE -shared_pool_size = 3500000 # SMALL +#shared_pool_size = 3500000 # SMALL # shared_pool_size = 5000000 # MEDIUM # shared_pool_size = 9000000 # LARGE +shared_pool_size = 65198988 log_checkpoint_interval = 10000 @@ -172,3 +173,5 @@ # actions if you later decide to move back to 8.0. #compatible = 8.1.0 + +filesystemio_options="DirectIO"
と変えてみた。すると今度は次のエラーが出るようになった。
"ORA-00600: internal error code, arguments: [kcbbnwa_1], [0], [0], , , , , \
というエラーが。
"ORA-00600 kcbbnwa_1"でググったらこれが見つかった:
http://www.freebsd.org/cgi/query-pr.cgi?pr=75848&cat=
5.3 には適用されていなかったので、適用。またカーネルリビルド。
このエラーは出なくなったけど、やはり SIGSYS 245 で落ちてしまう。
[追記:2007-03-26]
276 From:login:Penguin Date:2006/11/30(木) 22:48:33 id:pZIv/r/7 Mail:sage
>>275
>BSDやSolarisでもLinuxバイナリはそのまま使えんからラッパーみたいなのかますし。
その "BSD" が何なのかはわからないが、FreeBSD ではそのまま使えるけど。
Linux互換機能の実装はラッパーでもエミュレータでもない。
現に FreeBSD で 10g XE がさくさく動いているよ。
http://pc11.2ch.net/test/read.cgi/linux/1016806075/
その FreeBSD がバージョンいくつなのかはわからないが、さくさく動く場合もあるらしい。
[追記:2007-04-06]
非同期IOを無効化するオプションは「filesystemio_options」でなくて
disk_asynch_io=false
らしい。
これをやったけど、やっぱり駄目だった。