« Leopard de Oracle10g R2 (Intel x86-64) #4 (Companion CD installation) | トップページ | Leopard de Oracle10g R2 (Intel x86-64) #6 (onsがバグっている?件..) »

2009年4月18日 (土)

Leopard de Oracle10g R2 (Intel x86-64) #5 (dbstart and dbshut does not work!! But....)

Leopard de Oracle10g R2の続きです。
Companion CDのプロダクトもインストールしましたので、今回はOracle10g R2 for MacOSX Server (Intel x86-64)を自動起動、自動停止するよう設定してみます。

Tiger以降のMacOSXではSystemStarterによる自動起動からLaunchDaemonによる起動が推奨されるようにはなったのですがOracle10g R2 for MacOSX Srever (Intel x86-64)のマニュアルにはlaunchd.plistの例が全く記載されていないのでLaunchDaemonによる起動、停止はひとまずお預け。(後で実験はしますけどね。)
LeopardでもStartupItemsフォルダへ自動実行するスクリプトを配置しておけばSystemStarterLaunchdから呼び出されるので、昔ながらの方法で自動起動、停止、再起動するよう設定してみることに。。


Panther de Oracle10g R1 (PowerPC)で使っていた起動用のshellとStartupParameters.plistをベースに環境変数等を書き換えただけでは動作しない。
Oracle10g R1 10.1.0.3.0までは、リスナーの起動及び停止は$ORACLE_HOME/bin/dbstart又は、dbshut内で行われていなかったが、Oracle10g R2以降のdbstart/dbshutでは、lsnrctlにより起動/停止されるようになっている。
また、$ORACLE_HOMEをパラメータして渡すよう変更されている。

Oracle10g R2向けのスクリプトへ変更を加えないまま流用したらどうなるか?、、とりあえずPanther de Oracle10g R1(PowerPC)で試した際に動作していた起動用shellとStartupParameters.plistを環境変数だけを書き換えて実行した場合、どのような状況になるか確認しておく。(結果からお伝えしておくと、does not workなのは明白なのですが、どのようなエラーになるか知っておくとためになるでしょうから。)



以下に、Panther de Oracle10g R1で使ったStartupItems用のshellスクリプトとStartupParameters.plistを”単純に”パス等を書き換え、dbstart/dbshut内で実行されるリスナー起動部分を削除、onsctl(今回は起動しておかなくてもリスナーがハングしなくなった。というかonsはちゃんと動作しない。詳細は後日)、oem及び、isqlplusの起動部分を削除した。(エラーになるのでマネしないでね。どんなエラーになるか知りたいだけなので)

guppy:˜ discus$ cat /Library/StartupItems/Oracle/Oracle
#!/bin/bash
# define globally used paths/variables
PATH=/bin:/sbin:/usr/bin:/usr/sbin

TEMP=/tmp
TMPDIR=/tmp

ORACLE_BASE=/Users/shared/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1
ORACLE_SID= leopard1
NLS_LANG=Japanese_Japan.AL32UTF8
DYLD_LIBRARY_PATH=/usr/X11R/lib:$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:$DYLD_LIBRARY_PATH
PATH=$ORACLE_HOME/bin:/usr/X11R/bin:$PATH
ORACLE_OWNER_PATH=/Users/oracle
ORACLE_OWNER=oracle
TERM=vt100

export PATH ORACLE_BASE ORACLE_HOME ORACLE_OWNER ORACLE_OWNER_PATH ORACLE_SID DYLD_LIBRARY_PATH
export TERM NLS_LANG

# debug
echo '****************************'
echo ' env for Oracle'
echo '****************************'
env

echo ''
echo '*************************************'
echo ' hard and soft shell resource limits'
echo '*************************************'
echo 'Hard / Soft limit:'
launchctl limit

# get common system config setting
. /etc/rc.common

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo 'Oracle startup : cannot start'
echo ' (cannot find one or both of dbstart or $ORACLE_HOME)'
exit
fi

StartService ()
{
ConsoleMessage 'Starting Oracle database...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart"
ConsoleMessage 'Started Oracle database'
}

