linux - 如何使用 Oracle ODBC 网关通过 ODBC 将 Oracle 连接到 PostgreSQL?

标签 linux oracle postgresql odbc

我想从运行 openSUSE 的服务器上的 PostgreSQL 实例中选择运行 Oracle 自定义 Linux 风格的服务器上的 Oracle 实例。我想使用 Oracle ODBC 网关来执行此操作。我过去已经成功地完成了此操作,并且继续使用相同的 Oracle 机器和其他 SUSE/Postgres 机器来完成此操作。

我在 SUSE (Postgres) 端的 ODBC 管理器是:unixODBC

我的 odbc.ini 是:

[postgresql]
Description         = Test to Postgres
Driver              = /usr/lib64/psqlodbcw.so
Trace               = Yes
TraceFile           = sql.log
Database            = host
Servername          = localhost
UserName            = *****
Password            = *****
Port                = 5432
Protocol            =
ReadOnly            = Yes
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No
ConnSettings        =

我的 odbcinst.ini 是

[postgresql]
    Description             = Postgresql driver for Linux
Driver          = /usr/lib64/psqlodbcw.so
UsageCount              = 1

我的 tnsnames.ora(省略其他 ODBC 条目)是:

# tnsnames.ora Network Configuration File: /opt/oracle/product/11gR1/db/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = dbs1)(PORT = 1522))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbs1)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ODBC_SERVER123=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=dbs1)
      (PORT=1522)
    )
    (CONNECT_DATA=
       (SID=server123)
    )
    (HS=OK)
  )

我的listener.ora(省略其他SID_DESC条目)是:

# listener.ora Network Configuration File: /opt/oracle/product/11gR1/db/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
        (DESCRIPTION_LIST =
                (DESCRIPTION =
                        (ADDRESS_LIST=
                                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
                                (ADDRESS = (PROTOCOL = TCP)(HOST = dbs1)(PORT = 1522))
                        )
                )
        )

ADR_BASE_LISTENER = /opt/oracle

SID_LIST_LISTENER=
        (SID_LIST=
                (SID_DESC=
                        (SID_NAME=server123)
                        (ORACLE_HOME=/opt/oracle/product/11gR1/db)
                        (PROGRAM=dg4odbc)
                        (ENVS=LD_LIBRARY_PATH=/usr/lib64:/opt/oracle/product/11gR1/db/lib)
                )
        )

TRACE_LEVEL_LISTENER = 0
LOGGING_LISTENER = off

此外,这是位于 $ORACLE_HOME/hs/admin 中的 inithost123.ora 文件:

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = server123
HS_FDS_TRACE_LEVEL = 0
#HS_FDS_TRACE_LEVEL=DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

HS_FDS_SUPPORT_STATISTICS = FALSE

HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P1
#HS_LANGUAGE=AMERICAN_AMERICA.US7ASCII
HS_FDS_TIMESTAMP_MAPPING = "TIMESTAMP(6)"
HS_FDS_FETCH_ROWS=1
HS_FDS_SQLLEN_INTERPRETATION=32

#
# ODBC specific environment variables
#
set ODBCINI=/etc/unixODBC/odbc.ini

#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>

为了更好地衡量,我的 sqlnet.ora 是:

# sqlnet.ora Network Configuration File: /opt/oracle/product/11gR1/db/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /opt/oracle

我使用以下命令在 Oracle 端添加了网关链接:

CREATE DATABASE LINK ODBC_SERVER123 CONNECT TO "*****" IDENTIFIED BY "*****" USING 'ODBC_SERVER123';

当我尝试执行选择时,我收到以下错误:

[SQL] select * from "legit_view"@ODBC_SERVER123
[Err] ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[unixODBC][Driver Manager]Data source name not found, and no default driver specified {IM002}
ORA-02063: preceding 2 lines from ODBC_SERVER123

我可以使用 isql 在 SUSE/Postgres 机器上成功本地测试 ODBC:

>isql -v postgresql ***** *****
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

我忘记了哪一步?

最佳答案

您的 odbc.ini 文件必须位于远程机器上!即发起查询的那个。在上面的示例中,这就是 Oracle 框。以下是 Oracle(远程)框中必须包含的条目:

[server123]
Driver = /usr/lib64/psqlodbcw.so
Description = ODBC to PostgreSQL on Server 123
Trace = No
Tracefile = /var/log/sql_host_123.log
Servername = ip.address.for.123
Username = *****
Password = *****
Port = 5432
Protocol = 6.4
Database = host
QuotedId = Yes
ReadOnly            = No
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No

关于linux - 如何使用 Oracle ODBC 网关通过 ODBC 将 Oracle 连接到 PostgreSQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027914/

相关文章:

linux - 如何在 Linux 上的 SDCARD 中写入超过 2000,000 个文件

linux - 如何将选项传递给挂载系统调用?

oracle - oracle多表导出

linux - 如何让两个docker容器可以互相ping通

linux - 在自动根密码更改脚本中实现公钥身份验证的最佳方法是什么?

sql - 如何使用 SQL CONCAT/SUBSTR?

java - ORACLE中使用MERGE语句进行DELETE和INSERT

sql - 使用 Postgres,如果为 NULL,我如何使用 UPDATE 插入新的 jsonb 值,或者如果值已经存在,如何修改 json?

java - 错误 : operator does not exist: bigint = character varying for empty list of long

sql - 如何从 JSONB 列中提取数据