Oracle: データベース・リンクはtnsnames.ora変更後に再作成が必要


SSIAって感じですが…

※今回検証した環境はOracle Database 11gです。(古い)

データベース・リンクについて

データベース・リンク(以下DBリンク)は他のデータベースのオブジェクトを操作できる機能です。以下のようにして作成します。(参考: CREATE DATABASE LINK

1
CREATE DATABASE LINK remotedb CONNECT TO scott IDENTIFIED BY tiger USING 'remotedbname';

あらかじめOracle Databaseサーバ上のtnsnames.oraには以下のように接続するリモートDBの接続情報が記載されている必要があります。

remotedbname =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver-1.example.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = XE)
    )
  )

そして、リモートDBのオブジェクトを検索する際は、以下のようにオブジェクト名の後ろに@に続いて作成したDBリンクオブジェクトの名前remotedbをくっつけます。これで検索が可能。

1
SELECT * FROM tab1@remotedb;

同じようにしてUPDATEDELETEもできます。

本題

で、このリモートDBのホスト名が変わる場合(例えばdbserver-1.example.comからdbserver-2.example.com)、ホスト名はtnsnames.oraにしか書かれていないのでtnsnames.oraを修正するわけですが、それだけでは接続先は変更されません。

どうもホスト名やサービス名などのtnsnames.oraに書かれている接続情報は、DBリンクを作成した時点でDBリンクオブジェクトが持ってしまうようで、いくらtnsnames.oraを書き換えても古いリモートDBに繋がってしまいます。(文献を見つけることができませんでした。)

※試してないですが、DBインスタンスを再起動したりすれば反映されるかも?

じゃあ、ALTER DATABASE LINK か?となるわけですが、ALTER DATABASE LINKは接続ユーザのパスワードが変わった場合のみ使用されるもので、接続ユーザや接続情報は変更することはできません。

接続または認証ユーザーのパスワードが変更された場合に固定ユーザー・データベース・リンクを変更するには、ALTER DATABASE LINK文を使用します。 この文を使用して、データベース・リンクに関連付けられた接続または認証ユーザーを変更することはできません。userを変更するには、データベース・リンクを再作成する必要があります。

このことからも、リモートDBのホスト名が変わる等でtnsnames.oraを変更した場合は、DBリンクの再作成(DROPしてCREATE)が必要となると考えられます。

(‘A`)マンドクセ