3

創建數據庫鏈接到遠程數據庫我們有一個CRM系統,我們的公司,它使用一個的Oracle 11g數據庫。它由第三方供應商開發。不能在甲骨文數據庫

我們無權訪問運行CRM系統的服務器。但是,儘管如此,我們仍然可以使用DBA登錄數據(SYS用戶)。它包括:

  • 服務器IP:172.1.2.3
  • 端口:1521
  • SID:ABC
  • 用戶:SYS
  • 密碼:*

我們可以使用它來訪問數據庫Oracle SQL Developer 3.1(連接>>屬性)

現在數據的部分必須複製出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連接到數據庫。不應該也可以在兩個Oracle DB之間建立連接嗎?請幫助我設置和創建數據庫鏈接。

-----編輯:--------

亞歷克斯·普爾的提示幫助我得到它的工作。我用

show parameters service_names; 

得到完整的服務名稱。它的格式爲abc.def,其中def爲域。因此,我在tnsnames中將域名添加到TNS別名中。ORA

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是本地的。但是,我刪除了對「本地」listener.ora,的所有更改,因爲偵聽程序確實駐留在CRM服務器上。

的SQL命令大多是不變的,但現在可以進行連接:

+0

TNSNames文件中包含來自「其他」(非CRM)oracle數據庫上的TNSNames文件的那個條目,對不對? 我不確定您必須對目標數據庫上的偵聽器執行任何操作。至少,我從來不需要。據我所知,目標數據庫像處理任何其他連接一樣處理傳入的數據庫鏈接(但我可能錯了) – moleboy 2012-04-18 20:43:16

+0

我也確實不希望以sys用戶身份創建數據庫鏈接(或者,至少,我不會......如果只是爲了安全起見) – moleboy 2012-04-18 20:45:31

+0

同意。 'SYS'在Oracle中非常特別,應該謹慎小心。 – 2012-04-18 20:46:36

回答

1

不僅應該對你不連接爲SYS除非必要,您無法連接作爲SYS通過數據庫鏈接。

+0

我最初的想法是在測試時不會因缺乏特權而產生額外的問題。但是由於它甚至有限制,我想我會改變它,即使是測試。 – user748261 2012-04-18 23:48:31

6

你說SIDabc,但在你的tnsnames.ora你有在CONNECT_DATA部分SERVICE_NAME。它們並不總是相同的東西 - 參見this questionAsk Tom entry。你實際上並沒有說你得到了什麼錯誤,但只是將其改爲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,則數據庫鏈接名稱必須與遠程服務名稱匹配。

+0

你建議使用**'// 172.1.2.3:1521/abc.domain'**。如何查看我的案例中的.domain信息?我必須檢查是否有任何非管理員用戶可以查看我們需要的所有表格。儘管如此,我不願意在我不完全瞭解的系統上修改用戶權限。 – user748261 2012-04-18 23:21:40

+0

@ user748261 - 我真的是說服務名稱,我猜的是格式。我已經通過一些鏈接和更多信息更新了答案。儘管如此,請將您所看到的實際錯誤添加到您的問題中,因爲我在黑暗中拍攝了一下! – 2012-04-19 07:53:40

+0

我編輯了我的原始文章。你可能在黑暗中射擊,但你是對的:-)。我希望我的編輯能夠明確解決方案的工作方式。 – user748261 2012-04-19 09:01:15