Linux环境下Perl连接远程MSSQL 2016的ODBC驱动路径配置咨询
Linux 主机跨机连接远程 MSSQL 2016 的 ODBC 配置实操
前置认知澄清
首先明确两个容易被新手混淆的点:
- 原脚本里的 DSN 字符串用单引号整段包裹时,里面的
$user、$password变量不会被 Perl 解析,会直接把变量名作为账号密码传递,必然连接失败 - ODBC 驱动是安装在运行脚本的本地 Linux 主机上的,和远程 MSSQL 服务器端的安装环境没有任何关系,原个人环境里记录的驱动路径不能直接拿到办公场景的主机上用,必须在当前运行脚本的主机上重新检索实际路径
正确 ODBC 驱动路径的查找流程
- 先确认当前脚本运行的 Linux 主机已经安装适配 MSSQL 2016 的微软官方 ODBC 驱动,推荐使用 ODBC Driver 17/18 for SQL Server,过低版本的 ODBC 驱动对 2016 的兼容存在已知问题
- 两种方式可快速定位驱动的实际路径:
- 直接读取 ODBC 全局配置文件
odbcinst.ini(常规存放路径为/etc/odbcinst.ini、/usr/local/etc/odbcinst.ini),找到注册的 SQL Server 驱动条目,条目下的Driver=字段对应的全路径就是可直接写入连接串的有效值 - 执行系统命令
odbcinst -q -d列出当前主机所有已注册的 ODBC 驱动名称,再通过文件检索定位对应驱动的存储路径,不需要手动在目录里逐层查找
示例的 ODBC 配置文件条目:
[ODBC Driver 17 for SQL Server] Description=Microsoft ODBC Driver 17 for SQL Server Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.5.1 UsageCount=1 - 直接读取 ODBC 全局配置文件
- 实际写连接串的时候,既可以填写检索到的全路径,也可以直接填写配置文件里注册的驱动名称(比如
{ODBC Driver 17 for SQL Server}),ODBC 框架会自动匹配对应路径,不需要强制写全路径
连接串的适配修改要点
把原连接串和跨主机场景不匹配的内容逐一替换即可:
- 替换 Driver 字段:用前面检索到的当前主机的驱动信息替换原来截断的个人环境路径
- 替换 Server 字段:把原来的
localhost替换为远程 MSSQL 服务器的 IP 地址,如果 MSSQL 不是监听默认 1433 端口,需要在 IP 后用逗号拼接端口号,格式为数据库IP,端口号 - 把原来包裹 DSN 的单引号调整为双引号,保证 Perl 能正常解析字符串里的变量
修正后的核心代码示例:
#!/usr/bin/perl -w use strict; use DBI; my $user = 'SA'; my $password = ''; my $db_remote = '远程MSSQL服务器IP,1433'; my $dbh = DBI->connect("dbi:ODBC:Driver={ODBC Driver 17 for SQL Server};Server=$db_remote;Database=testsb;UID=$user;PWD=$password;Encrypt=optional") or die "Can't connect: " . DBI->errstr;
连接异常的快速校验
- 先确认当前主机到远程 MSSQL 的对应端口网络连通,没有办公网络的防火墙拦截
- 如果使用 ODBC Driver 18 版本,必须在连接串里添加
Encrypt=optional配置,否则会因为默认强制 TLS 加密校验失败,直接中断连接 - 不要尝试在远程 MSSQL 服务器上查找驱动路径,所有 ODBC 相关的配置都只需要在运行 Perl 脚本的本地主机上完成
内容的提问来源于stack exchange,提问作者Prakruthi Alosri
相关产品推荐
相关产品推荐

