CentOS 上 SQL Server 故障排查步骤
一 快速定位流程
- 检查服务状态:运行 systemctl status mssql-server,若未运行则执行 systemctl start mssql-server 启动服务。
- 查看错误日志:优先检查 /var/log/mssql/errorlog,并用 journalctl -u mssql-server 查看服务启动与运行日志。
- 校验网络连通:用 ping 测试主机可达,用 telnet 服务器IP 1433 或 nc -zv 服务器IP 1433 验证 1433 端口是否开放。
- 复核配置与权限:确认 /etc/mssql/mssql.conf.d/90-sqlservr.conf 中 listen_addresses=0.0.0.0;必要时修复目录权限 chown -R mssql:mssql /var/opt/mssql。
- 客户端侧验证:安装并使用 sqlcmd/msodbcsql 本地连接测试,排除应用侧连接字符串问题。
二 常见故障与处理
- 服务无法启动:查看 /var/log/mssql/errorlog 与 journalctl 的错误细节;若因断电等异常导致可疑数据文件状态,可在维护时段以单用户模式启动进行诊断:sudo /opt/mssql/bin/sqlservr -m,观察控制台输出后再决定修复路径。
- 端口与防火墙:确保防火墙放行 1433/tcp:firewall-cmd --zone=public --add-port=1433/tcp --permanent && firewall-cmd --reload;云主机还需检查安全组规则。
- 监听地址与端口:在 /etc/mssql/mssql.conf.d/90-sqlservr.conf 设置 listen_addresses=0.0.0.0 以监听所有接口,必要时重启服务使配置生效。
- SELinux 限制:执行 getenforce 检查状态;仅用于排查时可临时设为宽容模式 sudo setenforce 0,确认后再恢复为 Enforcing 并配置正确的策略。
- 客户端连接失败:核对连接字符串的 服务器地址、端口、数据库名、用户名、密码;在服务器本机用 sqlcmd -S localhost -U SA 验证凭据与网络;远程用 sqlcmd -S 服务器IP,1433 -U SA 测试。
- DNS 与解析:必要时在 /etc/hosts 建立 hostname-IP 映射,或在 /etc/resolv.conf 调整 nameserver 以排除解析异常。
三 性能与阻塞排查
- 活跃会话与请求:查询 sys.dm_exec_sessions、sys.dm_exec_requests,定位长时间运行或阻塞会话。
- 查询与执行计划:结合 sys.dm_exec_query_stats、sys.dm_exec_plan_attributes 分析高成本查询与计划属性,进行索引与语句优化。
- 活动监控:在 SSMS 使用“活动监视器”快速查看当前进程、等待类型与阻塞链。
- 扩展事件:创建扩展事件会话,捕获长时SQL、锁竞争等关键事件,便于离线分析。
四 日志与诊断信息获取
- 错误日志与系统日志:SQL Server 错误日志位于 /var/log/mssql/errorlog;服务日志使用 journalctl -u mssql-server 查看。
- 客户端工具:安装 mssql-tools 与 unixODBC-devel,并将 /opt/mssql-tools/bin 加入 PATH,便于使用 sqlcmd 进行本地诊断与验证。
- 连接验证命令示例:
- 本地:**sqlcmd -S localhost -U SA -P ‘<密码>’ -Q “SELECT 1”`
- 远程:sqlcmd -S 服务器IP,1433 -U SA -P ‘<密码>’ -Q “SELECT 1”
- 应用侧线索:同步收集应用日志与错误堆栈,与数据库侧日志交叉验证。
五 安全与变更建议
- 最小权限原则:避免使用 SA 进行日常连接,创建具备所需权限的专用登录与应用角色。
- 变更可回滚:修改 mssql.conf 前先备份;变更后使用 systemctl restart mssql-server 重启并观察日志。
- 谨慎修复数据:仅在明确故障且具备有效备份的前提下执行 DBCC CHECKDB … REPAIR_ALLOW_DATA_LOSS,优先尝试无损修复与从备份恢复。
- 加固与安全组:生产环境保持 SELinux Enforcing,仅开放必要端口;云上同时配置安全组白名单。