尝试通过 ODBC 从 Linux 连接到 SQL Server 2014 时出现错误代码 0x2746 (10054)

问题描述 投票:0回答:4

Ubuntu 22.04.1 LTS

pyodbc 4.0.35

OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

遵循为SQL Server (Linux) 安装Microsoft ODBC 驱动程序的步骤

安装成功。当我运行这段代码时

def select_driver():
    """Find least version of: ODBC Driver for SQL Server."""
    drv = sorted([drv for drv in pyodbc.drivers() if "ODBC Driver " in drv and " for SQL Server" in drv])
    if len(drv) == 0:
        raise Exception("No 'ODBC Driver XX for SQL Server' found.")
    return drv[-1]

print(select_driver()) 

输出是:

ODBC Driver 18 for SQL Server

我的连接字符串 .

cnxn_str = ("Driver={SQL Server Native Client 18.0};"
            "Server=xx;"
            "Database=xx;"
            "UID=xx;"
            "PWD=xx")
myCon = pyodbc.connect(cnxn_str)

编辑:使用新连接“Driver={ODBC Driver 18 for SQL Server};”

[Microsoft][ODBC Driver 18 for SQL Server]TCP Provider: Error code 0x2746 (10054) (SQLDriverConnect)')

编辑:root@vps:~# openssl version -a

OpenSSL 3.0.2 2022 年 3 月 15 日(库:OpenSSL 3.0.2 2022 年 3 月 15 日)已构建 时间:2022 年 10 月 27 日星期四 17:06:56 UTC 平台:debian-amd64 选项: bn(64,64) 编译器:gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -ffile-prefix-map=/build/openssl-WsPfAX/openssl-3.0.2=。 -flto=auto-ffat-lto-object s -flto=auto-ffat-lto-objects-fstack-protector-strong-Wformat -Werror=格式安全 -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PI C -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2 OPENSSLDIR:“/usr/lib/ssl” ENGINESDIR: “/usr/lib/x86_64-linux-gnu/engines-3”MODULESDIR: “/usr/lib/x86_64-linux-gnu/ossl-modules” 播种源:特定于操作系统 CPUINFO: OPENSSL_ia32cap=0xffbaa2234f8bffff:0x400000283

python sql-server ubuntu odbc pyodbc
4个回答
2
投票

我在尝试从 Ubuntu 22.04 服务器中的 PHP 8.1 连接到 Microsoft SQL Server 2014 时遇到了同样的问题。

OpenSSL 3.0(随 Ubuntu 22.04 一起提供)更改了 SECLEVEL 的默认行为。现在您需要指定 0 而不是 1。更多信息在这里:https://github.com/openssl/openssl/issues/17476

两件不同的事情为我解决了这个问题:

如上所述,在/etc/ssl/openssl.cnf

变化:

[系统默认教派] 密码字符串 = 默认值:@SECLEVEL=2

致:

[系统默认教派] CipherString = 默认值:@SECLEVEL=0

此外,在用 PHP 建立连接(我想这在 Python 中也可以)到 SQL 服务器时,添加以下选项:

“加密”=>真,“TrustServerCertificate”=>真


1
投票

Ubuntu 20.04 对我有用,不知何故升级到 22.04 后,一切都坏了。需要将 SSL 降级到 1.1

wget    https://packages.microsoft.com/ubuntu/20.04/prod/pool/main/m/msodbcsql17/msodbcsql17_17.6.1.1-1_amd64.deb
wget    https://packages.microsoft.com/ubuntu/20.04/prod/pool/main/m/mssql-tools/mssql-tools_17.6.1.1-1_amd64.deb

sudo dpkg -i msodbcsql17_17.6.1.1-1_amd64.deb
sudo dpkg -i mssql-tools_17.6.1.1-1_amd64.deb

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/openssl_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i openssl_1.1.1f-1ubuntu2_amd64.deb

1
投票

2023 年 3 月

在为 AWS Sagemaker 处理作业构建基于 ubuntu:20.04 的 docker 镜像后,我遇到了同样的问题。我通过安装特定版本的 openssl,即 1.1.1p 解决了这个错误。

这是我添加到我的 docker 文件中的命令:

RUN wget https://www.openssl.org/source/openssl-1.1.1p.tar.gz -O openssl-1.1.1p.tar.gz && \
tar -zxvf openssl-1.1.1p.tar.gz && \
cd openssl-1.1.1p && \
./config && \
make && \
make install && \
ldconfig

这一行应该添加到安装适当的 Microsoft SQL Server ODBC 驱动程序的命令之前(在我的例子中是 msodbcsql17)


0
投票

从 ubuntu (22.04) 连接到 MSSQL

  1. 首先,使用pip安装pyodbc(首选)

  2. 安装 Microsoft ODBC 驱动程序,可以在这里找到

  3. 打开 /opt/ssl/openssl.conf 并更新 [system_default_sect] 部分包含以下

    CipherString = 默认值:@SECLEVEL=0

  4. 重启系统

  5. python中的连接测试:

import pyodbc
import pandas as pd
cnxn_str = ("Driver={ODBC Driver 18 for SQL Server};"
            "Server=ServerName,Port;"
            "Database=DBName;"
            "UID=xx;"
            "PWD=xx;"
            "TrustServerCertificate=yes;")

# initialise connection
cnxn = pyodbc.connect(cnxn_str)  
# build up our query string
query = ("SELECT TOP(10) * FROM DB")
# execute the query and read to a dataframe in Python
data = pd.read_sql(query, cnxn)
© www.soinside.com 2019 - 2024. All rights reserved.