错误:TCP提供程序:错误代码0x2746。在Linux终端中进行SQL安装期间的设置。

82

我正在按照文档https://learn.microsoft.com/pl-pl/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-2017在我的Linux系统中设置ms-sql服务器。

SQL服务器状态为活动(运行中)。

执行命令时,我遇到了以下错误:

sqlcmd -S localhost -U SA -P '<YourPassword>'

错误:

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP Provider Error code 0x2746。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:客户端无法建立连接。

我也尝试通过给出命令来解决问题。

sqlcmd -S 127.0.0.1 -U SA -P '<YourPassword>' 

但是同样的错误仍然显示。 当我尝试错误密码时,也会显示相同的错误。


从SSMS来看,这表现为错误10054,当然在十进制中是0x2746。感谢您发布这个问题...您已经帮助了很多人。 - Lynn Crumbling
这个答案简化了您需要做的事情:https://dev59.com/MVMI5IYBdhLWcg3wCWwo#61111267 - ofundefined
21个回答

123
[更新于2020年3月17日:微软发布了带有Ubuntu 18.04存储库的SQL Server 2019 CU3版本。请参见:https://techcommunity.microsoft.com/t5/sql-server/sql-server-2019-now-available-on-ubuntu-18-04-supported-on-sles/ba-p/1232210。我希望现在它已经完全兼容,没有任何ssl问题。还未测试。]

回退到14.0.3192.2-2有助于解决问题。

但是也可以使用Ola774指出的方法来解决问题,不仅适用于从Ubuntu 16.04升级到18.04的情况,而且适用于在Ubuntu 18.04上安装SQL Server 2017的每个实例。

看起来微软在cu16中搞砸了他们自己在cu10中针对ssl版本问题应用的补丁(https://techcommunity.microsoft.com/t5/SQL-Server/Installing-SQL-Server-2017-for-Linux-on-Ubuntu-18-04-LTS/ba-p/385983)。但是链接ssl 1.0.0库可以解决问题。

所以只需执行以下操作:

  1. 停止SQL Server

sudo systemctl stop mssql-server 
  • 通过打开服务配置编辑器来

    sudo systemctl edit mssql-server 
    
    这将创建原始服务配置的覆盖。第一次使用“附加文件”时,即“drop-in-file”,为空是正确的。
    在编辑器中,向该文件添加以下行并保存:
    [Service]
    Environment="LD_LIBRARY_PATH=/opt/mssql/lib" 
    
  • 创建符号链接以便SQL Server使用OpenSSL 1.0:

  • sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/mssql/lib/libssl.so 
    sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/mssql/lib/libcrypto.so 
    
  • 启动SQL Server

    sudo systemctl start mssql-server 
    

  • 6
    systemctl edit mssql-server 是空的。我不知道这是否符合预期。添加环境路径并创建符号链接解决了我的问题。mssql-server: 已安装版本为 14.0.3223.3-15。 - stinkyjak
    3
    对于我(Ubuntu 18.04),在第2步骤中运行“sudo nano /lib/systemd/system/mssql-server.service”以编辑服务配置文件。否则,配置文件像@stinkyjak所写的那样为空。此外,在第5步骤之前,您必须运行“sudo systemctl daemon-reload”。 - Hunv
    1
    在Debian 9中,我不得不做同样的事情,但是将符号链接指向libssl.so.1.0.2和libcrypto.so.1.0.2。谢谢! - BigBother
    4
    我刚在Ubuntu 18.04.3上安装了SQL Server 2019 (15.0.2000.5),上述内容仍然是答案。 - Lance Perry
    Ubuntu 19.10与ODBC驱动程序17只需要进行符号链接(#4)并重新启动。 - Josh Sharkey
    显示剩余12条评论

    47

    2
    只是想说这也是我的解决办法。比起降级 OpenSSL,似乎更安全。 - Quinten
    1
    如果可以的话,我会点赞十几次。在尝试将我的开发容器从Python 3.7更新到3.8时,我一直被0x2746错误代码困扰了两天,它强制升级了Debian Stretch到Buster,引入了这个变化并破坏了整个工作...这个方法解决了问题! - Vaelek
    2
    如果您不想为整个系统降低安全性,您可以拥有本地修改过的/etc/ssl/openssl.cnf副本,并且针对需要与SQL Server通信的进程,设置环境变量OPENSSL_CONF指向该副本。 - liori
    如果CipherString = DEFAULT@SECLEVEL=1没有帮助的话,可能还需要MinProtocol = TLSv1.1 - bartolo-otrit
    如果CipherString = DEFAULT@SECLEVEL=1无法解决问题,可能还需要MinProtocol = TLSv1.1 - undefined

    29
    sudo apt-get install mssql-server=14.0.3192.2-2
    

    回滚到这个版本对我起了作用。

    我的情况是在Ubuntu服务器18.04.2上进行的全新安装(所有版本都是最新的),从sqlcmd接收到客户端连接错误:

    Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP提供程序:错误代码0x2746


    感谢您来自哥伦比亚的解决方案。 - JALF

    24

    简单:

    TCP Provider:错误代码0x2746

    这很可能是openssl与sql-server协议/版本之间的问题。

    检查您的openssl版本。在终端上运行以下命令openssl version

    $ openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    

    如果您的openssl版本不是1.0,则可以通过以下选项之一解决连接问题:

    选项1:解决openssl兼容性问题

    sed -i -E 's/(CipherString\s*=\s*DEFAULT@SECLEVEL=)2/\11/' /etc/ssl/openssl.cnf
    

    是的,它是.cnf文件。

    如果您在/etc/ssl/openssl.cnf文件中拥有SECLEVEL,此命令会将其更改为1。完成。

    选项2:降级openssl。

    如果您的openssl版本是1.1,您可能希望将其降级到1.0。 这种方法很基础:下载源代码,配置并制作二进制文件。构建所有内容可能需要几分钟时间:

    cd /usr/local/src/
    wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1k.tar.gz
    tar -xvf /usr/local/src/openssl-1.0.1k.tar.gz
    cd /usr/local/src/openssl-1.0.1k
    ./config --prefix=/usr/local/ --openssldir=/usr/local/openssl
    make
    make test
    make install
    mv /usr/bin/openssl /usr/bin/openssl-bak
    
    然后
    cp -p /usr/local/openssl/bin/openssl /usr/bin/openssl
    
    或者
    cp -p /usr/local/ssl/bin/openssl /usr/bin/openssl
    ll -ld /usr/bin/openssl
    openssl version
    

    如果你需要针对特定内容(如Docker镜像、不同操作系统等)获取洞见,请留下评论。


    5
    选项1解决了我在docker容器中连接SQL Server实例的问题,这个问题花费了我将近一整天的时间才解决。SECLEVEL 1工作得很好。 有关seclevel的参考,请参阅https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_security_level.html#DEFAULT-CALLBACK-BEHAVIOUR - mgefvert
    2
    如果您不想降低整个系统的安全性,则可以在本地修改/etc/ssl/openssl.cnf文件,并为需要与SQL Server通信的进程设置环境变量OPENSSL_CONF以指向该文件的位置。 - liori
    1
    我无法使用选项1,因为配置文件中没有这一行。即使我添加了它,问题仍将存在。选项2在进行测试时出现错误。 - Andres Mora
    将SECLEVEL从2降级为1只有在使用ODBC驱动程序17和相应的mssql-tools软件包时才有效。我无法使用使用ODBC驱动程序18的mssql-tools18 sqlcmd进行连接 - 无论是使用SECLEVEL 2还是SECLEVEL 1都无法连接,其中SECLEVEL对应于openssl.cnf文件中的CipherString属性的值:$ sudo grep CipherString /etc/ssl/openssl.cnf CipherString = DEFAULT:@SECLEVEL=1 - undefined

    20

    从Ubuntu 16.04升级到18.04仍然存在一些问题。

    少数系统可能需要使用OpenSSL库的1.0版本才能连接到SQL Server。可以按以下方式使用OpenSSL 1.0:

    停止SQL Server

    sudo systemctl stop mssql-server
    

    打开服务配置的编辑器

    sudo systemctl edit mssql-server
    
    在编辑器中,将以下行添加到文件中并保存:
    [Service]
    Environment="LD_LIBRARY_PATH=/opt/mssql/lib"
    

    创建符号链接以供SQL Server使用 OpenSSL 1.0

    sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/mssql/lib/libssl.so
    sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/mssql/lib/libcrypto.so
    

    启动SQL Server

    sudo systemctl start mssql-server
    

    我希望这有所帮助。


    谢谢!这正是我们需要的。似乎符号链接在安装时没有被创建?虽然与此无关,但我们还必须将mssql-tools 的sqlcmd 符号链接到/bin中,否则它是不可访问的。我们遇到的所有3个安装后问题都与未创建符号链接有关。 - Radai

    14
    你可以通过命令sudo apt-get install mssql-server=14.0.3192.2-2 回滚到先前版本或按照MSSQL_Ubuntu的答案保留新版本。
    此外,禁用 mssql-server包上的更新。
    sudo apt-mark hold mssql-server
    
    这不会阻止您在希望时手动更新它。

    这不会阻止您在希望时手动更新它。


    7

    遇到同样的问题。这太糟糕了,因为我现在正在进行开发,而这个“伟大”的更新只是浪费我的工作时间。

    更新: 回滚到MS SQL版本可以帮助我,但不幸的是我必须删除所有数据。谢天谢地这是我的开发机器。以下所有注释都经过测试。

    ijin -> lsb_release -a
    No LSB modules are available.
    Distributor ID: LinuxMint
    Description:    Linux Mint 19 Tara
    Release:        19
    Codename:       tara
    

    1) 我已经移除了MS SQL及其数据

    sudo rm -rf /var/opt/mssql
    sudo apt-get purge mssql-server mssql-tools
    sudo apt-get autoremove
    sudo apt-get autoclean
    

    2) 检查仓库中可用的 MS SQL 版本

    ijin -> apt-cache policy mssql-server
    

    3) 安装自定义的 MS SQL

    sudo apt-get install mssql-server=15.0.1600.8-1 mssql-tools
    

    4) 设置

    sudo /opt/mssql/bin/mssql-conf setup
    

    5) 内存限制,服务器代理

    sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true 
    sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 3072
    

    4) 重启,状态

    sudo service mssql-server restart
    sudo service mssql-server status
    

    可能是openssl软件包与更新的MS SQL相互作用存在一些问题。我无法确定这是否为真,但在谷歌上搜索到了一些笔记。因此,您可以使用

    apt-cache policy openssl
    sudo apt-get install openssl=<version>
    openssl version
    

    更改openssl版本并尝试连接。


    我推荐@MSSQL_Ubuntu的解决方案,它使用环境变量和符号链接到新的SSL和加密库。也就是说,在微软修复他们的更新之前,这是一个好的解决方案。清除工作过,但后来我遇到了问题,而且清除之后问题还会再次出现。 - stinkyjak
    10x 挽救了我的一天。 - Valentin Petkov
    对我来说,下载libssl1.0.0_1.0.2l-1_bpo8+1_amd64.deb和openssl_1.0.2l-1_bpo8+1_amd64.deb并提取libssl.so.1.0.0和libcrypto.so.1.0.0到/opt/mssql/lib,然后将它们分别命名为libssl.so和libcrypto.so。 - Joseph Moreno
    1
    这帮助了我使用Debian 10(Buster)。 - Phoenix

    4

    今天我将SQL Server升级到版本14.0.3223.3-15(Ubuntu 18.04.2 LTS),但本地和远程连接都出现了完全相同的问题。回滚到以前的版本(在我的情况下是14.0.3192.2-2)对我有用:

    sudo apt-get install mssql-server=14.0.3192.2-2

    列出计算机上安装的版本:

    apt-cache policy mssql-server


    4

    我在docker容器中遇到了相同的问题,必须将msodbc、mssql-tools和lib ssl降级:

    RUN ACCEPT_EULA=Y apt-get install msodbcsql17=17.3.1.1-1 mssql-tools=17.3.0.1-1 -y
    RUN wget http://security.debian.org/debian-security/pool/updates/main/o/openssl1.0/libssl1.0.2_1.0.2s-1~deb9u1_amd64.deb \
        && dpkg -i libssl1.0.2_1.0.2s-1~deb9u1_amd64.deb
    

    现在它的运行效果非常棒。

    如果需要,可在此找到较旧版本的ms odbc驱动程序和工具:https://packages.microsoft.com/debian/9/prod/pool/main/m/

    对于openssl:http://security-cdn.debian.org/debian-security/pool/updates/main/o/openssl1.0/


    1
    未找到“msodbcsql17=17.3.1.1-1”软件包。 - Necro
    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 dpkg -i msodbcsql17_17.6.1.1-1_amd64.deb 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 - Hairy Ass

    4

    尝试了几种解决方案后,我找到了这个:
    https://www.youtube.com/watch?v=mfLbCarRzpg

    sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/mssql/lib/libssl.so
    sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/mssql/lib/libcrypto.so
    
    sudo systemctl stop mssql-server
    sudo systemctl edit mssql-server
    

    添加以下内容:

    [Service]
    Environment="LD_LIBRARY_PATH=/opt/mssql/lib"
    

    然后重新启动服务器:

    sudo systemctl start mssql-server
    

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