错误: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 && sqlcmd -S mssqlsrvhostname -U dbuser -P mysecritpassword
。这应该会打开sqlcmd
REPL 的1>
提示符。
我无法使用选项 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 <server_name>
工作得很好。现在你可能需要类似的东西
sqlcmd -S tcp:127.0.0.1,<port_number>
或
sqlcmd -S tcp:<server_name>.<AD domain>.<domain name>,<port_number>
【讨论】:
【参考方案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期间的主要内容,如果未能解决你的问题,请参考以下文章
服务器踩坑SSMS链接Ubuntu上的SQL Server 2019 报错 TCP Provider: Error code 0x2746
为啥.net网站访问出错 provider: TCP 提供程序, error: 0 -
在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)