Oracle 10.2.0.1 Instant Client の致命的バグ → 248日目に hang します
いきなり結論。タイトル通り Oracle 10.2.0.1 Instant Client は OS 起動後 248 日でハングします。64 bit 環境なら 198 日でハングします。したがって、Instant Client を使うサービスは全てハングします。これにより、RAC を制御する ons というサービスもハングして Oracle 10g RAC に不具合が発生します。
以下詳細。
つい最近のことですが仕事の本番 DB で障害が発生しました。Oracle 10g R2 を使っているのですが、10g R2 がリリースされた直後にいれた Oracle 10g RAC システムでバージョンは 10.2.0.1 となっていました。ある日出社してみるとOracle 10g の監視に使っている Insight Technology 社のPerformance Insight から山のような warining メールが届いていました。エラーの内容を抜粋すると、ons(Oracle Notification Service)つまりアプリケーション・サーバへの障害通知に利用するノードアプリケーションの1つが落ちているようです。
Warning Level : 2 WL=2:/db/crs/oracle/product/10.2.0/app/opmn/bin/ons -a ping (19654) :CPU使用時間 59.98sec(/60sec)
取りあえずユーザ向けのサービスが停止している様子はありません。DB サーバへ ssh してみるとロードアベレージが9くらい。CPU の使用率がおかしいです。ons が張り付いて CPU を食いつぶしています。
oracle 16150 62.9 0.0 22128 4756 ? R 03:07 281:44 /db/crs/oracle/product/10.2.0/app/opmn/bin/ons -a ping oracle 30418 62.6 0.0 22128 4752 ? R 03:16 274:41 /db/crs/oracle/product/10.2.0/app/opmn/bin/ons -a shutdown oracle 12128 61.3 0.0 22128 4752 ? R 03:25 263:35 /db/crs/oracle/product/10.2.0/app/opmn/bin/ons -a ping oracle 26423 61.0 0.0 22128 4752 ? R 03:34 256:26 /db/crs/oracle/product/10.2.0/app/opmn/bin/ons -a ping oracle 28610 61.2 0.0 22128 4752 ? R 03:35 256:30 /db/crs/oracle/product/10.2.0/app/opmn/bin/ons -a shutdown
さらに深追い。cat /crs/oracle/product/10.2.0/app/log/xxxdb02/racg/ora.xxxdb02.ons.log
すると確かに ons で TIMEOUT が発生していますが、あまり情報はありません。
2007-03-19 03:43:04.812: [ RACG][2540276992] [12123][2540276992][ora.xxxdb02.ons]: timeout: killed the spawned process 2007-03-19 03:43:04.812: [ RACG][2540276992] [12123][2540276992][ora.xxxdb02.ons]: clsrcexecut: env ORACLE_CONFIG_HOME=/db/crs/oracle/product/10.2.0/app 2007-03-19 03:43:04.812: [ RACG][2540276992] [12123][2540276992][ora.xxxdb02.ons]: clsrcexecut: cmd = /db/crs/oracle/product/10.2.0/app/bin/racgeut -e _USR_ORA_DEBUG=0 540 /db/crs/oracle/product/10.2.0/app/bin/onsctl ping 2007-03-19 03:43:04.812: [ RACG][2540276992] [12123][2540276992][ora.xxxdb02.ons]: clsrcexecut: rc = 99, time = 540.040s 2007-03-19 03:43:04.813: [ RACG][2540276992] [12123][2540276992][ora.xxxdb02.ons]: end for xxxource = ora.xxxdb02.ons, action = start, status = 1, time = 1081.080s 2007-03-19 03:44:34.929: [ RACG][2540276992] [28604][2540276992][ora.xxxdb02.ons]: onsctl: shutting down ons daemon ... timeout: killed the spawned process
さらに深追い。cat /crs/oracle/product/10.2.0/app/log/xxxdb02/crsd/crsd.log
crs のログから見ても ons が OFFLINE になった以上の情報得られず。
2007-03-19 03:25:03.661: [ CRSXXX][1566763360]0Stop of `ora.xxxdb02.ons` on member `xxxdb02` succeeded. 2007-03-19 03:25:03.661: [ CRSXXX][1566763360]0ora.xxxdb02.ons RESTART_COUNT=0 RESTART_ATTEMPTS=3 2007-03-19 03:25:03.661: [ CRSXXX][1566763360]0Restarting ora.xxxdb02.ons on xxxdb02 2007-03-19 03:25:03.666: [ CRSXXX][1566763360]0startRunnable: setting CLI values 2007-03-19 03:25:03.666: [ CRSXXX][1566763360]0Attempting to start `ora.xxxdb02.ons` on member `xxxdb02`
srvctl start nodeapps -n xxxdb02 して RAC の状態を確認。あら、確かに落ちているサービスがあります。
名前 型 ター...ト 状態 ホスト ------------------------------------------------------------ ora.xxx.db application ONLINE ONLINE xxxdb01 ora....01.inst application ONLINE ONLINE xxxdb01 ora....02.inst application ONLINE ONLINE xxxdb02 ora....xxdb.cs application ONLINE ONLINE xxxdb01 ora....x01.srv application ONLINE ONLINE xxxdb01 ora....b_bk.cs application ONLINE ONLINE xxxdb02 ora....x02.srv application ONLINE ONLINE xxxdb02 ora....01.lsnr application ONLINE ONLINE xxxdb01 ora....b01.gsd application ONLINE ONLINE xxxdb01 ora....b01.ons application ONLINE OFFLINE ora....b01.vip application ONLINE ONLINE xxxdb01 ora....02.lsnr application ONLINE ONLINE xxxdb02 ora....b02.gsd application ONLINE ONLINE xxxdb02 ora....b02.ons application ONLINE OFFLINE ora....b02.vip application ONLINE ONLINE xxxdb02
ここで保守ベンダーから有用な連絡あり。詳細は Oracle の保守契約違反になるのでネットで得られる情報レベル+実際に発生した事実にフィルタリングして情報共有すると、いきなり結論で書いたとおり Oracle 10.2.0.1 Instant Client は OS 起動後 248 日でハングします。64 bit 環境なら 198 日でハングします。patch を適用して 10.2.0.2 へ upgrade すれば問題は回避できます。patch をダウンロードするには年間何百万円もする Oracle のサポートを契約している必要があります。
ちなみに、oracle.co.jp ではトライアル版も現時点で 10.2.0.1 なので 10.2.0.2 を手に入れるにはサポートしかありません。oracle.com ではトライアル版も 10.2.0.2 がでています。
なお、client 環境であれば、無償提供されている instant client を 10.2.0.2 以上にすれば OK です。ダウンロードには OTN へのユーザ登録が必要です。
と言うわけで、Oracle 10g の 10.2.0.1 をお使いの方でインストール後 OS 再起動をかけていないって方はそろそろ同じ現象が発生する時期に来ているかと思いますので、198 日毎に OS 再起動をするか patch をあてて 10.2.0.2 へ upgrade するかの対処をとられるのがよろしいかと。
client 環境つまりアプリケーションサーバ側は複数台でロードバランスしている場合が多いかと思いますので instant client を最新の 10.2.0.3 へ upgrade するのは比較的簡単かと思います。おそらく、DBD::Oracle とかもライブラリのリンクのし直しが必要なので再コンパイルしないとダメかと思います。※ここ、まだ未検証だけど近々実施。
10g RAC の upgrade は patch あてる際には全てのノードを停止して patch あてるのが推奨されているのでデータベース停止を伴うこととなりなかなか実施しづらいところですね。
ネットでは同様の情報がここらへんで手に入ります。
- 積み重ねた日々 - Oracle Instant Client 10.2.0.1を利用した場合、突然DBへ接続ができなくなる現象
- SQL*Plus 10.2.0.1.0 does not work on ...
- FreeLists / oracle-l / RE: SQL*Plus With Instant Client 10.2.0.1 Hangs, When System Uptime Is More Than 248 Days
- Oracle 10.2.0.1 Instant Client hanging?
- Oracle10g issue - times() call fails
ところで、この 248 日問題。過去のバージョンでも度々発生しています。たとえば、SUMMARY: oracle hang なんかでもスレッドがたっていますが、8.1.7 とかでは database 本体に同様のバグがあったようです。
普段安定して動作している分だけ、いきなりこの手の不具合で障害が発生するとかなりビビリますよ。ホント頼みますわ Oracle さん。
コメントやシェアをお願いします!
SH2
timesシステムコールの仕様によるみたいなので
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/times.2.html
Linuxの場合、時限爆弾の設定値は
Kernel2.4:248日
Kernel2.6:198日
になるそうです。