• ベストアンサー

SIDとSERVICE_NAMEの違いとは?

tnsnames.oraの中の(CONNECT_DATA=に SIDだったりSERVICE_NAMEだったりしますが、どのような違いがあるのでしょうか? どちらでもつながるのでいいかとは思いますが、何かメリット・デメリットでもあるのでしょうか? それとも過去の遺物が未だ共存しているだけでしょうか? SIDはインスタンスにつけられた名前だと知っていますが、SERVICE_NAMEってなんですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.3

SIDはインスタンスの識別子、service_nameはサービス名。 インスタンスとサービスの違いはRAC を勉強されるとよくわかると思います。 サービス名は初期化パラメータのservice_namesで設定します。 設定されていない場合は先述のとおりdb_unuque_name.db_domainになります。 (これが同義と誤解されやすい原因となっているわけですが) ところで、service_namesパラメータですが、複数形になっていることからもわかるように、複数のサービス名をコンマ区切りで指定できるようになっています。 これをこのように使います。 2ノードRAC環境で、インスタンス1(SID=hoge1)、インスタンス2(SID=hoge2)があったとします。 ノードを意識することなく接続できるようにするためにクライアント側のtnsnames.oraにはこんな設定を追加します。 HOGE.EXAMPLE.COM (DESCRIPTION = (LOAD_BALANCE = ON) (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = hoge.example.com)) ) インスタンス1とインスタンス2のservice_namesパラメータにhoge.example.comを追加します。すると、インスタンス1とインスタンス2にラウンドロビンで接続できるようになります。 ここで、もしtnsnames.oraのservice_name=...がSID=hoge1だったらどうなるでしょう? インスタンス2のSIDはhoge2ですから一致せず、インスタンス2には接続できず、いつもインスタンス1に繋がってしまいます。 次に、一時的にメンテナンスのためにインスタンス2にアクセスしてほしくないケースを考えます。service_nameであれば、インスタンス2のservice_namesパラメータからhoge.example.comを削除することで(動的に変更できます)直ちにインスタンス1にのみ接続されるようにできます。 ここで、もしORACLE_SIDだったら・・・変更のためにインスタンスの再起動が必要になってしまいますね? 最後にservice_namesは複数登録できます。3ノードRAC環境において、オンライン処理(service_name=ONLINE)、バッチ処理(service_name=BATCH)があったとします。 バッチ処理は1つのノード(インスタンス1)でのみ処理したいとします。オンライン処理は3つのノードでしたいとします。 そんなとき、service_nameであれば、 <<サーバ側の初期化パラメータ>> 1:service_names = online, batch 2:service_names = online 3.service_names = online <<クライアント側のtnsnames.ora>> オンライン処理 ONLINE.EXAMPLE.COM (DESCRIPTION = (LOAD_BALANCE = ON) (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = online.example.com)) ) BATCH.EXAMPLE.COM (DESCRIPTION = (LOAD_BALANCE = ON) (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = batch.example.com)) ) と、クライアント側では接続先サーバを気にすることなく構成できますね? BATCHのノードを1から2にしたい場合の変更はサーバ側のみでできますよね? serivce_namesの"batch"設定をノード2に移すだけです。

mr-r00
質問者

お礼

ありがとうございます 大変参考になりました!

その他の回答 (2)

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.2

http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF-8&fr=ie8sc&p=Oracle+tnsnames+SERVICE_NAME 上記の検索リンク順にたどってゆくとわかると思います。 tnsnames.ora からたどると、確かにわかりにくい説明ばかりかもしれません。いや、実際そうですね。このファイルは互換性のために、いまだに存在して言うかと私は思っています。 これらが使用去られるようになったのはVer7 くらいからだったと思います(今11?)。 ファイルから見るとよくわからないので、GUIツールから見て、ガイドを読んでゆくとわかると思います。DB管理ツールですね。エンタープライズXXXだったかな? GUIで変えると、ああ、ここが変わるんだ、とわかるはずです。実験できるなら、名前に、全て設定箇所か特定できる名前をつけるといいです。 通常ホスト名とか、グループ(チーム名)を、いろんなところにつけてしまうから、これって何の役に立っているのと、新人君からよく聞かれます。

mr-r00
質問者

お礼

ありがとうございます 大変参考になりました!

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > ・・・どのような違いがあるのでしょうか? SID はインスタンスに付けられた名前です。 通常の環境では、SID, SERVICE_NAME のどちらでも構いませんが、 RAC 環境の場合ノード毎にインスタンス名が異なるのでSERVICE_NAME で指定できるようになっていたと思います。

mr-r00
質問者

お礼

ありがとうございます 大変参考になりました!

関連するQ&A

専門家に質問してみよう