Oracle Database 10.2.0.4.0 を Windows Server 2008 の VM 2台にインストールした。
1台は DB の作成まで行い、もう一台はインストールのみで DB まではインストールせず。
目的は Data Guard を試すこと。

テスト用ネットワークと社内LAN との両方につなげていたせいが Enterprise Manager のセットアップに失敗して起動せず苦労したがなんとか修復した。
(
http://faizsulaiman.com/unable-to-determine-local-host-from-url-repository_url/

を参考にして復旧した。
コマンドラインを管理者モードで起動していなかったとか
環境変数としてOracle_Home が設定されていなかったから失敗したとか。
Oracle に含まれる証明書が古いせいで enterprise manager が設定後に起動せず、

emctl unsecure dbconsole

として起動するようになったとか。
)

しかしながら、SQL PLUS から接続できないという現象に苦戦した。
正確には、ローカルから接続できるが、ローカル及びもう一台から TNSサービス名を指定すると接続できないという現象である。

Oracle Net Manager でいろいろいじったり、
Database の Service Name を確認したり(※1 この時点でいじった記憶はないが、いじったとしか思えない事象が出てくる)、
したが改善せず。

で、TNSNAMES ではなく、EZCONNECT でつなげてみる・・・とあっさりつながった。(でもこれ自体がおかしいということがわかり、※1 でいじったとしか思えない)

どうしても理由がわからず、別の機械に Oracle 11.2 の Instant Client を Install して接続してみたら EZCONNECT でも TNSNAMES でもつながった。
tnsnames.ora は同じにしたのに。

この問題、2週間くらい解決せず。

で、昨日もいじっていて、試しに instant client では使っていない sqlnet.ora をリネームしてみた。
・・・そしたらあっさり接続できた。

sqlnet.ora の中身を一行づつコメントアウトして試したら

NAMES.DEFAULT_DOMAIN

が原因だと判明した。

これが設定されている場合、SQL PLUS で TNSサービス名を指定した時にその TNSサービス名が「.」を付けていなかったら
NAMES.DEFAULT_DOMAIN の設定文字列を付けるというものである。

つまり、tnsnames.ora でのTNSサービス名に予め NAMES.DEFAULT_DOMAIN を付与している必要があるのである。(あるいは、 NAMES.DEFAULT_DOMAIN を設定しないか.)
(
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19209-01/sqlnet.htm
)

さて、これで問題解決・・・では終わらなかった。

SERVICE_NAME をいろいろいじっていて

「.」を含むサービス名にしたときは接続できるが、「.」を含まない場合は接続できない。

という現象に出くわした。

調べてみたが、「.」を付けない名前にしたときは DB_DOMAIN の設定値が付加されるとのこと。
LSNRCTL で Services を見ても DOMAIN名が付与されている。
なのに EZCONNECT でDB_DOMAIN が付いたサービス名を指定しても接続できない。

半日なやんでふと気が付いた。

DB_DOMAIN の設定しているドメイン名で綴り間違いをしていた。

間違った綴りで EZCONNECT で接続もできた。

で、 DB_DOMAIN と Global_NAME を変更した。
(
http://docs.oracle.com/cd/B19306_01/server.102/b14231/ds_admin.htm
)

これでいいか・・・と思ったがふと気になって Enterprise Manager を見てみたら DB に接続できていない。
Enterprise Manager の再設定をしなおした。
(
(環境変数 ORACLE_SID は設定済だとして)
管理者モードのコマンドラインから
環境変数 ORALCE_HOMENAME の設定して
emca -deconfig dbconsole db
emca -config dbconsole db
(※設定後の起動に失敗する)
emctl unsecure dbconsole
emctl start dbconsole
)


これでやっと準備ができた。

コメント