StopService ()
{
ConsoleMessage 'Stopping Oracle Database...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut"
ConsoleMessage 'Stopped Oracle Database.'

ConsoleMessage 'Stopping TNS Listener...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop"
ConsoleMessage 'Stopped TNS Listener.'
}


RestartService ()
{
ConsoleMessage 'Stopping Oracle Database...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut"
ConsoleMessage 'Stopped Oracle Database.'

ConsoleMessage 'Stopping TNS Listener...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop"
ConsoleMessage 'Stopped TNS Listener.'

ConsoleMessage 'Starting TNS Listener...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl start"
ConsoleMessage 'Started TNS Listener.'

ConsoleMessage 'Starting Oracle database...'
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart"
ConsoleMessage 'Started Oracle database'
}

RunService "$1"

guppy:˜ discus$
guppy:˜ discus$ cat /Library/StartupItems/Oracle/StartupParameters.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>Oracle10g 10.2.0.4.0 Database Server</string>
<key>OrderPreference</key>
<string>Late</string>
<key>Provides</key>
<array>
<string>Oracle10g 10.2.0.4.0 Database</string>
</array>
<key>Requires</key>
<array>
<string>Disks</string>
</array>
<key>Uses</key>
<array>
<string>Disksv/string>
<string>Network</string>
<string>NFS</string>
</array>
</dict>
</plist>
guppy:˜ discus$
guppy:˜ discus$


4

上記をテスト実行してみると・・・・
以下のようなerrorになり動作しない。

errorの原因は複数あるようで、1つはConsoleMessageがshでしか認識されていないこと、dbstart及びdbshutの実行時$ORACLE_HOMEを引数として渡さないといけないこと、それとdbstart及びdbshut自体がバグっていることが原因。
特にOracle10g R1のdbstart/dbshutとOracle10g R2のdbstart/dbshutが異なっているのでOracle10g R1の頃のスクリプトはそのままでは使えない。
そのような状態でLeopardのSystemStarterで実行しようとすると以下のようなエラーでまくりでとなる訳です。(><)

この場合、特徴的なエラーメッセージがあるので、そのポイントを赤太字で強調しておいたので注意深くご覧ください。

guppy::˜ discus$ sudo /sbin/SystemStarter -nd start "Oracle10g 10.2.0.4.0 Database"
SystemStarter[2256]: Found item: HP IO
SystemStarter[2256]: Found item: HP Trap Monitor
SystemStarter[2256]: Uses: Evaluating HP IO
SystemStarter[2256]: Uses: Keeping HP IO
SystemStarter[2256]: Found item: IntegoCommon
・・・・中略・・・・
SystemStarter[2256]: Running command (2257): /Library/StartupItems/Oracle/Oracle start
・・・・中略・・・・
*************************************
hard and soft shell resource limits
*************************************
Soft / Hard limit:
cpu unlimited unlimited
filesize unlimited unlimited
data 6291456 unlimited
stack 8388608 67104768
core 0 unlimited
rss unlimited unlimited
memlock unlimited unlimited
maxproc 2068 2068
maxfiles 65536 65536
/Library/StartupItems/Oracle/Oracle: line 46: ConsoleMessage: command not found
dyld: Library not loaded: /b/227/network/lib/libnnz10.dylib
Referenced from: /Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1/bin/lsnrctl
Reason: image not found
/Library/StartupItems/Oracle/Oracle: line 48: ConsoleMessage: command not found
/Library/StartupItems/Oracle/Oracle: line 50: ConsoleMessage: command not found
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
Usage: /Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1/bin/dbstart ORACLE_HOME
Processing Database instance "leopard1": log file /Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1/startup.log
/Library/StartupItems/Oracle/Oracle: line 52: ConsoleMessage: command not found
SystemStarter[2256]: Oracle10g 10.2.0.4.0 Database Server (2257) did not complete successfully
SystemStarter[2256]: none left
SystemStarter[2256]: The following StartupItems failed to properly start:
SystemStarter[2256]: /Library/StartupItems/Oracle
SystemStarter[2256]: - execution of Startup script failed
guppy:˜ discus$

