centos中sqlserver故障排查方法
导读:CentOS 上 SQL Server 故障排查步骤 一 快速定位与通用检查 服务状态与自启 执行:sudo systemctl status mssql-server,若未运行则 sudo systemctl start mssql-...
CentOS 上 SQL Server 故障排查步骤
一 快速定位与通用检查
- 服务状态与自启
- 执行:
sudo systemctl status mssql-server,若未运行则sudo systemctl start mssql-server;建议sudo systemctl enable mssql-server设置开机自启。
- 执行:
- 错误日志与系统日志
- 查看 SQL Server 错误日志:
sudo tail -n 200 /var/log/mssql/errorlog -f - 查看 systemd 日志:
sudo journalctl -u mssql-server -f
- 查看 SQL Server 错误日志:
- 文件权限与所有权
- 修复数据目录权限:
sudo chown -R mssql:mssql /var/opt/mssql & & sudo chmod -R u+rwX /var/opt/mssql - 如日志出现无法打开 licensing.hiv 或访问被拒绝,重点检查 /var/opt/mssql/.system/system/registry/ 的权限与残留进程锁。
- 修复数据目录权限:
- 资源与磁盘
- 磁盘空间:
df -h - 磁盘 I/O:
iostat -x 1 5
- 磁盘空间:
- 客户端连通性
- 端口可达:
nc -vz < 服务器IP> 1433或telnet < 服务器IP> 1433 - 本机监听:
ss -lntp | grep 1433或sudo netstat -tulpen | grep 1433。
- 端口可达:
二 无法启动或反复崩溃
- 彻底清理残留进程后重启
sudo systemctl stop mssql-serverps -ef | grep -E "sqlservr|paldumper"确认无残留- 必要时
sudo pkill -9 -f "sqlservr"(仅在确认无业务影响时) - 再次启动:
sudo systemctl start mssql-server
- 检查关键错误线索
- 若日志出现 Access was denied setting up the persistent registry: \SystemRoot\licensing.hiv,多为 licensing.hiv 权限/锁冲突或残留进程导致,按上步清理并修复权限后重试。
- 单用户模式获取启动期详细输出
sudo /opt/mssql/bin/sqlservr -m(前台运行,观察控制台报错,定位文件/权限/配置问题)
- 文件系统与权限复核
- 确保 /var/opt/mssql 及子目录属主为 mssql:mssql,必要时
chmod -R u+rwX放宽目录权限(生产环境请按最小权限原则调整)。
- 确保 /var/opt/mssql 及子目录属主为 mssql:mssql,必要时
三 连接失败排查
- 服务与端口
- 确认服务运行:
systemctl is-active mssql-server - 确认监听端口:
ss -lntp | grep 1433
- 确认服务运行:
- 防火墙放行
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(或需要的网卡地址),保存后sudo systemctl restart mssql-server
- 编辑配置文件:
- 客户端与连接串
- 本机测试:
sqlcmd -S 127.0.0.1 -U SA -P '< 密码> ' -Q "SELECT 1" - 远程测试:
sqlcmd -S < 服务器IP> ,1433 -U < 用户名> -P '< 密码> ' -Q "SELECT 1" - 核对连接字符串的 服务器地址、端口、数据库名、用户名、密码 是否正确,账户是否具备连接权限。
- 本机测试:
四 性能与阻塞问题
- 活跃会话与请求
sqlcmd -S localhost -U SA -P '< 密码> ' -Q "SELECT session_id, request_id, task_state, start_time, command, text FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t ORDER BY start_time DESC"
- 会话与登录信息
sqlcmd -S localhost -U SA -P '< 密码> ' -Q "SELECT session_id, login_name, host_name, program_name, login_time, last_request_end_time FROM sys.dm_exec_sessions ORDER BY login_time DESC"
- 执行计划与统计
- 结合
sys.dm_exec_query_stats、sys.dm_exec_plan_attributes分析高成本查询与计划属性,必要时更新统计信息或优化索引。
- 结合
- 扩展事件追踪耗时/阻塞
- 创建会话示例:
CREATE EVENT SESSION [long_query] ON SERVER ADD EVENT sqlserver.sql_statement_completed(ACTION(sqlserver.sql_text) WHERE duration > 5000000) ADD TARGET package0.event_file(SET filename=N'/var/opt/mssql/log/long_query.xel') WITH (STARTUP_STATE=ON);- 启动:
ALTER EVENT SESSION [long_query] ON SERVER STATE = START; - 停止/清理:
ALTER EVENT SESSION [long_query] ON SERVER STATE = STOP; DROP EVENT SESSION [long_query] ON SERVER;
- 创建会话示例:
- 图形化辅助
- 使用 SSMS 活动监视器 观察当前活跃查询、等待类型与阻塞链。
五 应急与修复建议
- 数据库一致性检查与修复
- 只读检查:
sqlcmd -S localhost -U SA -P '< 密码> ' -Q "DBCC CHECKDB ('YourDB') WITH NO_INFOMSGS, ALL_ERRORMSGS; " - 修复(高风险,务必先完整备份):
sqlcmd -S localhost -U SA -P '< 密码> ' -Q "DBCC CHECKDB ('YourDB') REPAIR_ALLOW_DATA_LOSS; "
- 只读检查:
- 单用户维护窗口
- 将库置为单用户并立即回滚现有连接:
ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; - 维护完成后恢复:
ALTER DATABASE [YourDB] SET MULTI_USER;
- 将库置为单用户并立即回滚现有连接:
- 变更前准备
- 备份数据目录与配置:
sudo tar czf /backup/mssql_$(date +%F).tgz -C /var/opt/mssql . - 变更后验证:`sqlcmd -S localhost -U SA -P ‘< 密码> ’ -Q “SELECT name, state_desc FROM sys.databases; ”``
- 备份数据目录与配置:
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos中sqlserver故障排查方法
本文地址: https://pptw.com/jishu/788317.html
