新闻详情

新闻详情

首页 / 资讯中心 / 详情

SQL Server 18456错误排查:从错误日志到身份验证的完整指南

发布时间:2026/10/2 14:42:22来源:尧图网络
SQL Server 18456错误排查:从错误日志到身份验证的完整指南
在SQL Server这条路上摸爬滚打的开发者和运维应该没人不认识18456这个数字。用户sa登录失败18456大概是连接类问题里曝光率最高的一条几乎隔几天就有人拿着SSMS的报错截图来问版本从SQL Server 2008一路问到2022场景从本机开发到远程生产环境全都有。这个错误的烦人之处在于它本身只告诉你“登录失败”却不告诉你密码错了、账号禁用了、还是网络根本就没通所以很多人一台服务器能折腾一整天。这篇内容不会只丢给你一句“检查登录名和密码”而是把整个排错链路拆开从错误日志里的细节、身份验证模式的底层逻辑到TCP/IP协议、防火墙、ODBC驱动这类中间层一层层讲清楚。它适合刚接触SQL Server的新手照着操作也适合有几年经验的朋友做一次系统性的查漏补缺——尤其是SQL Server 2022之后新增的强制加密行为让很多老客户端栽了跟头这部分我会专门拿出来讲。1. 18456错误到底是什么先读懂报错信息里的每一个细节1.1 错误编号与严重级别代表什么18456的完整名称是MSSQLSERVER_18456严重级别为14。在SQL Server的错误体系里Severity 14属于“用户错误”意思是服务器本身是正常的CPU、内存、磁盘都没问题是你这次连接请求的身份没有被认可。这个定位很重要——它意味着收到18456时你首要的任务不是重启SQL Server服务而是搞清楚“是谁、用什么方式、在哪个环节被拒绝”。顺便说一句如果看到的是Severity 17到19的错误那属于资源不足或数据库损坏处理思路完全不同。所以看到18456先稳住这通常不是一个灾难级别的故障而是一个配置或权限问题。1.2 报错弹窗只给你一半信息完整原因藏在ERRORLOG里SSMS连接失败时会弹出一个对话框但那个对话框显示的错误信息经常是被截断的只看得到“用户‘sa’登录失败”后面就没了。实际上SQL Server在错误日志里写下了非常精确的失败原因这是整个排查过程中最该看的一条线索。错误日志的默认路径一般是C:\Program Files\Microsoft SQL Server\MSSQL{版本编号}.{实例名}\MSSQL\Log\ERRORLOG其中版本编号是个坑SQL Server 2008对应MSSQL102008 R2对应MSSQL10_502012是MSSQL112014是MSSQL122016是MSSQL132017是MSSQL142019是MSSQL152022是MSSQL16。默认实例名为MSSQLSERVER命名实例则是对应的实例名比如SQLEXPRESS。如果不想一个个去翻目录直接在PowerShell里筛一下最快Get-Content C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG | Select-String 18456|Login failed | Select-Object -Last 20日志里你会看到类似这样的行2025-01-10 09:23:45.11 Logon Error: 18456, Severity: 14, State: 8. 2025-01-10 09:23:45.11 Logon Login failed for user sa. Reason: Password did not match that for the user provided. [CLIENT: 192.168.10.25]看到Reason:后面的内容方向基本就定了。注意ERRORLOG文件会滚动归档变成ERRORLOG.1、ERRORLOG.2如果问题发生在几天前记得去旧文件里找。1.3 State状态码从数字快速猜原因每个18456错误后面都带一个State数值虽然它不是百分百精确但能帮你快速缩小范围。几个常见值如下State大致含义1一般性登录信息错误或者连接参数有问题2用户ID无效登录名不存在5登录名有效但验证失败密码不对或账号被禁用6尝试用Windows账号走SQL验证映射不匹配7登录已被禁用密码也不匹配8密码不匹配9密码无效11登录有效但没有相应操作权限12登录名被锁定或被禁用38认证已通过但无法打开请求的数据库不同SQL Server版本的State含义存在细微差异所以不要死记数字最重要的还是看日志里的Reason:文本。比如State 38这类情况很隐蔽用户和密码都对但sa的默认数据库被删了、脱机了或者sa在该数据库中没有任何权限照样会报18456。这提醒我们排查时别只盯着密码。2. 为什么sa会被挡在门外身份验证模式与账号状态的底层逻辑2.1 身份验证模式决定了一切SQL Server有两种身份验证模式Windows身份验证模式和混合模式SQL Server和Windows身份验证模式。如果实例处于纯Windows验证模式那么sa这种SQL登录名压根就没有参与验证的资格你连接时客户端可能根本不会走到密码校验那一步或者直接报18456。很多人在安装SQL Server时为了方便选了Windows身份验证模式安装完成后又想着用sa连自然就撞墙了。检查当前实例是什么模式可以执行这条SQLSELECT SERVERPROPERTY(IsIntegratedSecurityOnly) AS IsWindowsOnly;返回1表示仅Windows验证返回0表示混合模式。想在SSMS里改的话右键服务器节点 → 属性 → 安全性 → 服务器身份验证选“SQL Server和Windows身份验证模式”确定后重启SQL Server服务生效。如果用T-SQL改可以这样写USE [master]; GO EXEC xp_instance_regwrite NHKEY_LOCAL_MACHINE, NSoftware\Microsoft\MSSQLServer\MSSQLServer, NLoginMode, REG_DWORD, 2; GO这里把LoginMode设为2代表混合模式1代表仅Windows验证。改完必须重启服务而且重启会让所有已建立的连接断开生产环境记得安排在业务低峰期。2.2 sa账号的默认状态禁用、密码策略与过期SQL Server从2005开始大幅收紧了sa的默认策略如果你安装时选择的是Windows身份验证模式sa会被默认禁用就算你选了混合模式安装程序也会强制让你给sa设置一个强密码。换句话说数据库从一开始就在告诉你sa是个超级管理员不能裸奔。先看sa当前状态SELECT name, is_disabled FROM sys.sql_logins WHERE name sa;is_disabled为1表示禁用。启用并设置密码的常规写法是USE [master]; GO ALTER LOGIN [sa] WITH PASSWORD N你的新密码; ALTER LOGIN [sa] WITH CHECK_POLICY OFF, CHECK_EXPIRATION OFF; GOCHECK_POLICY控制是否应用Windows密码复杂度策略CHECK_EXPIRATION控制密码是否会到期。很多SQL Server 2012及之后版本的用户遇到“昨天还能用今天突然sa登录失败”一查日志原因写着“密码已过期”或“密码策略评估错误”就是实例启用了密码过期策略。开发测试机上关掉这两个策略能省很多麻烦但生产环境请务必遵守公司的安全基线别为了省事让密码三年不换。2.3 服务没启动、协议没启用认证根本走不到有时候sa账号、密码、验证模式全部正确依然连不上这时候要怀疑连接压根没到达认证环节。在服务器本机上打开services.msc找到SQL Server (MSSQLSERVER)或SQL Server (你的实例名)确认状态是“正在运行”。服务没启动的情况在Express版和刚装完没重启的机器上特别常见。另一个高频坑是TCP/IP协议被禁用。SQL Server配置管理器SSCM里SQL Server网络配置 → 协议能看到Shared Memory、Named Pipes、TCP/IP三项。如果TCP/IP显示“已禁用”远程客户端是连不进来的只有本机通过共享内存能连。尤其SQL Server Express安装时TCP/IP被禁用的概率相当高。启用后别忘重启服务TCP/IP才会真正开始监听。3. 从客户端到服务器的三层排查链路网络、认证与中间层3.1 网络层先行端口、协议、防火墙排查连接类故障我的习惯永远是先确认网络层通不通再谈账号密码。在客户端机器上直接测试服务器的1433端口Test-NetConnection 192.168.10.20 -Port 1433如果TcpTestSucceeded返回True说明链路是通的可以专心看认证问题。如果返回False而服务器本地又能正常连接那就要检查防火墙、端口监听和服务状态了。在服务器上确认端口在监听Get-NetTCPConnection -LocalPort 1433 -State Listen没有输出就是SQL Server没在监听这个端口。Windows防火墙需要添加入站规则放行1433/TCP如果是命名实例比如192.168.10.20\SQLEXPRESSSSMS客户端会先通过1434/UDP访问SQL Server Browser服务来找到实际端口所以远程连命名实例时除了1433通常还需要放行1434/UDP或者直接写成IP地址,端口的格式绕过Browser服务。给实例配一个固定的静态端口会让防火墙规则更干净我推荐在SSCM的TCP/IP属性里把IPAll的TCP端口设为固定值。3.2 用sqlcmd做最小化验证区分网络问题还是认证问题SSMS虽然方便但它的连接对话框里变量太多不适合快速定位。我排错时习惯直接用sqlcmd一条命令就能把问题切成两半。sqlcmd -S 127.0.0.1,1433 -U sa -P 你的密码注意服务器名用了127.0.0.1,1433带端口号是为了强制走TCP/IP而不是本机的共享内存这样测试结果更接近真实网络访问。连接成功后输入SELECT VERSION; GO能看到版本信息说明认证链路完全正常。这时候可以把测试拆成三个环境本机测试sqlcmd -S 127.0.0.1,1433 -U sa -P xxx如果成功说明SQL Server服务和凭据没问题。局域网测试换成服务器的IP地址如果失败大概率是TCP/IP协议没启用、防火墙拦截或端口没监听。跨网段测试检查路由、安全组、端口映射。很多人会陷在“重置密码”的循环里其实用这个办法花两分钟确认一下网络层能省掉半天无用功。3.3 SSMS、ODBC与Navicat连接时的差异不同客户端对加密和协议的处理方式不一样这也是18456在SSMS下不报、在ODBC下报或者在Navicat下报的原因之一。SSMS通常能自动协商加密与认证方式但老版本SSMS连新版本SQL Server也可能出现协议不匹配。我的建议是用SSMS 19或更高版本连接SQL Server 2019/2022遇到SSL协商类报错的概率会小很多。ODBC连接字符串是另一个重灾区。比如用“ODBC Driver 17 for SQL Server”连接时如果服务器端启用了强制加密而连接字符串里写着EncryptYes; TrustServerCertificateNo;自签证书就会导致信任失败。快速解决办法是把TrustServerCertificate设为Yes仅限测试环境或者升级到ODBC Driver 18并正确配置证书。Navicat for SQL Server也是一样的思路高级选项里找到TLS/SSL设置确认证书校验和加密方式是否匹配服务器的强制加密配置。4. 那些与18456相伴的衍生问题2022加密、密码过期与第三方软件4.1 SQL Server 2022强制加密引发的“证书链”错误从SQL Server 2022开始服务器端默认启用强制加密Force Encryption而它使用的又往往是自签证书。这就导致老客户端在连接时报出非常吓人的一长串错误[08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL 提供程序: 证书链是由不受信任的颁发机构颁发的。 (-2146893019) [08001] [Microsoft][ODBC Driver 17 for SQL Server]客户端无法建立连接 (-2146893019)别被这串错误吓到本质是客户端不信任服务器那张自签证书。处理方式有三个方向客户端连接字符串加TrustServerCertificateYes;适合开发测试环境跳过证书链校验。在服务器端为SQL Server配置由受信任CA签发的正式证书比如企业内部的CA这样客户端不需要额外信任操作。如果确定数据链路完全在内网且安全级别要求不高可以在SSCM中把Force Encryption设为No但这对跨公网的连接有较大安全风险生产环境我不建议这么干。顺带提醒升级到ODBC Driver 18之后它的默认加密行为变得更严格了很多老应用连接2022实例时反而需要显式调整Encrypt参数。遇到这种问题先看驱动文档别盲目猜测。4.2 密码过期SQL Server 2012及以上版本的“突然连不上”故障场景通常是这样某天早上开发同事跑过来说“数据库连不上了报sa登录失败”然后你查日志发现18456对应的State是5Reason写着密码过期或密码策略评估错误。这类问题在SQL Server 2012及以上版本中很常见因为SQL登录名默认会继承操作系统密码策略如果服务器策略要求密码定期过期sa到了期限就会失去效力。处理分两步。第一步用Windows身份验证方式通过SSMS或sqlcmd登录实例把sa密码重置掉第二步判断这台机器是否需要密码过期策略。开发测试机直接关掉ALTER LOGIN sa WITH CHECK_POLICY OFF, CHECK_EXPIRATION OFF;但如果这是合规要求较高的生产环境我建议保留策略同时在团队日历或运维平台里登记密码轮换计划而不是临时抱佛脚。很多公司都是等到sa到期的那天才想起来改密码这个习惯不值得学。4.3 第三方软件连不上SolidWorks Electrical这类软件的排查方法“SolidWorks Electrical无法连接到SQL Server”这类问题本质跟手动用SSMS连接没有任何区别只是报错文案更吓人一些。这类软件通常会随安装包部署一个SQL Server实例比如某个命名实例然后在配置文件中写入服务器名和数据库名。连接失败时最有效的办法是先用SSMS手动去连那个目标实例计算机名\实例名或IP地址\实例名。如果SSMS能连上说明SQL Server层没问题问题出在软件自身的配置上比如服务器名写错、端口写错、软件服务账户没有权限。如果SSMS也连不上那就回到本文前面说的排查链路SQL Server服务是否在运行、TCP/IP是否启用、防火墙是否放行、sa或其他连接账号是否可用。把这套链路走完绝大多数第三方软件的“无法连接SQL Server”问题都能定位。4.4 容易混淆的几种“登录失败”有些报错虽然长得像但根本不是SQL Server层面的问题排查方向完全不同。比如Windows系统的“登录失败: 未授权用户在此计算机上的请求登录类型”这通常是Windows账户权限、远程桌面或共享访问的问题跟SQL Server的18456没有直接关系。还有一种云环境常见的“login server error: token exchange failed: token endpoint returned...”那是OAuth/Entra认证流程的问题常见于Azure SQL或托管实例处理时要去看云平台的接入配置而不是翻SQL Server错误日志。遇到任何“登录失败”报错先确认报错来自SQL Server的登录层还是来自操作系统或云服务的认证层。这个判断能帮你省下大量无效操作。5. 十分钟自查清单按顺序执行这几条5.1 快速定位18456的对照表下面这张表是我排错时实际使用的清单从最常出问题的项开始排一次扫完基本能定位九成问题。排查项快速验证方法失败时的对策SQL Server服务状态Get-Service MSSQLSERVER或services.msc启动服务并设为自动启动TCP/IP协议是否启用SQL Server配置管理器 → 协议启用TCP/IP重启服务端口是否监听Get-NetTCPConnection -LocalPort 1433检查实例静态端口确认没有端口冲突防火墙是否放行客户端执行Test-NetConnection IP -Port 1433添加入站规则放行1433/TCP命名实例加1434/UDP身份验证模式SELECT SERVERPROPERTY(IsIntegratedSecurityOnly);改为混合模式重启服务sa账号是否禁用SELECT name, is_disabled FROM sys.sql_logins WHERE namesa;ALTER LOGIN sa ENABLE;密码是否正确sqlcmd -S 127.0.0.1,1433 -U sa -P 密码重置sa密码密码策略与过期查看日志中Reason是否提到password过期ALTER LOGIN sa WITH CHECK_POLICYOFF, CHECK_EXPIRATIONOFF;默认数据库是否可用SELECT name FROM sys.databases;检查sa的默认库ALTER LOGIN sa WITH DEFAULT_DATABASEmaster;最后一行是很多人漏掉的sa的默认数据库如果被改成某个已删除或脱机的库即使密码完全正确登录时也会报18456State通常是38。修复方式很简单把默认数据库改回master即可。5.2 让我少走弯路的几个习惯第一永远先看ERRORLOG再动配置。日志里的Reason字段直接指明了方向靠猜不如靠看。第二改身份验证模式、启用TCP/IP这类操作都要重启SQL Server服务重启意味着所有连接断开生产环境务必先申请维护窗口。第三sa密码变更记录要留痕团队里最怕“某个人知道密码但他休假了”。第四不要图方便把所有环境都改成混合模式Windows身份验证在域环境下更安全SQL登录名只给确有需要的场景使用。最后多说一句排查18456这么多年我的体会是这问题百分之八十不是密码错了而是服务没起来、TCP/IP没启用、防火墙没放行、sa被禁用这四件事。把顺序理顺先确认链路再谈凭据十分钟内基本能收工。如果你经常需要在远程机器上排查建议把下面这条命令存成一个小脚本每次连不上先跑一遍把日志里最近20条18456发给我比发一张SSMS报错截图有用得多。Get-Content C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG | Select-String 18456 | Select-Object -Last 20希望这篇清单能帮你在下次遇到sa登录失败时把排查时间从半天压缩到十分钟。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

深入理解虚拟内存:分页机制、地址翻译与内存调优实战 2026/10/2 15:28:32

深入理解虚拟内存:分页机制、地址翻译与内存调优实战

你有没有过这种经历:开着一堆浏览器标签页、一个虚拟机、再加个编译任务,物理内存明明已经快见底了,机器却照样能跑。很多人把这归功于“虚拟内存”,但真正要解释清楚虚拟内存是什么,能讲明白的人其实不多。甚至有不少…

阅读更多 →
西电机器学习课设包:10个实验项目源码与避坑指南 2026/10/2 15:28:31

西电机器学习课设包:10个实验项目源码与避坑指南

简介:这份资源是西安电子科技大学机器学习课程设计的完整实践包,面向刚接触机器学习、需要完成课程设计或期末大作业的学生。内容围绕10个实验项目展开,覆盖线性回归、逻辑回归、决策树、随机森林、支持向量机、聚类算法等核心主题&#xff0…

阅读更多 →
Netty ChannelInitializer源码解析:pipeline初始化与粘包处理 2026/10/2 15:28:30

Netty ChannelInitializer源码解析:pipeline初始化与粘包处理

ChannelInitializer在Netty里不算一个多复杂的类,但它的作用非常关键——它是pipeline初始化的真正入口,也是绝大多数业务handler被挂载进pipeline的起点。很多人看Netty源码时,从Bootstrap一路追到AbstractBootstrap的initAndRegister方法&a…

阅读更多 →
大模型上下文与工具链搭建:RAG、记忆、API、MCP与鉴权审计实战 2026/10/2 15:28:30

大模型上下文与工具链搭建:RAG、记忆、API、MCP与鉴权审计实战

1. 从标题拆解这套系统的真实骨架 1.1 为什么是"上下文工具链"而不是单纯的RAG 看到"大模型上下文与工具链搭建"这个说法,很多人第一反应就是"又一个RAG教程"。但把标题拆开看,RAG只是四个关键词里的一个,后面…

阅读更多 →
Claude Code 入门教程:从环境准备到首次修改代码 2026/10/2 15:28:29

Claude Code 入门教程:从环境准备到首次修改代码

作为一个在终端里折腾了十年的开发者,我现在写代码效率最高的场景已经不是“打开 IDE 一顿操作”,而是打开终端,敲一个命令,把 Claude Code 叫出来,然后用自然语言改代码。这不是让你偷懒,而是把“找文件、…

阅读更多 →
铼:从周期表边缘到航空发动机核心的稀有金属 2026/10/2 15:28:15

铼:从周期表边缘到航空发动机核心的稀有金属

如果你问一个材料工程师,元素周期表上哪一种金属最“低调但不可替代”,我大概率会回答:75号元素铼,符号Re。它的熔点接近3200℃,在纯金属里仅次于钨;它在地壳里的平均丰度只有十亿分之零点几,比…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