上記のConsoleMessage: command not foundについてはスクリプトをbashではなくshで実行するようにすれば解決できる。
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listenerについては、dbstart及び、dbshutの実行時に$ORACLE_HOME環境変数を引数として渡してやれば解決できる。
最後に一番問題なのは
dyld: Library not loaded: /b/227/network/lib/libnnz10.dylib部分。この問題の解決方法はオラクルが提供しているdbstart/dbshutの問題部分(後述)を修正するか、
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart"su $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart"のように-lオプションなしのsuコマンドで起動(USの方で-lオプション無しのsuコマンドで回避した方がいる模様。)するしか手っ取り早く解決する方法はなさそう。

他にあるというツッコミ大歓迎です。m(_ _)m

ということで前述の問題点を変更した自動起動/停止スクリプトを以下に示します。
尚、dbstartとdbshutはdiffによる差分のみ示しておきますね。(そのほうが分かり易いでしょうから。)

・まずStartupItemsに配置するOracle起動/停止/再起動スクリプト
以前のスクリプトを変更した部分は赤字太文字にしてあります。(削除部分除く)

guppy:˜ discus$ cat  /Library/StartupItems/oracle/oracle
#!/bin/sh
# define globally used paths/variables
PATH=/bin:/sbin:/usr/bin:/usr/sbin

TEMP=/tmp
TMPDIR=/tmp

ORACLE_BASE=/Users/shared/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1
ORACLE_OWNER=oracle
export PATH ORACLE_BASE ORACLE_HOME ORACLE_OWNER

# debug
echo '****************************'
echo ' env for Oracle'
echo '****************************'
env

echo ''
echo '*************************************'
echo ' hard and soft shell resource limits'
echo '*************************************'
echo 'Soft / Hard limit:'
launchctl limit

# get common system config setting
. /etc/rc.common

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo 'Oracle startup : cannot start'
echo ' (cannot find one or both of dbstart or $ORACLE_HOME)'
exit
fi

StartService ()
{
ConsoleMessage "Starting Oracle database..."
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
ConsoleMessage "Started Oracle database."
}

StopService ()
{
ConsoleMessage "Stopping Oracle Database..."
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
ConsoleMessage "Stopped Oracle Database."
}


RestartService ()
{
ConsoleMessage "Stopping Oracle Database..."
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
ConsoleMessage "Stopped Oracle Database."

ConsoleMessage "Starting Oracle database..."
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
ConsoleMessage "Started Oracle database"
}

RunService "$1"
guppy:˜ discus$


・StartupItemsに配置するStartupParameters.plistは前のままで変更なし。

guppy:˜ discus$ cat /Library/StartupItems/Oracle/StartupParameters.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>Oracle10g 10.2.0.4.0 Database Server</string>
<key>OrderPreference</key>
<string>Late</string>
<key>Provides</key>
<array>
<string>Oracle10g 10.2.0.4.0 Database</string>
</array>
<key>Requires</key>
<array>
<string>Disks</string>
</array>
<key>Uses</key>
<array>
<string>Disksv/string>
<string>Network</string>
<string>NFS</string>
</array>
</dict>
</plist>
guppy:˜ discus$


そして最後に一番重要なdbstartとdbshutの変更というか修正と...

MacOSXではLD_LIBRARY_PATHではなくDYLD_LIBRARY_PATH環境変数なので(Oracleさん修正宜しくね。;)
それも合わせて修正してあります。LD_LIBRARY_PATHを使っているのはバグでしょう。:)
以下、変更前のdbstartと変更後のdbstartと変更前のdbshutと変更後のdbshutのdiffです。

Oracle10g R2向け環境変数一覧(全プラットフォーム分)のマニュアルはこちら。

尚、Oracle10g release2 10.2.0.4.0 for MacOSX Server(Intelx86-64)のdbstart及びdbshutは$ORACLE_HOME/bin以下にあります。(書く必要はないと思いますが・・)

guppy:˜ oracle$ diff $ORACLE_HOME/bin/dbstart.org $ORACLE_HOME/bin/dbstart

