Linux环境下SQL Server连接异常:.NET应用本地连接失败请求排查
解决本地SQL Server连接报错0x2746的方案
这个0x2746错误我之前在Linux环境折腾SQL Server时碰到过好几次,本质就是TLS版本不兼容——你的本地SQL Server大概率还在使用旧版TLS(比如1.0/1.1),而ODBC Driver 17默认要求TLS 1.2及以上,两者不匹配就导致连接失败。你能正常连Azure生产库也佐证了这点,因为Azure SQL早就强制要求TLS 1.2了。
下面是一步步的排查和解决步骤:
1. 强制启用系统TLS 1.2(推荐方案)
Linux系统默认可能没开TLS 1.2支持,或者SQL Server没配置使用它。你可以通过修改SQL Server的注册表(是的,Linux上SQL Server也用Windows风格的注册表)来启用:
用PowerShell配置(需管理员权限)
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'Enabled' -Value 1 -PropertyType DWORD -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'DisabledByDefault' -Value 0 -PropertyType DWORD -Force | Out-Null New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value 1 -PropertyType DWORD -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'DisabledByDefault' -Value 0 -PropertyType DWORD -Force | Out-Null
配置完后重启SQL Server服务和你的.NET应用:
sudo systemctl restart mssql-server
2. 临时兼容旧版TLS(快速测试)
如果不想改系统配置,可以先通过sqlcmd的参数临时绕过TLS版本检查验证:
sqlcmd -S localhost,1433 -U SA -p -C
这里的-C参数表示信任服务器证书,同时允许TLS版本降级。如果这个命令能连上,就坐实了是TLS版本的问题。
对于你的.NET应用,也可以在连接字符串里添加兼容配置:
Server=localhost,1433;Database=YourDatabaseName;User Id=SA;Password=YourPassword;Encrypt=Optional;TrustServerCertificate=True;TlsVersion=Tls12
3. 确认SQL Server的TCP监听配置
有时候不是TLS的问题,而是SQL Server没开TCP/IP监听:
- 用
mssql-conf命令启用TCP监听:sudo /opt/mssql/bin/mssql-conf set network.tcpenabled 1 - 重启服务后,用
netstat检查1433端口是否被监听:netstat -ano | findstr :1433
4. 排查Linux防火墙拦截
虽然是本地连接,但Linux的防火墙(比如ufw、firewalld)可能误拦截了1433端口:
- 临时关闭防火墙测试:
# 针对ufw sudo ufw disable # 针对firewalld sudo systemctl stop firewalld - 如果能连上,就把1433端口加入白名单:
sudo ufw allow 1433/tcp sudo ufw reload
内容的提问来源于stack exchange,提问作者msmaldi
相关产品推荐
相关产品推荐

