SQL Server 18456错误全解析:State码与登录排查实践指南
开门见山说一句18456 这个错误码只要摸过 SQL Server 的人基本都撞到过。尤其是周一早上开发跑过来说“数据库连不上了”你打开 SSMS 一试弹窗里写着一句冷冰冰的 Login failed for user再翻一下 SQL Server 错误日志后面跟着 Error: 18456, Severity: 14, State: 8——数据库本身没挂网络也不是断的就是“门禁不认人”。这篇文章就把 18456 彻底拆开讲清楚错误码背后不同 State 分别代表什么从服务到账号怎么一步步排查以及 SolidWorks Electrical 这类第三方软件连接 SQL Server 失败时怎么处理。不管你是 DBA、开发还是纯使用者照着这个思路走绝大多数 18456 都能在半小时内定位、解决。1. 18456 错误到底是什么——先搞清楚错在哪一层很多人一看到 18456 就以为是“密码错了”实际上这个错误远没有那么简单。它属于登录阶段的认证失败意思是 SQL Server 已经收到了你的登录请求但在验证登录名和密码这层被拦下了。注意这个前提——SQL Server 已经“收到”并“处理”了你的请求所以它跟“网络不通”“服务没启动”“目标主机拒绝连接”完全是两码事。1.1 SSMS 弹窗 vs 错误日志里的真相SSMS 弹窗只告诉你结果不告诉你原因。你看到的往往是这么一句无法连接到 192.168.1.100\MSSQLSERVER。 用户 sa 登录失败。 (Microsoft SQL Server错误: 18456)这句话的信息量非常有限真正有用的内容在 SQL Server 的 ERRORLOG 里。以默认实例为例日志目录通常在C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG如果你不想去磁盘里翻文件直接在 SSMS 里执行这条命令效率更高EXEC sp_readerrorlog 0, 1, Login failed;错误日志里会写成这样2024-06-10 09:15:32.01 Logon Error: 18456, Severity: 14, State: 8. 2024-06-10 09:15:32.01 Logon Login failed for user sa. Reason: Password did not match that for the login provided. [CLIENT: 192.168.1.5]State 后面的数字才是破案的关键Reason 部分更是直截了当告诉你失败原因。所以我处理这类工单的第一反应永远是先翻错误日志用事实说话而不是靠猜。1.2 错误状态码State对号入座State 不同解法天差地别。这里综合微软官方文档和长期运维经验把高频状态码整理成一张表State 值典型含义常见场景1一般登录错误可能是服务端未就绪、连接参数异常服务未完全启动、连接串格式错误2登录名不存在或无效连接字符串里写了一个不存在的账号5登录名有效但登录失败sa 被禁用、登录名被孤立、权限不足8密码错误密码输错、密码被改过9密码错误与 8 类似密码不匹配多出现在程序连接串里写错密码11 / 12登录名有效但服务器访问被拒绝登录名无法访问 master 或存在孤立登录名18密码必须更改后才能登录首次登录强制改密、密码已过期看到没State 2 和 State 8 的区别是“账号存不存在”和“密码对不对”State 5 和 State 8 更是完全不同——State 5 的账号可能密码是对的但 sa 账户默认就被禁用了或者登录名没有 CONNECT 权限。1.3 登录名、数据库用户和认证模式先分清这三件事不少人把“登录名”和“数据库用户”混为一谈这不是小事。打个比方SQL Server 实例是一栋大楼登录名是你的门禁卡能不能进大门看这张卡数据库用户是你被分配的某个房间的钥匙进了大门之后你还要有对应房间的钥匙才能打开某个数据库。18456 发生在“刷门禁卡”这一层也就是说服务器级别认证没过。如果你登录名进去了但打不开某个数据库报的往往不是 18456而是 4064 这类“无法打开数据库”的错误——那是钥匙开不了房门的问题。另外认证模式有两种Windows 身份验证模式和混合模式Windows SQL Server 身份验证。如果实例被设成仅 Windows 认证那所有用 SQL 登录名比如 sa发起的连接必然全部失败日志里 State 五花八门但根因只有一个。这个细节放在后面排查路线里展开因为你很可能就卡在这。2. 排查路线图从服务到账号一层层剥开纠正一个常见误区不要一上来就重置 sa 密码。18456 的根因可能在任何一个环节从服务到网络、从认证模式到账号密码先评估再动手否则可能把问题越搞越乱。下面是按优先级排的排查顺序。2.1 第一层服务、网络、端口通不通先确认服务在跑。打开 Windows 服务管理器找到 SQL Server (MSSQLSERVER) 或对应的命名实例状态必须是“正在运行”。如果服务没起来SSMS 报的通常不是 18456而是“无法打开连接错误 10061 或 5”但有些版本组合下也会被包装成登录失败所以这步花十秒排除掉再说。然后是网络层。默认实例监听 1433 端口命名实例默认动态端口需要在 SQL Server 配置管理器里确认 TCP/IP 协议是否启用、端口号是多少。推荐直接用 PowerShell 测一下Test-NetConnection 192.168.1.100 -Port 1433如果显示 TcpTestSucceeded 为 False那就是网络或防火墙问题跟 18456 十有八九没直接关系。还有一个细节很坑SQL Server 连接字符串里端口是用逗号分隔的不是冒号正确写法是192.168.1.100,1433别在这栽跟头。2.2 第二层SQL Server 身份验证模式对不对这是被最多人忽略的一层。先查当前实例的认证模式SELECT SERVERPROPERTY(IsIntegratedSecurityOnly) AS AuthMode;返回 1 表示仅 Windows 身份验证返回 0 表示混合认证。如果你打算用 sa 或应用账号SQL 登录名连但实例是 1那连一万次都是 18456——因为 SQL 登录名根本不参与认证。改成混合模式的方法SSMS 里右键实例 → 属性 → 安全性 → 服务器身份验证 → 选“SQL Server 和 Windows 身份验证模式”然后重启 SQL Server 服务。注意这一步必须重启不重启不生效。2.3 第三层登录名是否存在、是否被禁用登录名无效这个词普通用户听起来可能很抽象。说白了就两种情况连接字符串里写的用户名在 SQL Server 里不存在或者存在但被禁用。用这条命令看所有 SQL 登录名的状态SELECT name, is_disabled, is_policy_checked, is_expiration_checked FROM sys.sql_logins;is_disabled 为 1 就是账号被禁用。最常见的例子就是 sa——微软从 SQL Server 2005 开始默认禁用 sa新版安装时也基本默认禁用。很多教程让用户“启用 sa、改 sa 密码”其实第一步应该是把 sa 的 is_disabled 改成 0密码改不改要看情况。2.4 第四层密码对不对、过没过期、锁没锁定到了这一层才是大家普遍认为的“密码问题”。三类情况要看清楚第一密码本身就错了。日志里通常写着 Password did not matchState 8 或 9。这种直接改密码或让客户端换成正确密码即可。第二密码到期。如果实例配置了对账策略而且是从域环境同步过来的策略SQL 登录名也可能被强制密码过期。log 里 State 18或者 Reason 写 Password must be changed。这种你输任何旧密码都进不去程序连接也一样挂。第三登录名被锁定。反复输错密码导致账号被 Windows 策略锁定日志里会出现 Account is locked out。锁定的解除方式不是“改密码”而是用有权限的账号执行ALTER LOGIN [登录名] WITH PASSWORD UNLOCK;不过 SQL Server 里锁定的常见处理逻辑是直接重置密码就能顺带解锁。后面实操部分会一起讲。3. 三个高频场景的完整修复实操排查看完了这一节直接给能抄作业的修复方案。我挑了三个工作中最常遇到的实际场景每一个都给出完整的操作序列。3.1 场景一sa 登录失败重置 sa 账户密码现象开发说“我用 sa 连不上了”错误日志里 State 是 5 或 8。如果 State 是 5首先怀疑 sa 被禁用。用 Windows 身份验证方式登录 SSMS前提是你的 Windows 账号有 sysadmin 权限执行下面两条语句ALTER LOGIN sa WITH PASSWORD 你的强密码; ALTER LOGIN sa ENABLE;如果 State 是 8那就是密码不对直接执行ALTER LOGIN sa WITH PASSWORD 新的强密码, CHECK_POLICY OFF; ALTER LOGIN sa ENABLE;这里我刻意加了CHECK_POLICY OFF这样密码策略不会对 sa 指手画脚避免“新密码不满足复杂度要求”这个连环报错。安全上密码本身还是得设成够强的只是不让策略来强制而已。改完密码之后还要确认一下 TCP/IP 是否已启用因为有些机器只启用了 Shared Memory 协议远程连不上会报登录失败相关的错误。SQL Server 配置管理器里把 TCP/IP 设为已启用然后重启服务。3.2 场景二SolidWorks Electrical 等第三方软件连接失败这在论坛上是非常典型的求助帖SolidWorks Electrical 无法连接到 SQL Server弹出的提示写着“此故障的可能原因用户名或密码不正确”。SolidWorks Electrical 这类软件内部使用 SQL Server Express 保存电气项目数据。安装时它会自动创建实例和专用登录账号你平时几乎感知不到数据库的存在。但一旦 Windows 账号变动、数据库服务停了、或者密码策略把它创建的登录名搞到锁定/过期软件就连不上了。处理顺序是这样的第一步确认 SQL Server Express 服务在运行。Windows 服务里找带 SQLEXPRESS 字样或软件安装时自定义的实例名启动类型建议改为“自动”。第二步用 SSMS 以 Windows 身份验证连接该实例。注意连接实例名要和软件里配置的一致比如机器名\SQLEXPRESS。第三步查错误日志确认是哪个登录名失败了EXEC sp_readerrorlog 0, 1, Login failed;日志里会暴露软件实际使用的登录名比如SWE_admin之类。找到了就好办。第四步检查这个登录名状态并重置密码SELECT name, is_disabled, is_policy_checked, is_expiration_checked FROM sys.sql_logins WHERE name N刚查到的登录名;ALTER LOGIN [刚查到的登录名] WITH PASSWORD N新密码, CHECK_POLICY OFF, CHECK_EXPIRATION OFF; ALTER LOGIN [刚查到的登录名] ENABLE;第五步关键一步SQL 端密码改了之后软件端的连接配置也得同步。去 SolidWorks Electrical 的数据库连接设置里把密码更新成刚才重设的值。甚至有一种更省事的做法——查一下软件连接配置里原本写的什么密码然后再把 SQL 登录名改回那个旧密码两边不用互相迁就。千万别忘了这类软件对数据库账号要求很苛刻它不一定接受 Windows 身份验证连接。如果实例被改成了仅 Windows 认证模式也会导致同样的失败这就把问题绕回到第 2 节的认证模式检查了。3.3 场景三程序连接串报错密码过期与策略修正程序连不上 SQL Server报 18456最怕的是“程序侧看到的错误和数据库侧不一样”。数据库日志里写 State 18 或者 Password must be changed那十有八九是密码过期。这种场景最容易出现在企业域环境里。SQL Server 的登录名勾了“强制实施密码策略”和“强制实施密码过期”于是密码到 90 天就失效。用户从应用界面一脸懵密码没变过啊怎么突然连不上了修复思路分两步。第一步先用一个能登进去的账号通常是 Windows 认证 sysadmin进 SSMSALTER LOGIN [应用账号] WITH PASSWORD N新密码, CHECK_EXPIRATION OFF, CHECK_POLICY OFF;CHECK_EXPIRATION OFF是关掉密码过期检查治本CHECK_POLICY OFF是为了让密码哪怕稍微简单点也能用避免改个密码还要跟策略搏斗。安全角度建议密码仍然设复杂些但别让策略卡脖子。第二步去应用配置文件或代码里的连接字符串把密码改成新值。这里分享一个实操经验如果应用很多一时半会改不全可以把密码改成应用里当前写着的那个值——就是你“这次连接失败时正在使用”的密码——然后把过期检查关掉。这样应用端不用动数据库端一劳永逸。顺带注意一点连接字符串里如果有Password别漏掉后面的分号也别把User ID写成UserId这类低级错误虽然报的不是 18456 而是“关键字不受支持”但同样会造成连接失败排查时容易被误带节奏。4. 被锁在门外单用户模式进系统找回控制权前面几个场景都有一个前提你能用 Windows 身份验证登录 SSMS。但有一种极端情况——所有 sysadmin 成员对应的 Windows 账号都被误删了或者本机管理员账号权限被改了导致 Windows 认证也进不去。这时候只剩一条路以单用户模式启动实例用专用管理员连接DAC杀进去手动把控制权拿回来。4.1 用 -m 参数以单用户模式启动实例单用户模式的意思是只允许一个用户连接。操作流程打开 SQL Server 配置管理器。找到对应的 SQL Server 服务右键 → 属性 → 启动参数。添加参数-m保存。重启服务。需要注意这个-m不是随便加的它限制只有 sysadmin 角色成员才能连接普通账号会被挡在外面。还有一种替代做法是去命令行手动跑net stop MSSQLSERVER cd C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn sqlservr.exe -m此时 SQL Server 在前台以单用户模式运行处理完记得关掉这个前台进程否则服务一直处于“手动运行”状态。4.2 通过 DAC 把自己的 Windows 账号提升为 sysadmin单用户模式下用 sqlcmd 加-A参数走专用管理员连接是官方支持的正规做法sqlcmd -S localhost -E -A进来之后先确认自己是谁然后把当前 Windows 账号加入 sysadminSELECT SUSER_SNAME(); GO CREATE LOGIN [你的机器名\你的Windows账号] FROM WINDOWS; ALTER SERVER ROLE sysadmin ADD MEMBER [你的机器名\你的Windows账号]; GO如果没有-A也能连上实例操作一致。但建议能用 DAC 就用 DAC它走的是独立连接通道单用户模式下更稳不会出现“连接被占用”的尴尬。处理完之后把配置管理器里加的-m参数删掉重启服务。这一步千万别忘——我曾见过有运维把-m留了一个月期间所有常规连接都时不时报错后来才想起来是启动参数没清。4.3 恢复登录后的三项善后操作控制权拿回来之后别急着关。按下面的顺序把环境整理干净第一立刻重置 sa 密码并启用ALTER LOGIN sa WITH PASSWORD 强密码; ALTER LOGIN sa ENABLE;第二确认实例是混合认证模式。如果是仅 Windows 认证把 sa 启用也是白搭SELECT SERVERPROPERTY(IsIntegratedSecurityOnly);第三把之前误删的 Windows 登录名重新创建好。很多“所有账号都没了”的闹剧其实只是某个 Windows 账号被误卸单用户模式下加上就完事不需要重装数据库。善后做完日志里再查一下有没有其他异常EXEC sp_readerrorlog 0, 1, error;确认干净后这个实例才算真正救回来。5. 常见问题排查速查表与避坑心得把这么多年见过的 18456 相关典型问题浓缩成一张速查表遇到问题先对着表找方向能省一半时间报错现象可能原因快速解法所有 SQL 登录名全部 18456实例处于仅 Windows 认证模式改混合认证并重启服务特定账号 18456State 8密码错误重置密码或让客户端改密码特定账号 18456State 5sa 被禁用或登录名权限异常ALTER LOGIN 启用账号特定账号 18456State 18密码过期或首次登录强制改密关闭 CHECK_EXPIRATION 或改密码软件如 SolidWorks Electrical连不上服务停了 / 登录名失效 / 认证模式不对按第 3.2 节流程走一遍数据库能登录但只能进 master 一个库登录名默认数据库被删或不可访问修改登录名默认数据库或恢复对应库连接串报 SSL 证书不受信任加密与证书验证层面问题非 18456连接字符串加 TrustServerCertificateTrue再说几个容易踩的坑。第一不要只看 SSMS 弹窗。弹窗给的信息太粗所有 18456 看起来都差不多。真正的诊断信息一定在错误日志里先查日志再动手这是铁律。第二不要在实例外面乱改。有些教程会让用户去注册表里改 EnableTcp 或者直接删用户数据库文件这些操作风险极大。SQL Server 自己不傻该用 SSMS、配置管理器、sqlcmd 做的操作别绕到系统底层去硬改。第三区分好“登录错误”和“连接错误”。开头提到过的 SSL 证书链不受信任、无法建立连接、超时、10061这些统统不是 18456它们发生在认证之前。报 18456 至少说明你走到了 SQL Server 的登录这扇门口别在网络上白费力气。第四善用sp_readerrorlog这个内置函数。它是排查 SQL Server 问题的万金油不管是登录失败、数据库启动失败、还是死锁相关信息都能从日志里挖出来。命令也简单-- 0 表示当前错误日志1 表示错误日志类型 EXEC sp_readerrorlog 0, 1, login failed; EXEC sp_readerrorlog 0, 1, 18456;第五关于“SQL Server 是不是必须用云服务”的疑问顺便澄清一下本地安装的 SQL Server 是完全独立的软件不依赖任何云平台。要不要和云服务集成取决于你的架构设计而不是数据库本身的硬性要求。那些因为一句“登录失败”就把问题联想成“是不是没配 Azure”的思路基本可以放下了。我自己的习惯是手上不管管着多少环境sa 密码永远放在密码管理器里同时给每个第三方软件单独建低权限登录名绝不共用 sa真出 18456 时先翻错误日志根据 State 对症下药而不是一上来就重置密码。排查 18456 说难不难难的是别凭感觉猜原因。善用错误日志和状态码基本没有搞不定的登录问题。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →