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

>BSDSolarisでも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
らしい。
これをやったけど、やっぱり駄目だった。