错误:TCP 提供程序:错误代码 0x2746。在通过终端在linux中设置Sql期间

Posted

技术标签:

【中文标题】错误:TCP 提供程序:错误代码 0x2746。在通过终端在linux中设置Sql期间【英文标题】:Error: TCP Provider: Error code 0x2746. During the Sql setup in linux through terminal 【发布时间】:2019-12-07 12:09:24 【问题描述】:

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

SQL 服务器状态为 Active (Running)。

执行命令时出现以下错误

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

错误:

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序: 错误代码 0x2746。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL 服务器:客户端无法建立连接。

我也尝试通过给出命令

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

但显示相同的错误。当我尝试错误的密码时,它也会显示相同的错误。

【问题讨论】:

来自 SSMS,这表现为错误 10054,当然是十进制的 0x2746。感谢您发布此问题...您帮助了很多人。 这个答案简化了你需要做的事情:***.com/a/61111267/9535070 【参考方案1】:

同样的问题。这太糟糕了,因为我现在在开发中,而那个“很棒的”更新只是浪费了我的工作时间。

更新: 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 的解决方案,它带有 env var 和指向新 ssl 和加密库的符号链接。也就是说,直到 MS 修复他们的更新。清除之前有效,但后来我遇到了问题,但没有。 10 倍节省我的一天 对我来说,下载 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。 这帮助我使用了 debian 10 (buster)【参考方案2】:

在解决这个问题两天后,我终于解决了!就我而言,我使用的是 Fedora 28,所以对于那些使用 RHEL 的人,我遵循了这个教程:

Installing Microsoft SQL Server on Red Hat Enterprise Linux 8 Beta

那么,您使用的是 Python 3 吗?显然,您需要在安装之前切换到 Python 2,使用以下代码(我猜在 Ubuntu 中也可以):

sudo alternatives --config python

从https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo创建一个仓库

下载它,然后在不解决依赖关系的情况下安装它。

之后,您可以运行 mssql-conf 的设置:

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

然后从该步骤继续 Microsoft 文档教程。

Microsoft Tutorial for installing SQL Server 2017 on RHELMicrosoft Tutorial for installing SQL Server 2017 on Ubuntu

注意:我在一些论坛上看到 SQL Server 2019 可能会导致该问题,因此我建议安装 2017 版本。

【讨论】:

【参考方案3】:

今天将 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】:

从 Ubuntu 16.04 升级到 18.04 仍然会导致一些问题

一些系统可能需要 1.0 版的 OpenSSL 库才能连接到 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"

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

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

希望对你有帮助

【讨论】:

谢谢!这正是我们所需要的。似乎没有在安装时创建符号链接?不相关,但我们还必须对 /bin 中的 mssql-tools 的 sqlcmd 进行符号链接,因为否则无法访问它。我们遇到的所有 3 个安装后问题都与未创建的符号链接有关。【参考方案5】:
sudo apt-get install mssql-server=14.0.3192.2-2

恢复到这个版本对我有用。

我的场景是在 Ubuntu Server 18.04.2 上进行全新安装(所有最新版本),从 sqlcmd 接收客户端连接错误:

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

【讨论】:

感谢哥伦比亚的解决方案【参考方案6】:

您可以使用命令 sudo apt-get install mssql-server=14.0.3192.2-2回滚到以前的版本,或者通过关注MSSQL_Ubuntu's answer保持新版本

另外禁用更新 mssql-server 包:

sudo apt-mark hold mssql-server

这不会阻止您在需要时手动更新它。

【讨论】:

【参考方案7】:

