我在使用 unixODBC 时遇到了麻烦。我已安装最新版本,目前只能使用sudo
。为了测试 ODBC,我使用了isql
。示例:
# isql -v testTable
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect
和sudo
# sudo isql -v testTable
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
为什么会这样?如果没有我该如何使用它sudo
?
sudo
注意:安装时我没有使用过。我以 root 身份安装它并尝试以 root 身份使用它。
更新
# ls -ltr /usr/local/psql/etc/odbcinst.ini
ls: cannot access /usr/local/psql/etc/odbcinst.ini: No such file or directory
# ls -ltr /etc/odbcinst.ini
-rw-r--r-- 1 root root 740 28 nov 8,04 /etc/odbcinst.ini
内容/etc/odbcinst.ini
~]# cat /etc/odbcinst.ini
# Driver from the postgresql-odbc package
# Setup from the unixODBC package
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/psqlodbcw.so
Setup = /usr/lib/libodbcpsqlS.so
Driver64 = /usr/lib64/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
更新/etc/odbc.ini
[myDSN]
Description = MySQL Connection
Driver = MySQL
Database = testTable
User = mysql
Password = ******
Port = 3310
Server = localhost
Socket = /var/lib/mysql/mysql.sock
另一个更新。不使用 sudo:
odbcinst -j
-bash: /usr/local/bin/odbcinst: No such file or directory
使用 sudo
sudo odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
答案1
检查 /etc/odbcinst.ini、/etc/odbc.ini、~/.odbc.ini 和 $ODBCINI,查看分配了哪些权限。我认为运行该命令的用户可能没有这些文件之一的权限,或者如果数据源是在其他用户下创建的,则可能甚至没有定义数据源。
取自常见错误消息和 什么是 odbc.ini 以及我应该在其中放入什么? 此外,检查您添加 DSN 的用户以及您以该用户身份运行的 /etc/odbc.ini 和 ~/.odbc.ini。如果这些是相同的,则只需执行一次。
常见错误消息
[iODBC][驱动程序管理器]未找到数据源名称且未指定默认驱动程序。无法加载驱动程序,SQLSTATE=IM002
出现此消息的原因有多种。最好的解决方案是跟踪正在发生的事情:您的应用程序已链接到 libiodbc,它已尝试以某种方式查找 odbc.ini 文件 - 通过 ODBCINI 环境变量或后备路径(通常是 /etc/odbc.ini,取决于编译方式)。您应该检查此类文件是否存在于合适的位置,以及是否可以访问(特别是如果您的应用程序以不同的用户权限运行 - 例如 apache/php 以 www-data 用户身份运行)。
此外,可能是 iODBC 找到了合适的 odbc.ini 文件,但找到的所有文件都不包含您请求的 DSN。请检查请求的语法 - ODBC 连接字符串是否正确,您请求的 DSN 是否存在?另请参阅此常见问题解答中上述标题为“什么是 odbc.ini,我应该在其中输入什么?”的部分。
什么是 odbc.ini
odbc.ini 是主要的配置文件,其中存储了您的所有 DSN 和大部分 ODBC 配置参数。iODBC 有一个用于查找此类配置文件的搜索路径:首先,检查环境变量 ODBCINI 以查看它是否指向合适的文件,或者 ~/.odbc.ini(类似于 Windows 上的用户 DSN),然后 /etc/odbc.ini(“系统范围”)是后备位置。
odbc.ini 文件包含 3 个部分:一组 ODBC 选项、一个 DSN 列表,以及数据源定义本身,因此:
[ODBC Data Sources]
PostgreSQL native localhost = PostgreSQL native driver
PostgreSQL OpenLink localhost = PostgreSQL over OpenLink multi-tier
[PostgreSQL native localhost]
Driver = /usr/lib/postgresql/lib/libodbcpsql.so
Host = localhost
Server = localhost
ServerName = localhost
Database = tim
UserName = tim
UID = tim
Port = 5432
[PostgreSQL OpenLink localhost]
Description = PostgreSQL, over openlink MT
Driver = /opt/openlink/lib/oplodbc.so
ServerType = PostgreSQL95
Host = localhost
Database = tim
Username = tim
LastUser = tim
User = tim
FetchBufferSize = 99
[ODBC]
;Trace = 1
;TraceFile = /tmp/odbctrace.log ;Debug = 1
;DebugFile = /tmp/odbcdebug.log
ODBC 数据源列表与文件 odbcinst.ini(或环境变量 ODBCINSTINI)相关:对于用作驱动程序描述的每个值,odbcinst.ini 中都应该有一个相应的部分,列出驱动程序和安装库(以协助使用 iodbcadm-gtk 进行图形配置,并且还用于在连接时提供的选项不足时显示输入框)。
属性列表取决于驱动程序,如上所示:本机 postgresql 驱动程序对它们的调用与 openlink 多层不同,因此您必须查看驱动程序的文档。
使用 iODBC,假设您已经下载/安装/编译了它,您还可以拥有一个基于 GTK 的 GUI 来配置您的 ODBC DSN:运行 iodbcadm-gtk。