错误:TCP 提供程序:错误代码 0x2746。在 Linux 中通过终端进行 Sql 设置时
- 2024-10-22 08:29:00
- admin 原创
- 76
问题描述:
我正在尝试按照文档
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:错误:SQL Server 的 Microsoft ODBC 驱动程序 17:TCP 提供程序:错误代码 0x2746。Sqlcmd:错误:SQL Server 的 Microsoft ODBC 驱动程序 17:客户端无法建立连接。
我也尝试过给出命令
sqlcmd -S 127.0.0.1 -U SA -P '<YourPassword>'
但还是会显示同样的错误。当我输入错误的密码时,也会显示同样的错误。
解决方案 1:
[更新 2020.03.17: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 中应用的 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 库是可行的。
因此只需执行以下操作:
停止 SQL ServerStop 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
解决方案 2:
如果您在 Debian 10 上使用 OpenSSL1.1.1 的客户端时遇到问题,解决方法是恢复为之前默认的较弱密钥长度。操作如下:
修改/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/ContinouslyIntegration/TriagingTips/openssl-1.1.1
解决方案 3:
sudo apt-get install mssql-server=14.0.3192.2-2
恢复到该版本对我有用。
我的情况是在 Ubuntu Server 18.04.2 上全新安装(所有版本均为最新版本),收到来自 sqlcmd 的客户端连接错误:
Sqlcmd:错误:SQL Server 的 Microsoft ODBC 驱动程序 17:TCP 提供程序:错误代码 0x2746
解决方案 4:
简单地:
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/(CipherStrings*=s*DEFAULT@SECLEVEL=)2/ /' /etc/ssl/openssl.cnf
是的,它是.cnf。
如果您的文件中含有 SECLEVEL /etc/ssl/openssl.cnf
,此命令会将其更改为 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:
从 Ubuntu 16.04 升级到 18.04 仍然会导致一些问题
一些系统可能需要 1.0 版 OpenSSL 库才能连接到 SQL Server。使用 OpenSSL 1.0 可以按如下方式完成:
停止 SQL ServerStop 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
我希望这有帮助
解决方案 6:
您可以使用命令 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的交互存在一些问题,我不知道是否属实,但在 Google 上搜索了一些相关注释。因此,您可以使用
apt-cache policy openssl
sudo apt-get install openssl=<version>
openssl version
更改 openssl 版本并尝试连接。
解决方案 8:
今天将 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
解决方案 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 \n && 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/
解决方案 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:
已解决 RHEL 9 问题
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : TCP Provider: Error code 0x2749.
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to localhost. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
解决方案
update-crypto-policies --set LEGACY
CentOS Stream 版本 9
内核 5.14.0-75.el9.x86_64
openssl 版本:OpenSSL 3.0.7.2 Nov 2022
文档:
第 4 章 使用系统范围的加密策略
解决方案 13:
目前,只有这个版本可以运行,看起来像是 openssl 中的问题。
在 Debian 9 上工作。
首先请确保您有有效的数据库备份。
您需要清除 mssql-server
apt-get 删除 --purge mssql-server
然后检查并删除 /var/opt/mssql 和 /opt/mssql 。
接下来使用此版本15.0.1700.37-2
apt-get 安装 mssql-server=15.0.1700.37-2
配置后,您应该能够连接到 localhost 或 127.0.0.1 上的 mssql server 2019
sqlcmd -S localhost -U SA -P'你的密码'
解决方案 14:
经过两天的努力,我终于解决了这个问题!就我而言,我使用的是 Fedora 28,因此对于那些使用 RHEL 的人,我遵循了本教程:
在 Red Hat Enterprise Linux 8 Beta 上安装 Microsoft SQL Server
那么,您使用的是 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 文档教程。
在 RHEL 上安装 SQL Server 2017 的 Microsoft 教程
在 Ubuntu 上安装 SQL Server 2017 的 Microsoft 教程
注意:我在一些论坛上看到 SQL Server 2019 可能会导致该问题,因此我建议安装 2017 版本。
解决方案 15:
我遇到了同样的问题。
我的操作系统是 Ubuntu 18.10
sudo apt-get install mssql-server=14.0.3192.2-2
然后,就我而言,我无法进入我的 SQL 服务器,因为我收到以下消息
Sqlcmd:错误:SQL Server 的 Microsoft ODBC 驱动程序 17:用户“sa”登录失败。原因:服务器处于脚本升级模式。目前只有管理员可以连接。
然后,我按照ServerFault 答案
就我的情况而言,每个命令都需要一段时间才能完成。
解决方案 16:
更新 2021、Fedora 34、Sql Server 2019。
如果仍然有该错误,则需要执行以下命令:
dnf install openldap-compat
或者通过以单一模式启动 mssql 来检查控制台中实际发生的情况:
sudo -u mssql /opt/mssql/bin/sqlservr -m
您可以在此处找到更多信息: https: //learn.microsoft.com/en-us/sql/linux/sql-server-linux-troubleshooting-guide ?view=sql-server-ver15#connection
解决方案 17:
我不再建议降低 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 解析错误,而旧版本中没有这个错误。这意味着你需要完整的域名或 ipaddress,此外可能还需要连接协议或端口号。所以以前像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>
解决方案 18:
就我而言,问题是由安装问题引起的。我在这里找到了解决方案:https ://github.com/microsoft/mssql-docker/issues/603#issuecomment-652958304
由于某种原因,如果您映射/var/opt/mssql/
,而不仅仅是/var/opt/mssql/data
,则在 Windows 文件系统上会失败。在 Linux 文件系统上执行此操作没有问题。
解决方案 19:
如果你使用多个 php 版本,请删除所有不需要的版本
sudo apt-get purge php5.*
sudo apt-get purge php5.6 #specific version
重新启动 apache2 或 nginix 服务器 重新启动 phpsudo service php7.4-fpm restart
解决方案 20:
经过两天的努力,根据各种来源的建议,我尝试:
将 openssl 从 3 降级到 1
将 Microsoft ODBC Driver 18 降级至 17
使用 TLS 支持更新 sql 2008 r2 SP3
更改 MinProtocol = TLSv1 和 CipherString = DEFAULT@SECLEVEL=1
在 Windows 中设置协议注册表以接受 TLS1.0-TLS1.3
没有任何成功:
错误:0A000102:SSL 例程::不支持的协议]
错误:0A0C0103:SSL 例程::内部错误]
TCP 提供程序:错误代码 0x2746(所有更改后的最后一个)
我最终找到了安装较低版本 ODBC Driver 17 的解决方案:
libmsodbcsql-17.10.so.1.1(不起作用)-> libmsodbcsql-17.6.so.1.1(起作用)
似乎 libmsodbcsql-17.10 不适用于 sql 2008 r2,而 libmsodbcsql-17.6 可以
解决方案 21:
更新 2023,SQL Server 2012,带有 ODBC 驱动程序 18 的 Ubuntu 22.10(安装说明),:
这不适用于 22.04,只适用于 22.10+为什么?因为 22.04 版本包含不完整的unixodbc-dev
软件包。只有 22.10 包含一个工作unixodbc-dev
版本2.3.11-2
(更多信息)。我无法在 22.04 上安装 PHPsqlsrv
模块php_sqlsrv
。
我现在正在使用:
/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.2.so.1.1
从
cat /etc/apt/sources.list.d/mssql-release.list
deb [arch=amd64,armhf,arm64] https://packages.microsoft.com/ubuntu/22.10/prod kinetic main
openssl version
OpenSSL 3.0.5 5 Jul 2022 (Library: OpenSSL 3.0.5 5 Jul 2022)
odbcinst -q -d
[ODBC Driver 18 for SQL Server]
env | grep OPEN
OPENSSL_CONF=/home/knb/.ssh/openssl-conf-TLS1.1-mssql.cnf
# for command line tools sqmlcmd and isql see file below
# "-C ": set "TrustServerCertificate=yes;" in the connection string.
export OPENSSL_CONF=${HOME}/.ssh/openssl-conf-TLS1.1-mssql.cnf && \n sqlcmd -S myserver -Uknb -Pxxxxx -C -q "select @@version;"
结果:Microsoft SQL Server 2012 (SP4-GDR) (KB4583465) - 11.0.7507.2 (X64)
文件/home/knb/.ssh/openssl-conf-TLS1.1-mssql.cnf
(对于其中的大部分,我不知道它是什么意思)
HOME = .
oid_section = new_oids
# System default
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT@SECLEVEL=0
[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
dir = ./demoCA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
# several certs with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
x509_extensions = usr_cert # The extensions to add to the cert
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD
preserve = no # keep passed DN ordering
policy = policy_match
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extensions to add to the self signed cert
string_mask = utf8only
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
[ usr_cert ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
[ tsa ]
default_tsa = tsa_config1 # the default TSA section
[ tsa_config1 ]
dir = ./demoCA # TSA root directory
serial = $dir/tsaserial # The current serial number (mandatory)
crypto_device = builtin # OpenSSL engine to use for signing
signer_cert = $dir/tsacert.pem # The TSA signing certificate
# (optional)
certs = $dir/cacert.pem # Certificate chain to include in reply
# (optional)
signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
signer_digest = sha256 # Signing digest to use. (Optional)
default_policy = tsa_policy1 # Policy if request did not specify it
# (optional)
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits = 0 # number of digits after dot. (optional)
ordering = yes # Is ordering defined for timestamps?
# (optional, default: no)
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)
ess_cert_id_alg = sha1 # algorithm to compute certificate
# identifier (optional, default: sha1)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件