[更新 17.03.2020:Microsoft 发布了带有 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 (https://techcommunity.microsoft.com/t5/SQL-Server/Installing-SQL-Server-2017-for-Linux-on-Ubuntu-18-04-LTS/ba-p/385983) 中应用的 ssl 版本问题提供了自己的补丁。但是链接 ssl 1.0.0 库是可行的。

所以只需执行以下操作:

    停止 SQL Server

    sudo systemctl stop mssql-server 
    

    通过

    打开服务配置的编辑器
    sudo systemctl edit mssql-server 
    

这将为原始服务配置创建覆盖。第一次使用时覆盖文件,或者更准确地说是“drop-in-file”是空的,这是正确的。

    在编辑器中,将以下行添加到文件中并保存:

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

    创建指向 OpenSSL 1.0 的符号链接以供 SQL Server 使用:

    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 
    

【讨论】:

systemctl edit mssql-server 为空。我不知道这是否可以预料。添加环境路径并创建符号链接解决了我的问题。 mssql-server:已安装:14.0.3223.3-15 谢谢!此解决方案适用于 mssql-server 版本 15.0.1900.25-1。 对于我 (Ubuntu 18.04) 在步骤 2 中运行“sudo nano /lib/systemd/system/mssql-server.service”来编辑服务配置。否则,配置就像@stinkyjak 写的那样是空的。此外,您必须在第 5 步之前运行“sudo systemctl daemon-reload”。 在 debian 9 中我也必须这样做,但将符号链接指向 libssl.so.1.0.2 和 libcrypto.so.1.0.2。谢谢! 我刚刚在 Ubuntu 18.04.3 上安装了 SQL Server 2019 (15.0.2000.5),上面列出的仍然是答案【参考方案8】:

我遇到了同样的问题。

我的操作系统是 Ubuntu 18.10

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

然后,就我而言,我无法进入我的 SQL 服务器,因为我收到了以下消息

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:用户“sa”登录失败。原因:服务器处于脚本升级模式。目前只有管理员可以连接..

然后,我关注the ServerFault Answer

在我的例子中,每个命令都需要一段时间。

【讨论】:

【参考方案9】:

我在 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/

【讨论】:

msodbcsql17=17.3.1.1-1 找不到包。【参考方案10】:

在尝试了一些解决方案后,我发现了这个: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

【讨论】:

【参考方案11】:

我在 Debian 10 上遇到了与 SQL Server 2019 (RTM - 15.0.2000.5) 相同的问题,都尝试使用 sqlcmd 本地连接或通过 SSMS 远程连接。

上述相同的解决方案能够为我解决这个问题。我的 OpenSSL 版本是 1.0.2,应该针对可用的版本进行调整。

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

sudo systemctl restart mssql-server

现在本地和远程连接都可以正常工作了

【讨论】:

【参考方案12】:

目前,只有这个版本在工作,看起来是 openssl 的问题。

在 Debian 9 上工作。

在做任何事情之前,请确保您拥有有效的数据库备份。

你需要清除 mssql-server

apt-get remove --purge mssql-server

然后检查并删除 /var/opt/mssql 和 /opt/mssql 。

接下来使用这个版本15.0.1700.37-2

apt-get install mssql-server=15.0.1700.37-2

配置后你应该可以在 localhost 或 127.0.0.1 连接到 mssql server 2019

sqlcmd -S localhost -U SA -P '你的密码'

【讨论】:

【参考方案13】:

如果您在使用 OpenSSL1.1.1 的 Debian 10 上遇到客户端问题,修复方法是恢复到以前默认的较弱密钥长度。 这样做:

修改/etc/ssl/openssl.cnf配置文件如下 (请参阅下面 Debian 10 中 OpenSSL 1.1.1 的已知问题):

将最后一行从CipherString = DEFAULT@SECLEVEL=2改为CipherString = DEFAULT@SECLEVEL=1

https://github.com/microsoft/msphpsql/issues/1021

https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1

【讨论】:

只是插话说这也是我的解决办法。似乎比降级 openssl 安全得多 如果可以的话,我会投票十几次。在尝试将我的开发容器从 python 3.7 更新到 3.8 时将我的头撞到错误代码 0x2746 2 天后,它强制从 Debian Stretch 升级到 Buster,这引入了这个更改并破坏了整个工作......这解决了它就像冠军! 如果您不想为整个系统降级安全性,您可以拥有/etc/ssl/openssl.cnf的本地修改副本,并且对于需要与SQL Server通信的进程,设置环境变量OPENSSL_CONF 指向它。【参考方案14】:

简单地说:

TCP 提供程序:错误代码 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,此命令会将您的 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

如果您需要一些特殊的见解,请离开 cmets:docker 映像或不同的系统等。

【讨论】:

选项 1 为我解决了从 docker 容器连接到 SQL Server 实例的问题,这需要将近一整天的时间才能弄清楚。 SECLEVEL 1 运行良好。有关 seclevel 参考,请参阅openssl.org/docs/man1.1.1/man3/… 如果你不想降低整个系统的安全性,你可以有一个本地的,修改后的/etc/ssl/openssl.cnf副本,对于需要与SQL Server通信的进程,设置环境变量OPENSSL_CONF 指向它。 有关详细信息,在您的自定义OPENSSL_CONF 中添加什么:请参阅用户“yitam”的this snippet:然后运行export OPENSSL_CONF=/path/to/my/custom/config/openssl.cnf &amp;&amp; sqlcmd -S mssqlsrvhostname -U dbuser -P mysecritpassword。这应该会打开sqlcmd REPL 的1&gt; 提示符。 我无法使用选项 1,因为配置文件没有这一行。即使我添加它,问题仍然存在。选项 2 在 make 测试中给了我错误 不适合我....【参考方案15】:

更新 2021、Fedora 34、Sql Server 2019。

如果仍然出现该错误,则需要执行以下命令:

dnf install openldap-compat

或者通过在单一模式下启动 mssql 来检查控制台中实际发生的情况:

sudo -u mssql /opt/mssql/bin/sqlservr -m

您可以在这里找到更多信息:https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-troubleshooting-guide?view=sql-server-ver15#connection

【讨论】:

【参考方案16】:

我不建议再降级 openssl,因为您应该能够通过升级到新版本来解决您遇到的任何 openssl 问题。在我的情况下 openssl 1.1.1k 工作。安装不在您的发行版中的 openssl 版本的最简单方法是从源代码安装。详情请见https://wiki.openssl.org/index.php/Compilation_and_Installation

对我来说,以下步骤就足够了,但我认为您还需要 build-essentials 和一些其他软件包。

git clone git://git.openssl.org/openssl.git
cd openssl/
git checkout OpenSSL_1_1_1k
chmod +x ./config
./config
make
sudo make install

但是,这将不再完全解决问题。 sqlcmd 似乎有一个旧版本中没有的 DNS 解析错误。这意味着您可能需要完整的域名或 IP 地址以及连接协议或端口号。所以在之前的事情像 sqlcmd -S 127.0.0.1 要么 sqlcmd -S &lt;server_name&gt; 工作得很好。现在你可能需要类似的东西 sqlcmd -S tcp:127.0.0.1,&lt;port_number&gt;sqlcmd -S tcp:&lt;server_name&gt;.&lt;AD domain&gt;.&lt;domain name&gt;,&lt;port_number&gt;

【讨论】:

【参考方案17】:

就我而言,问题是由安装问题引起的。我在这里找到了解决方案:https://github.com/microsoft/mssql-docker/issues/603#issuecomment-652958304

出于某种原因,如果您映射/var/opt/mssql/,而不仅仅是/var/opt/mssql/data,它会在Windows 文件系统上失败。在 Linux 文件系统上这样做没有问题。

【讨论】:

【参考方案18】:

如果您使用多个 php 版本,请删除所有不需要的版本

sudo apt-get purge php5.*
sudo apt-get purge php5.6  #specific version

重启 apache2 或 nginix 服务器 重启phpsudo service php7.4-fpm restart

【讨论】:

以上是关于错误:TCP 提供程序:错误代码 0x2746。在通过终端在linux中设置Sql期间的主要内容,如果未能解决你的问题,请参考以下文章

如何解决网络错误代码0x2746?

服务器踩坑SSMS链接Ubuntu上的SQL Server 2019 报错 TCP Provider: Error code 0x2746

为啥.net网站访问出错 provider: TCP 提供程序, error: 0 -

在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 -

SqlException,提供者:TCP 提供者,错误:35 - 捕获到内部异常)