86c86
< SAVE_LLP=$LD_LIBRARY_PATH
---
> #SAVE_LLP=$LD_LIBRARY_PATH
89a90
> DYLD_LIBRARY_PATH=$ORACLE_HOME_LISTNER/lib; export DYLD_LIBRARY_PATH
147c148
< LD_LIBRARY_PATH=${SAVE_LLP}:${ORACLE_HOME}/lib ; export LD_LIBRARY_PATH
---
> #LD_LIBRARY_PATH=${SAVE_LLP}:${ORACLE_HOME}/lib ; export LD_LIBRARY_PATH
guppy:˜ oracle$
guppy:˜ oracle$
guppy:˜ oracle$
guppy:˜ oracle$ diff $ORACLE_HOME/bin/dbshut.org $ORACLE_HOME/bin/dbshut
75c75
< SAVE_LLP=$LD_LIBRARY_PATH
---
> #SAVE_LLP=$LD_LIBRARY_PATH
78a79
> DYLD_LIBRARY_PATH=$ORACLE_HOME_LISTNER/lib; export DYLD_LIBRARY_PATH
117c118
< LD_LIBRARY_PATH=${SAVE_LLP}:${ORACLE_HOME}/lib ; export LD_LIBRARY_PATH
---
> # LD_LIBRARY_PATH=${SAVE_LLP}/:${ORACLE_HOME}/lib ; export LD_LIBRARY_PATH
guppy:˜ oracle$

さて、お待たせしました。上記変更したスクリプトとplistで起動/停止の動作確認です。以下のように問題なく起動するようになります。ニッコリ :)
まずは起動から。

guppy:˜ discus$ 
guppy:˜ discus$ sudo /sbin/SystemStarter -nd start "Oracle10g 10.2.0.4.0 Database"
SystemStarter[11715]: Found item: HP IO
SystemStarter[11715]: Found item: HP Trap Monitor
SystemStarter[11715]: Uses: Evaluating HP IO
SystemStarter[11715]: Uses: Keeping HP IO
・・・・中略・・・・
SystemStarter[11715]: Running command (11716): /Library/StartupItems/Oracle/Oracle start
****************************
env for Oracle
****************************
SHELL=/bin/bash
TERM=xterm-color
ORACLE_OWNER=oracle
USER=root
・・・・中略・・・・
ORACLE_HOME=/Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1
・・・・中略・・・・
*************************************
hard and soft shell resource limits
*************************************
Soft / Hard limit:
cpu unlimited unlimited
filesize unlimited unlimited
data 6291456 unlimited
stack 8388608 67104768
core 0 unlimited
rss unlimited unlimited
memlock unlimited unlimited
maxproc 2068 2068
maxfiles 65536 65536
Starting Oracle database...
Processing Database instance "leopard1": log file /Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1/startup.log
SystemStarter[11715]: Waiting for Oracle10g 10.2.0.4.0 Database Server
SystemStarter[11715]: Waiting for Oracle10g 10.2.0.4.0 Database Server
SystemStarter[11715]: Waiting for Oracle10g 10.2.0.4.0 Database Server
Started Oracle database.
SystemStarter[11715]: Finished Oracle10g 10.2.0.4.0 Database Server (11716)
SystemStarter[11715]: none left
guppy:˜ discus$
guppy:˜ discus$ ps -axc | grep tnslsnr
11728 ?? 0:00.03 tnslsnr
guppy:˜ discus$ ps -ax | grep ora_
11820 ?? 0:00.05 ora_pmon_leopard1
11822 ?? 0:00.04 ora_psp0_leopard1
11824 ?? 0:00.13 ora_mman_leopard1
11826 ?? 0:00.05 ora_dbw0_leopard1
11828 ?? 0:00.07 ora_lgwr_leopard1
11830 ?? 0:00.10 ora_ckpt_leopard1
11832 ?? 0:00.40 ora_smon_leopard1
11834 ?? 0:00.06 ora_reco_leopard1
11836 ?? 0:01.33 ora_cjq0_leopard1
11838 ?? 0:00.92 ora_mmon_leopard1
11840 ?? 0:00.07 ora_mmnl_leopard1
11842 ?? 0:00.02 ora_d000_leopard1
11844 ?? 0:00.02 ora_s000_leopard1
11848 ?? 0:00.03 ora_qmnc_leopard1
11918 ?? 0:00.03 ora_q000_leopard1
11924 ?? 0:00.03 ora_q001_leopard1
11931 ttys000 0:00.00 grep ora_
guppy:˜ discus$

