温馨提示×

CentOS下SQL Server的故障排除技巧

小樊
42
2025-12-27 14:37:47
栏目: 云计算

CentOS下SQL Server故障排除技巧

一 快速定位流程

  • 服务状态与自启:使用命令查看与拉起服务,确认是否开机自启
    命令:sudo systemctl status mssql-serversudo systemctl start mssql-serversudo systemctl enable mssql-server。若反复重启失败,先停止后再排查。
  • 错误日志:先看 SQL Server 错误日志,再看 systemd 日志
    路径:/var/log/mssql/errorlog;命令:journalctl -u mssql-server -xe。从最近的错误与时间线定位根因。
  • 文件权限与所有权:确保数据目录归属正确
    命令:sudo chown -R mssql:mssql /var/opt/mssql。权限异常会导致启动或访问失败。
  • 端口与防火墙:确认监听端口并放通
    默认端口:1433;放通命令:sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent && sudo firewall-cmd --reload
  • 网络连通与监听:从客户端测试连通性
    命令:ping 服务器IP;端口检测:telnet 服务器IP 1433nc -zv 服务器IP 1433。无法连通时优先排查网络与防火墙策略。
  • 配置核对:检查监听地址配置
    文件路径:/etc/mssql/mssql.conf.d/90-sqlservr.conf,确保包含 listen_addresses=0.0.0.0(或所需网段)以监听所有接口。
  • 客户端侧检查:确认客户端工具与连接串
    安装工具:sudo yum install -y mssql-tools unixODBC-devel;连接测试:sqlcmd -S localhost -U SA -P ‘YourStrong!Passw0rd’ -Q “SELECT 1”。连接串需包含正确的服务器地址、端口、数据库、用户名、密码。

二 常见故障与修复

  • 服务启动即崩溃或反复重启
    典型现象:systemctl 显示 Active: failed (Result: signal)。处理步骤:
    1. journalctl -u mssql-server -xe 查具体信号与报错;
    2. 若日志出现 “Unable to read instance id from /var/opt/mssql/.system/instance_id”,先备份该文件(若存在),再删除后重启,实例会自动生成新的 instance_id。注意:这可能导致依赖 NEWSEQUENTIALID() 的表在重启后出现顺序性异常风险,务必评估业务影响并做好备份。
  • 断电或异常关机后无法启动
    处理步骤:
    1. 以单用户模式观察启动输出:sudo /opt/mssql/bin/sqlservr -m
    2. 若怀疑数据文件异常,先做好文件级备份,再用 sqlcmd 执行检查与修复:
      检查:sqlcmd -S localhost -U SA -Q “DBCC CHECKDB (‘YourDB’)”
      修复(谨慎):sqlcmd -S localhost -U SA -Q “DBCC CHECKDB (‘YourDB’) WITH REPAIR_ALLOW_DATA_LOSS”(仅在无法用常规手段恢复时、且有完整备份的前提下执行)。
  • 客户端连接超时或拒绝
    排查顺序:
    1. 服务端确认服务运行与监听:systemctl status mssql-serverss -lntp | grep 1433
    2. 防火墙放通 1433/tcp
    3. 客户端测试:telnet 服务器IP 1433nc -zv 服务器IP 1433
    4. 核对连接字符串参数(服务器、端口、数据库、凭据)与账号权限。
  • 主机名解析异常
    现象:应用或客户端报无法解析主机。处理:
    1. 检查 /etc/hosts 中主机名与IP映射;
    2. 检查 /etc/resolv.confnameserver 是否可用,必要时更换为可用 DNS。

三 性能与阻塞排查

  • 即时会话与请求:
    查看阻塞与长时运行会话:
    SELECT session_id, request_id, task_state, wait_type, wait_time_ms, start_time, command, text
    FROM sys.dm_exec_requests r
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st
    ORDER BY wait_time_ms DESC;
    查看会话与登录信息:
    SELECT session_id, login_name, host_name, program_name, login_time, last_request_end_time
    FROM sys.dm_exec_sessions;
    结合执行统计定位问题 SQL:
    SELECT TOP 20 qs.execution_count,
    qs.total_worker_time/qs.execution_count AS avg_cpu_ms,
    qs.total_elapsed_time/qs.execution_count AS avg_elapsed_ms,
    SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
    ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS stmt_text
    FROM sys.dm_exec_query_stats qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
    ORDER BY avg_elapsed_ms DESC;
  • 资源瓶颈定位:
    系统层:top/htop、vmstat、iostat、nmon、sar、dstat、glances 观察 CPU、内存、I/O、网络;
    存储层:用 iostat -x 1 检查 await、svctm、util% 判断磁盘压力;
    网络层:netstat -s、tcpdump 排查丢包与重传。
  • 日志与空间:
    查看日志空间使用:DBCC SQLPERF(LOGSPACE)
    事务日志维护:按业务 RPO 定期执行 BACKUP LOG [DB] TO DISK=‘…’ WITH FORMAT;,避免日志无限增长。
  • 深入诊断:
    使用 扩展事件(Extended Events) 捕获长时 SQL、锁等待、错误等;
    借助 SSMS 活动监视器 或性能仪表盘快速定位热点查询与阻塞链。

四 网络与权限专项

  • 端口与防火墙:
    确认服务监听 1433/tcp,在服务器放通并重载防火墙:
    sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent && sudo firewall-cmd --reload
  • 监听地址:
    /etc/mssql/mssql.conf.d/90-sqlservr.conf 中设置 listen_addresses=0.0.0.0 以监听所有接口,必要时仅开放内网网段。
  • SELinux:
    检查状态:getenforce;若为 Enforcing 可临时设为 Permissive 做 A/B 测试(生产环境需谨慎,并配合策略调整)。
  • 主机名解析:
    修正 /etc/hosts 映射,确保 /etc/resolv.conf 中的 nameserver 可用。
  • 客户端工具与连接串:
    安装:sudo yum install -y mssql-tools unixODBC-devel
    连接测试:sqlcmd -S localhost -U SA -P ‘YourStrong!Passw0rd’ -Q “SELECT 1”
    连接串需包含正确的服务器地址、端口、数据库、用户名、密码。

五 应急与恢复清单

  • 变更前先做文件级与逻辑备份:包含 /var/opt/mssql 数据目录、系统库与用户库、以及关键配置文件。
  • 启动失败先读日志:优先查看 /var/log/mssql/errorlogjournalctl -u mssql-server -xe,按时间线定位首次报错。
  • 异常关机或疑似数据文件异常:
    1. 以单用户模式观察:sudo /opt/mssql/bin/sqlservr -m
    2. 先做全量文件备份;
    3. 执行 DBCC CHECKDB 评估;仅在无其它恢复路径且已有有效备份时,才使用 REPAIR_ALLOW_DATA_LOSS
  • 实例 ID 丢失导致启动异常:
    备份 /var/opt/mssql/.system/instance_id 后删除该文件并重启,实例会生成新的 instance_id;注意 NEWSEQUENTIALID() 的顺序性风险。
  • 连接问题快速验证:
    服务端确认监听与防火墙;客户端用 telnet/nc 测试 1433;核对连接串与账号权限。

0