3

私たちの会社には、Oracle 11g データベースを使用する CRM システムがあります。これは、サード パーティ ベンダーによって開発されています。

CRM システムを実行するサーバーへのアクセス権がありません。それでもなお、作業中の DBA ログイン データを使用できます (SYS ユーザー)。以下で構成されています。

  • サーバー IP: 172.1.2.3
  • ポート: 1521
  • SID: abc
  • ユーザー: システム
  • パスワード: *

これを使用して、Oracle SQL Developer 3.1で DB にアクセスできます(接続 >> プロパティ) 。

ここで、データの一部をCRM データベースから別のサーバーにある別の Oracle データベースにコピーする必要あります。

私の理解では、ターゲット データベースにデータベース リンクを作成する必要があります。私はこのようなことを試しました:

CREATE PUBLIC DATABASE LINK xxx CONNECT TO sys IDENTIFIED BY ***** USING 'MYTNSENTRY'

私のtnsnames.oraは次のとおりです。

MYTNSENTRY =
 (DESCRIPTION = 
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = abc)
 )
)

....そして私のlistener.oraは次のようになります:

MYLISTENER=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=172.1.2.3)(PORT=1521))
      ))
SID_LIST_MYLISTENER=
  (SID_LIST=    
    (SID_DESC=
      (SID_NAME=MYTNSENTRY)
      (ORACLE_HOME=C:\somepath) # path to Oracle home of target DB
      (PROGRAM=extproc)))

PROGRAM=extproc は正しい選択ですか? 選択する他のプログラムがいくつかあります。「ユーザーを確認」できないなどの理由で、 lsnrctlでリスナーを起動することさえできませんでした。皮肉なことに、リスナーのセットアップとMS SQL サーバーへのデータベース リンクはスムーズに機能します。

CRM DB システムに関するいくつかの重要な情報が不足しているにもかかわらず、SQL Developer で DB に接続できます。2 つの Oracle DB 間で接続を確立することも可能ではないでしょうか? データベース リンクのセットアップと作成を手伝ってください。

- - - 編集: - - - -

Alex Poole のヒントは、それを機能させるのに役立ちました。使った

  show parameters service_names;

完全なサービス名を取得します。abc.defという形式で、defはドメインです。したがって、ドメイン名をtnsnames.oraの TNS エイリアスに追加しました。

MYTNSENTRY =
 (DESCRIPTION = 
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = abc.def)
 )
)

接続は、ターゲット DB サーバーのコマンド プロンプトでtnsping MYTNSENTRYを使用してテストできます。tnsnames.ora はローカルです。ただし、リスナーは実際にはCRMサーバーに存在するため、「ローカル」listener.oraへのすべての変更を削除しました。

SQL コマンドはほとんど変更されていませんが、接続が機能するようになりました。

CREATE PUBLIC DATABASE LINK xxx CONNECT TO some_user IDENTIFIED BY ***** USING 'MYTNSENTRY'
4

2 に答える 2

6

あなたは が であると言いましたSIDabc、あなたtnsnames.oraSERVICE_NAMEセクションにはCONNECT_DATAがあります。それらは常に同じであるとは限りません。この質問またはこのAsk Tom エントリを参照してください。実際にどのようなエラーが発生したかは述べていませんが、それを変更するだけSID =で違いが生じる可能性があります。

listener.oraそして実際にはリスナーは、「ターゲット」データベースをホストするサーバー上ではなく、CRM データベースをホストするサーバー上にあります。明らかにすでに構成されているSQL Developerから接続できるため。はtnsnames.oraローカルである必要があります。

ただしservice_name、CRM データベースの がわかっている場合は、それをスキップして、EZCONNECT構文を使用してリンク内のすべてを定義できます。

CREATE PUBLIC DATABASE LINK xxx
CONNECT TO non-sys IDENTIFIED BY *****
USING '//172.1.2.3:1521/service_name';

SQL Developer の構成を調べて、SID ではなくサービス名が既に使用されているかどうかを確認します。使用されていない場合は、それを検出する必要があります。CRM サーバーにアクセスできる場合は、登録されているサービス名を見つけるために使用できますが、データベースに接続してまたはlsnrctlを実行する必要があるようには見えません。show parameters service_namesselect value from v$parameter where name = 'service_names';

公開リンクを作成するには、非公開リンクよりも多くの権限が必要です。また、公開リンクは、CRM データベースを対象のリンクで誰にでも公開するため、安全性が低い可能性があります。したがって、本当に必要な場合にのみ公開し、いずれにしても、作成できる場合は読み取り専用アカウントに接続します.

global_namesまた、ターゲット データベースがデータベース リンク名に設定されている場合trueは、リモート サービス名と一致する必要があることに注意してください。

于 2012-04-18T22:14:07.640 に答える
1

必要な場合を除き、SYS として接続してはならないだけでなく、データベース リンクを介して SYS として接続することもできません。

于 2012-04-18T21:45:32.223 に答える