unixODBC在运行isql [Vertica]时出现错误。

10

大家好,我已经在32位Ubuntu 10.10机器上配置了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.

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

非常感谢您提供的任何帮助。


你正在运行哪个版本的数据库驱动程序和Vertica?此外,我通常不在我的ODBC连接中指定Locale。你确定你需要它吗?对我来说,这听起来更像是本地化错误而不是用户错误,但我可能错了。 - bpanulla
我已经删除了它,但没有效果。我现在正在使用vertica_5.1.1_odbc_i386_linux vertica驱动程序。我跟踪了isql语句,但它仍在搜索vertica.ini文件。是否有这样的文件?我似乎找不到它。 - Arun Shyam
4个回答

15

你可能缺少驱动程序配置部分。请编辑或创建文件/etc/vertica.ini,并添加以下内容:

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

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


是的,在我的情况下,这正是问题所在。 - Arun Shyam

2
通过搜索互联网,我发现很多人能够使用tsql连接,但无法使用isql或osql(它们使用isql)。我也遇到了同样的问题,过去一周一直在研究和测试,试图找出问题所在。事实上,每个人都从ODBC的角度来解决它,但我认为问题与Windows服务器或SQL Server配置有关。我检查了Windows服务器上的日志,并发现运行ODBC的机器一直在尝试登录,但未能成功。在事件查看器中,有大量条目显示相同的情况,即客户端机器正在尝试登录SQL Server,但被主机机器拒绝。这是我现在关注的角度,也是我认为问题所在的地方。如果我解决了这个问题,我会再次发布消息,让大家知道我找到了什么。

谢谢。


谢谢Jamatrix,真的很感激。 - Arun Shyam

1

从错误信息中我们可以看到您正在使用unixODBC,我猜“DSI”是Vertica在ODBC错误文本中的称呼,因为[]中的条目从左到右按路径排列不同组件(请参见示例诊断消息)。

我猜那个消息应该是“No SQLGetPrivateprofileString could be found”。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
.
.

在上面的例子中,这样做可以让您指定与驱动程序相关的其他选项,例如线程(快速搜索表明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驱动程序无法找到符号SQLGetPrivateProfileString,而该符号在libodbcinst.so中,因此请确保a)您有libodbcinst.so b)您的动态链接器知道它(如何完成取决于您的平台-在Linux上,请参见/ etc / ld.so.conf和LD_LIBRARY_PATH以及ld.so的man页面)c)在其上运行ldd(或等效物)以确保没有缺少的依赖项。

vertica.ini文件可能是驱动程序存储特定于驱动程序的配置的位置-某些驱动程序会这样做。如果此文件的格式与上面的ODBC文件相同,则它也可以使用SQLGetPrivateProfileString来告诉ODBC API要使用哪个文件。

除此之外,我没有更多的想法,建议联系Vertica。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接