首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle dg4odbc:连接到Server不工作

Oracle dg4odbc:连接到Server不工作
EN

Stack Overflow用户
提问于 2019-09-24 14:43:20
回答 2查看 1.2K关注 0票数 0

我无法创建一个从OracleXE18c到SQLServer2017 Express的DBLink!

我的服务器centos 7.6上有Oracle XE 18c的实例,SQLServer2017 Express的实例都正常工作。

我想创建一个到Server的Oracle dblink。

由于这个防火墙规则,我可以远程连接到Server

代码语言:javascript
运行
复制
firewall-cmd --zone=public --add-port=1433/tcp --permanent
firewall-cmd --reload

我已经安装了Microsoft工具

代码语言:javascript
运行
复制
curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
yum remove unixODBC-utf16 unixODBC-utf16-devel
yum install -y mssql-tools unixODBC-devel
ACCEPT_EULA=Y yum install msodbcsql

cd /usr/lib64
sudo ln -s libodbccr.so.2.0.0   libodbccr.so.1
sudo ln -s libodbcinst.so.2.0.0 libodbcinst.so.1
sudo ln -s libodbc.so.2.0.0     libodbc.so.1

创建了一个DB,一个ODBC DSN,并验证了所有这些都运行良好。

代码语言:javascript
运行
复制
sqlcmd -D -S roberto_dsn -U sa -P password -d robertodb -Q "select *  FROM dbo.Person"

我已经用以下代码配置了Oracle实例:

代码语言:javascript
运行
复制
nano /opt/oracle/product/18c/dbhomeXE/hs/admin/initroberto.ora

HS_FDS_CONNECT_INFO = roberto_dsn
HS_FDS_TRACE_LEVEL = 0
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
set ODBCINI=/etc/odbc.ini

nano /opt/oracle/product/18c/dbhomeXE/network/admin/listener.ora
aggiungere
SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC=
     (SID_NAME=roberto)
     (ORACLE_HOME=/opt/oracle/product/18c/dbhomeXE)
     (PROGRAM=dg4odbc)
         (envs="LD_LIBRARY_PATH=/usr/lib64:/opt/oracle/product/18c/dbhomeXE/lib")
   )
 )

nano /opt/oracle/product/18c/dbhomeXE/network/admin/tnsnames.ora
#added
ROBERTO =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.164)(PORT = 1521))
    (CONNECT_DATA =
      (SID_NAME = roberto)
    )
        (HS=OK)
  )

我正确地重新启动了侦听器

代码语言:javascript
运行
复制
lsnrctl stop
lsnrctl start

tnsping roberto
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.164)(PORT = 1521)) (CONNECT_DATA = (SID_NAME = roberto)) (HS=OK))
OK (0 msec)

最后,我创建了DBLink

代码语言:javascript
运行
复制
sqlplus / as sysdba
 alter session set container = xepdb1;

 CREATE PUBLIC DATABASE LINK ROBERTO CONNECT TO
"sa" IDENTIFIED BY "password" using 'roberto';

我收到的第一个错误如下:

代码语言:javascript
运行
复制
sqlplus sa/password@roberto
ERROR:
ORA-01017: Invalid Username/Password; Logon Denied

但DBLink也是如此:

代码语言:javascript
运行
复制
select * from dual@roberto;
ORA-28546: Connection initialization failed, probable Net8 admin error
ORA-28511: lost RPC connection to heterogeneous remote agent using SID=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.164)(PORT=1521)))(CONNECT_DATA=(SID_NAME=roberto)))
ORA-02063: preceding 2 lines from roberto
28546. 0000 -  "connection initialization failed, probable Net8 admin error"
*Cause:    A failure occurred during initialization of a network connection
           from the Oracle server to a second process:  The connection
           was completed but a disconnect occurred while trying to
           perform protocol-specific initialization, usually due to
           use of different network protocols by opposite sides
           of the connection.  This usually is caused by incorrect
           Net8 administrative setup for database links or external
           procedure calls.   The most frequent specific causes are:
           --  Database link setup for an Oracle-to-Oracle connection
           instead connects to a Heterogeneous Services agent
           or an external procedure agent.
           --  Database link setup for a Heterogeneous Services connection
           instead connects directly to an Oracle server.
           --  The extproc_connection_data definition in tnsnames.ora
           connects to an Oracle instance instead of an external
           procedure agent.
           --  Connect data for a Heterogeneous Services database link,
           usually defined in tnsnames.ora, does not specify (HS=).
           --  Connect data for an Oracle-to-Oracle database link,
           usually defined in tnsnames.ora, specifies (HS=).
*Action:   Check Net8 administration in the following ways
           --  When using TNSNAMES.ORA or an Oracle Names server, make sure
           that the connection from the ORACLE server uses the correct
           service name or SID.
           --  Check LISTENER.ORA on the connection end point's host machine
           to assure that this service name or SID connects to the
           correct program.
           --  Confirm in TNSNAMES.ORA or the equivalent service definition
           that service 'extproc_connection_data' does NOT contain
           (HS=), or that the service definition used by a
           Heterogeneous Services database link DOES contain (HS=).

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-20 08:23:23

我终于解决了!我将microsoft库链接到/usr/lib64 64

代码语言:javascript
运行
复制
cd /usr/lib64
sudo ln -s /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2 .
sudo ln -s /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.3.so.1.1 .

此外,我还在tnsnames.ora中更改了添加的脚本,用SID替换了SID_NAME。

代码语言:javascript
运行
复制
nano /opt/oracle/product/18c/dbhomeXE/network/admin/tnsnames.ora
#added
ROBERTO =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.164)(PORT = 1521))
    (CONNECT_DATA =
      (SID = roberto)
    )
        (HS=OK)
  )

我重新启动了数据库,现在:

代码语言:javascript
运行
复制
select*from dual@roberto;

行得通!

票数 1
EN

Stack Overflow用户

发布于 2019-10-08 19:18:05

让我们试试:

代码语言:javascript
运行
复制
firewall-cmd --zone=internal --add-port=1433/tcp --permanent
firewall-cmd --reload

我根本不是一个窗口专家(我是一个Linux用户),但在您的情况下,我想您可能还需要启用内部区域供本地使用。(您说所有的服务/东西都运行在同一台服务器上)希望很有用,但这是一种尝试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58082868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档