10

您好我已经在 Ubuntu 10.10 32 位版本机器上配置了 vertica 的 DSN 设置。设置都很好,我已经交叉检查了它们。

这是我的 odbc.ini 文件:

 [VerticaDSN]
  Description = VerticaDSN ODBC driver
  Driver = /opt/vertica/lib/libverticaodbc_unixodbc.so
  Servername = myservername
  Database = mydbname
  Port = 5433
  UserName = myuname
  Password = *******
  Locale = en_US

同样,我有一个 odbcinst.ini 文件。

当我运行命令时: isql -v VerticaDSN 我收到以下错误:

 [S1000][unixODBC][DSI] The error message NoSQLGetPrivateProfileString could not be found    in the en-US locale. Check that /en-US/ODBCMessages.xml exists.
[ISQL]ERROR: Could not SQLConnect.

我已经尝试了一切,但我无法破译这个错误。

任何帮助将不胜感激。

4

4 回答 4

15

您可能缺少驱动程序配置部分。使用以下内容编辑或创建文件 /etc/vertica.ini:

[Driver]
DriverManagerEncoding=UTF-16
ODBCInstLib=/usr/lib64/libodbcinst.so
ErrorMessagesPath=/opt/vertica/lib64
LogLevel=4
LogPath=/tmp

更多信息可以在 Vertica 程序员指南中的“附加驱动程序设置的位置”部分中找到。

于 2012-06-22T19:02:34.457 回答
2

在 Internet 上搜索有关此问题的信息,我发现很多人能够连接 tsql,但不能连接 isql 或 osql(使用 isql)。我遇到了同样的问题,上周一直在研究和测试,试图找出问题所在。问题是每个人都从 ODBC 的角度来处理它,而我认为它与 Windows 服务器或 sql 服务器配置有关。我检查了 windows 服务器上的日志,发现运行 ODBC 的机器已经命中它并尝试重复登录但一直无法登录。在事件查看器中,有大量条目显示相同的内容,即客户端计算机正在尝试登录 SQL Server,但被主机拒绝。这是我现在关注的角度,也是我认为问题所在。

谢谢,

于 2012-09-05T17:07:33.530 回答
1

从错误中我们可以看到您正在使用 unixODBC,并且我认为“DSI”是 Vertica 自称的内容,因为 ODBC 错误文本的格式为 [] 中的条目,从左到右作为通过不同组件的路径(请参阅示例诊断消息)。

我认为该消息应该是“找不到 SQLGetPrivateprofileString”。SQLGetPrivateProfileString 是 ODBC 驱动程序管理器提供的 API,用于从 odbc.ini 文件中读取条目。我相信它应该在 libodbcinst.so 共享对象中找到,但是,某些发行版(例如,Ubuntu/Debian)会从共享对象中删除符号,因此很难验证这一点。

在您的 DSN 中,驱动程序是文件“/opt/vertica/lib/libverticaodbc_unixodbc.so”。虽然在 odbc.ini 中命名驱动程序并在 odbcinst.ini 文件中添加一个条目更为常见,但您的 DSN 看起来还不错。例如:

/etc/odbcinst.ini:
[Easysoft ODBC-SQL Server SSL]
Driver=/usr/local/easysoft/sqlserver/lib/libessqlsrv.so
Setup=/usr/local/easysoft/sqlserver/lib/libessqlsrvS.so
Threading=0
FileUsage=1
DontDLClose=1

/etc/odbc.ini:
[SQLSERVER_SAMPLE_SSL]
Driver=Easysoft ODBC-SQL Server SSL
Description=Easysoft SQL Server ODBC driver
.
.

请参见上面的示例,这样做允许您指定与驱动程序相关的其他选项,例如 Threading(网上快速搜索表明 Vertica 可以使用 Threading=1,如果使用线程程序则限制较少)和 DontDLClose。但是,正如我所说,事情应该像你现在拥有的那样工作。

现在下一点取决于您的平台,我没有注意到您是否指定了一个。您需要检查 ODBC 驱动程序的共享对象并查看它依赖于什么。在 Linux 上,您可以执行以下操作:

$ ldd /usr/local/easysoft/sqlserver/lib/libessqlsrv.so
    linux-gate.so.1 =>  (0xb76ff000)
    libodbcinst.so.1 => /usr/lib/libodbcinst.so.1 (0xb75fe000)
    libesextra_r.so => /usr/local/easysoft/lib/libesextra_r.so (0xb75fb000)
    libessupp_r.so => /usr/local/easysoft/lib/libessupp_r.so (0xb75de000)
    libeslicshr_r.so => /usr/local/easysoft/lib/libeslicshr_r.so (0xb75cd000)
    libestdscrypt.so => /usr/local/easysoft/lib/libestdscrypt.so (0xb75c8000)
    libm.so.6 => /lib/libm.so.6 (0xb75a2000)
    libc.so.6 => /lib/libc.so.6 (0xb7445000)
    libltdl.so.7 => /usr/lib/libltdl.so.7 (0xb743b000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb7421000)
    /lib/ld-linux.so.2 (0xb7700000)
    libdl.so.2 => /lib/libdl.so.2 (0xb741d000)

这表明这个 ODBC 驱动程序依赖于 libodbcinst.so.1 并且动态链接器找到了它。我想您的 Vertica 驱动程序在这方面应该看起来相似,尽管 Vertica 驱动程序可能会在第一次加载时动态加载此共享对象本身。无论哪种方式,看起来 Vertica 驱动程序都找不到 libodbcinst.so 中的符号 SQLGetPrivateProfileString,因此请确保 a)您有 libodbcinst.so b)您的动态链接器知道它(如何完成取决于您的平台 - 在 Linux 上请参阅 /etc/ld.so.conf 和 LD_LIBRARY_PATH 以及 ld.so 的手册页) c)在其上运行 ldd(或等效项)以确保没有缺少的依赖项。

vertica.ini 文件可能是驱动程序存储驱动程序特定配置的位置 - 有些驱动程序会这样做。如果此文件的格式类似于上面的 odbc 格式,则它也可以使用 SQLGetPrivateProfileString 作为此文件,因为您可以告诉 ODBC API 使用哪个文件。

除此之外,除了联系 vertica,我没有更多的想法。

于 2012-03-26T08:37:49.933 回答
0

Arun——如果您可以让我知道数据库的版本和驱动程序的版本,我可以为您提供更多详细信息。此外,我可能会尝试在官方 Vertica 社区论坛上发布此内容。

http://my.vertica.com/forums/forum/application-and-tools-area/client-drivers/

如果我不得不猜测您的问题是什么,我认为这可能与这篇文章有关:

http://my.vertica.com/forums/topic/odbc-on-linux-issue/

...特别是最后关于“ODBCInstLib”的评论。

于 2012-04-07T15:40:21.323 回答