unixODBC在运行isql时出错[Vertica]

时间:2012-03-19 21:12:45

标签: unixodbc vertica

您好我已经在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 个答案:

答案 0 :(得分:15)

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

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

有关详细信息,请参阅“Vertica程序员指南”的“附加驱动程序设置的位置”部分。

答案 1 :(得分:2)

在互联网上搜索这个问题我已经看到很多人已经能够连接tsql但不能与isql或osql(使用isql)连接。我有同样的问题,并在上​​周一直在研究和测试,试图找出问题所在。事情是每个人都从ODBC的角度接近它,当我认为它是与Windows服务器或SQL服务器配置有关。我检查了Windows服务器上的日志,看到运行ODBC的计算机已经点击它并尝试重复登录但是无法登录。在事件查看器中有大量条目显示相同的内容,客户端计算机正在尝试登录到SQL Server但被主机拒绝。这就是我现在关注的角度以及我认为问题所在。如果我得到解决,我会再次发布,让每个人都知道我发现了这个问题。

谢谢,

答案 2 :(得分:1)

从错误中我们可以看到你正在使用unixODBC并且我认为“DSI”是Vertica自称的,因为ODBC错误文本的格式使用[]中的条目从左到右作为通过不同组件的路径(参见{{ 3}})。

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

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

/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
.
.

在上面的例子中看到这样做可以让你指定与驱动程序相关的其他选项,如线程(并且在网上快速搜索表明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。

答案 3 :(得分: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'的评论。