次は停止。ところでLeopardのSystemStarterコマンドって-nオプション付けてもスクリプト実行しちゃうのね。今気付いた。www (^^;;;

guppy:˜ discus$ sudo /sbin/SystemStarter -nd stop "Oracle10g 10.2.0.4.0 Database"
・・・・中略・・・・
SystemStarter[11933]: Found item: Oracle
SystemStarter[11933]: Requires: Evaluating Disks
SystemStarter[11933]: Uses: Evaluating Disks
SystemStarter[11933]: Uses: Evaluating Network
SystemStarter[11933]: Checking Oracle10g 10.2.0.4.0 Database Server
・・・・中略・・・・
SystemStarter[11933]: Running command (11934): /Library/StartupItems/Oracle/Oracle stop
・・・・中略・・・・
Stopping Oracle Database...
Processing Database instance "leopard1": log file /Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1/shutdown.log
SystemStarter[11933]: Waiting for Oracle10g 10.2.0.4.0 Database Server
SystemStarter[11933]: Waiting for Oracle10g 10.2.0.4.0 Database Server
Stopped Oracle Database.
SystemStarter[11933]: Finished Oracle10g 10.2.0.4.0 Database Server (11934)
SystemStarter[11933]: none left
guppy:˜ discus$ ps -axc | grep tnslsnr
guppy:˜ discus$ ps -ax | grep ora_
12057 ttys000 0:00.00 grep ora_
guppy:˜ discus$

最後に、Pantherの頃だったか自動起動はするものの自動停止時にスクリプトが実行されていないという問題があったが、LeopardのSystemStarterでは解決しているようでOSの停止時にしっかり自動停止されていることが確認できた。以下、コンソールログとshutdown.log(自動停止時に記録するようになっているログファイル)


3


コンソールログ

4/18/09 1:20:03 AM com.apple.SystemStarter[25]  env for Oracle 
4/18/09 1:20:03 AM com.apple.SystemStarter[25] ORACLE_OWNER=oracle
4/18/09 1:20:03 AM com.apple.SystemStarter[25] ORACLE_BASE=/Users/shared/u01/app/oracle
4/18/09 1:20:03 AM com.apple.SystemStarter[25] ORACLE_HOME=/Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1
4/18/09 1:20:03 AM com.apple.SystemStarter[25] Stopping Oracle Database...
4/18/09 1:20:03 AM com.apple.SystemStarter[25] Processing Database instance "leopard1":
log file /Users/shared/u01/app/oracle/oracle/product/10.2.0/db_1/shutdown.log
4/18/09 1:20:12 AM com.apple.SystemStarter[25] Stopped Oracle Database.

shutdown.logファイルの内容

SQL*Plus: Release 10.2.0.4.0 - Production on Sat Apr 18 01:20:03 2009

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

> Connected.
SYS> Database closed.
Database dismounted.
ORACLE instance shut down.
SYS> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Database instance "leopard1" shut down.


今日はこれまで。次回は、え〜〜〜〜!!! onsがバグってる?! というお話




バックナンバー

Oracle10g R2 for MacOSX (Intel x86-64) released !!!
Leopard de Oracle10g release 2 (Intel x86-64)
Leopard de Oracle10g R2 (Intel x86-64) #1
Leopard de Oracle10g R2 (Intel x86-64) #2
Leopard de Oracle10g R2 (Intel x86-64) #3 (ちょいと寄り道)
Leopard de Oracle10g R2 (Intel x86-64) #4 (Companion CD installation)

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/106341/44712123

この記事へのトラックバック一覧です: Leopard de Oracle10g R2 (Intel x86-64) #5 (dbstart and dbshut does not work!! But....):

コメント

コメントを書く