CentOS 连接 SQL Server 的排查与修复指南
一 快速自检清单
- 确认服务运行:执行命令查看状态,必要时启动并设置开机自启
sudo systemctl status mssql-server
sudo systemctl start mssql-server && sudo systemctl enable mssql-server
- 本机连通性自检:
ss -lntp | grep 1433 或 netstat -anp | grep 1433(应看到 0.0.0.0:1433 或 :::1433 处于 LISTEN)
sudo firewall-cmd --query-port=1433/tcp(返回 yes 表示已放行)
- 远程连通性测试:
ping <服务器IP>
telnet <服务器IP> 1433(能连上会看到一个空白屏幕;连不上则先排查网络和防火墙)
- 客户端工具就绪:在 CentOS 上安装 ODBC 驱动并使用 sqlcmd 验证
sudo yum install -y msodbcsql17 mssql-tools unixODBC-devel
sqlcmd -S ,1433 -U SA -P ‘<密码>’ -Q “SELECT 1”
二 常见故障与修复
- 服务未启动或异常退出
查看服务与日志:
sudo systemctl status mssql-server
journalctl -u mssql-server -xe
/var/log/mssql/errorlog
若异常,先尝试启动;仍失败时依据日志定位(磁盘、权限、配置等),必要时以单用户模式排查:
sudo /opt/mssql/bin/sqlservr -m
- 监听地址或端口不正确
修改 SQL Server 监听地址,编辑配置文件:
sudo vi /etc/mssql/mssql.conf.d/90-sqlservr.conf
增加或修改:listen_addresses=0.0.0.0
重启服务:sudo systemctl restart mssql-server
再次用 ss/netstat 确认监听在 0.0.0.0:1433。如使用非默认端口,客户端需显式指定端口。
- 防火墙阻断
放行端口并重载:
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload
云服务器还需确保安全组/ACL 对 1433/TCP 入站放行。
- 客户端驱动或工具版本过旧
第三方工具(如旧版 Navicat)使用过时的 SQL Server Native Client 可能导致连接被远程关闭(如错误 08S01)。升级到新版本驱动或使用最新 SSMS 可规避兼容性问题。
- 命名实例与浏览器服务
若通过“主机名\实例名”连接且未固定端口,需确保 SQL Server Browser 运行,并在防火墙放行 UDP 1434,否则客户端无法解析实例端口。为稳定建议固定实例端口为 1433 并直接按 IP,端口 连接。
三 连接字符串与客户端示例
- sqlcmd 直连示例(推荐先以此验证)
sqlcmd -S 192.168.10.15,1433 -U SA -P ‘YourStrong@Passw0rd’ -d master -Q “SELECT @@VERSION”
- 常见连接串要素
服务器地址与端口:Server=IP,1433;数据库:Database=yourdb;认证:UID/PWD 或集成安全;加密:Encrypt=true(生产建议开启);信任服务器证书:TrustServerCertificate=false(自签证书时临时设为 true 仅用于排障)。
- 在应用或工具中,务必保证:主机可达、端口开放、驱动版本匹配、账号口令正确且具备相应数据库权限。
四 日志定位与进一步处理
- 服务端日志:
/var/log/mssql/errorlog(SQL Server 引擎日志)
journalctl -u mssql-server(systemd 日志,便于查看启动与崩溃线索)
- 客户端侧线索:
记录完整报错(如 08S01、超时、登录失败),先区分是网络层(ping/telnet 不通)、协议层(端口未监听/被拒)、认证层(账号权限/口令错误)还是驱动层(版本不兼容)。
- 仍无法恢复时:
复核网络与安全组策略、临时关闭 SELinux 做 A/B 测试(如 setenforce 0)、回退到 sqlcmd 直连排除应用侧问题,并保留日志片段以便进一步分析。