Ubuntu 上 SQL Server 常见问题与解决
一 安装与依赖问题
- 导入 GPG 密钥与注册仓库(以 Ubuntu 20.04 + SQL Server 2022 为例):
- 导入密钥:wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
- 注册仓库:sudo add-apt-repository “$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)”
- 安装与初始化:sudo apt-get update && sudo apt-get install -y mssql-server && sudo /opt/mssql/bin/mssql-conf setup
- 依赖库缺失(典型报错:error while loading shared libraries: …)
- 缺 libldap-2.4-2:sudo apt-get install -y libldap-2.4-2
- 缺 libssl1.1(如 Ubuntu 18.04 上常见):sudo apt-get install -y libssl1.1
- 版本兼容与仓库匹配:确保 SQL Server 版本与Ubuntu 版本匹配(如 SQL Server 2022 支持 Ubuntu 20.04),并使用对应仓库配置。
二 服务无法启动与日志定位
- 检查服务状态:systemctl status mssql-server --no-pager
- 查看错误日志(两种常见路径,取决于安装与版本):
- /var/opt/mssql/log/errorlog(较新安装常见)
- /var/log/mssql/errorlog 或 /var/log/sqlserver/errorlog(旧版或特定环境)
- 常见根因与处理:
- 资源不足(内存/磁盘/CPU):释放或扩容资源后重启服务
- 权限问题:校正安装目录与服务账户权限
- 配置错误:使用 mssql-conf 修正后重启:sudo /opt/mssql/bin/mssql-conf setup && sudo systemctl restart mssql-server
- 证书相关:日志出现证书错误时,重新生成或正确配置证书后再启动
三 连接失败与网络配置
- 本机与远程连通性检查:
- 监听端口:sudo ss -lntp | grep 1433(默认端口 1433)
- 防火墙放行:sudo ufw allow 1433/tcp(或对应防火墙策略)
- 客户端连接与工具:
- sqlcmd 连接示例:sqlcmd -S <IP或主机名>,1433 -U SA -P ‘<密码>’
- 命令行工具安装:sudo apt-get install -y mssql-tools unixodbc-dev
- 常见报错与处理:
- “Connection forcibly closed”:排查网络稳定性、端口连通性、TLS/证书配置
- “未找到或无法访问服务器”:核对实例名、远程连接是否启用、端口与防火墙策略
四 SSL 与加密连接问题
- 驱动/应用侧 TLS 版本不匹配:在客户端(如 Java)禁用不安全协议/算法,示例:
- 创建 custom.java.security:jdk.tls.disabledAlgorithms=SSLv3,TLSv1.1,RC4,DES,MD5withRSA,DH keySize < 1024,EC keySize < 224,3DES_EDE_CBC,anon,NULL
- 启动时指定:java -Djava.security.properties=/path/to/custom.java.security …
- 服务器端启用加密连接:
- 连接字符串增加:encrypt=true
- 测试/自签名场景可临时:trustServerCertificate=true(生产环境不建议)
- 证书问题导致服务无法启动:依据错误日志重新生成或配置有效证书,再重启服务
五 性能与运维最佳实践
- 查询与存储过程优化:
- 避免使用 SELECT *;减少 JOIN 数量;优先集合操作替代游标
- 使用 SET NOCOUNT ON;用 sp_executesql 替代 EXEC 以复用执行计划
- 事务尽量短;避免在标量函数中对列逐行计算
- 配置与维护:
- 启用 SQL Server 代理执行备份/维护作业
- 定期重建索引、更新统计信息,监控关键性能指标
- 安全与高可用:
- 设置强密码策略;仅开放必要端口(如 1433)
- 定期备份并验证可恢复性;按官方文档进行版本与平台兼容性验证