ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SQL Server远程连接配置指南:解决登录失败与常见报错

SQL Server远程连接配置指南:解决登录失败与常见报错 1. 远程连接失败的真正原因先别急着改配置先聊一个最常见的场景你在本地用 SSMS 连一台内网里的 SQL Server结果弹出来一堆让人头皮发麻的报错。我这些年被问得最多的三句话是“找不到服务器”“用户登录失败”“无法连接到 XXX”。你去网上一搜众说纷纭有的让你开协议有的让你改防火墙其实它们都对但都没说全。远程连不上 SQL Server九成以上是下面几个环节卡住了而且是链式的缺一环都不行SQL Server 服务本身没起来或者只允许本机访问网络层面不通防火墙没放行 1433 端口SQL Server 用的是 Windows 身份验证模式远程没法用 SQL 账号登录客户端连错了实例名或者命名实例的浏览器服务没开很多人一上来就盯着“SQL Server 配置管理器”猛改改完发现还是连不上就是因为漏了后面的环节。这篇文章我会把这套链路完整拆开覆盖 2008R2、2014、2017 这三个最常见的版本把每一步背后的原因也讲清楚。你照着做能少走一大半弯路。2. 三步核心配置从服务端打开远程访问的大门2.1 第一步启用 TCP/IP 协议并确认监听端口打开“SQL Server 配置管理器”这个工具在开始菜单里就能找到注意不是“SQL Server 安装中心”。左侧找到“SQL Server 网络配置”点开对应实例右边会看到三个协议Shared Memory、Named Pipes、TCP/IP。默认情况下Shared Memory 是启用的TCP/IP 有可能是禁用的。Shared Memory 只允许本机进程通过内存共享方式连接远程访问根本走不到它。所以你得把 TCP/IP 的“已启用”状态改成“是”。这一步做完别急着走右键 TCP/IP进“属性”切到“IP 地址”标签页。这里面的内容是大多数新手最容易看懵的地方因为 IP 列表特别长有 IP1、IP2……一直到 IP10还有 IPAll。你需要往下拉找到“IPAll”这一组把“TCP 端口”设为 1433这是 SQL Server 默认实例的标准端口。如果你用的是命名实例默认情况下 SQL Server 会动态分配端口每次服务重启端口可能变这会给远程连接带来很大麻烦所以强烈建议在这里把端口固定下来等会儿讲命名实例时我再细说。把 TCP 动态端口那一栏里的 0 清空0 表示动态分配不固定。你不清掉它即使你写了 TCP 端口服务重启后可能还是会走动态端口导致客户端连接失败。2.2 第二步重启 SQL Server 服务让配置生效配置管理器里改完网络协议不是点个“确定”就完事的。TCP/IP 的启用状态变更必须重启 SQL Server 服务才能生效。这个坑我见得太多了有人改完配置直接去客户端连报错后回头问我“为什么还是连不上”一问服务压根没重启。重启路径配置管理器左侧点“SQL Server 服务”右边找到你的实例名对应的服务右键选择“重新启动”。如果你有 SQL Server Agent 之类的依赖服务建议一并重启免得后面作业跑不起来。这里有个细节2008R2 的老实例有时候服务重启特别慢甚至卡在“正在停止”状态。别慌等一两分钟是正常的。如果超过五分钟还停不下来可以直接在服务管理器里先停止再启动实在不行就重启操作系统这是最笨但最有效的办法。2.3 第三步防火墙放行 1433 端口服务端配置完了接下来是网络层的拦路虎——防火墙。Windows 自带的防火墙默认会拦截外部对 1433 端口的访问你配置做得再好防火墙一挡远程照样连不上。放行方法有两种选一种就行。一种是通过“高级安全 Windows 防火墙”新建入站规则选择“端口”协议选 TCP端口填 1433然后允许连接应用到域、专用、公用三个配置文件都勾上。另一种是直接在命令行执行netsh advfirewall firewall add rule nameSQL Server 1433 dirin actionallow protocolTCP localport1433执行命令前请用管理员身份打开 CMD 或者 PowerShell否则会提示拒绝访问。我实测过这条命令在 Windows Server 2008 R2 到 2019 上都适用兼容性没问题。如果你的 SQL Server 是命名实例而且没有固定端口那么光放行 1433 是不够的因为命名实例可能监听在随机端口上。这种情况下你还需要放行 UDP 1434这是 SQL Server Browser 服务使用的端口。客户端靠它来解析命名实例对应的 TCP 端口一旦 UDP 1434 被防火墙拦住客户端就报“找不到服务器”之类的错误。最简单省心的办法固定端口后只放行 TCP 1433命名实例也建议固定端口。注意有些人在云服务器上配好了以上所有设置还是连不上请检查云平台的安全组规则。云厂商的安全组相当于又一道防火墙你必须在安全组里额外放行 TCP 1433。这一步漏掉的人不在少数。3. 登录认证方式与客户端连接配置3.1 把身份验证模式切换为混合模式服务端网络配置通了你拿着 SSMS 去连可能又遇到另一个经典报错“用户 sa 登录失败。原因: 该帐户当前被锁定或未启用”。其实这个提示有点误导大部分情况下是 SQL Server 的身份验证模式压根不允许 SQL 账号登录。默认安装时SQL Server 的身份验证模式是“Windows 身份验证模式”也就是说只有 Windows 系统账号能连sa 这类 SQL 账号默认是禁用状态。你需要切换成“SQL Server 和 Windows 身份验证模式”。操作路径用 Windows 管理员身份打开 SSMS 连接本机实例 → 右键实例名选“属性” → 切到“安全性”页 → 选择“SQL Server 和 Windows 身份验证模式” → 确定。改完认证模式同样需要重启服务才能生效。你可以在 SSMS 里右键实例重启也可以回配置管理器里重启。重启之后你会发现之前的 Windows 登录还能用但 SQL 账号能不能登录还得看下一步。3.2 启用 sa 账号并设置强密码sa 账号默认是禁用的这也是安全机制的一部分。右键实例名展开“安全性” → “登录名”找到 sa右键选“属性”。在“常规”页里设置一个新密码然后在“状态”页里把“登录”选项从“禁用”改成“启用”。密码这块多说一句别设太简单的。虽然内网环境可能觉得无所谓但数据库直接暴露在公网的情况一点都不少见弱密码被扫到就是几分钟的事。至少 8 位以上包含大小写字母和数字这是底线。强密码设置完了可以用 SSMS 先本地验证一下连接时选择“SQL Server 身份验证”输入 sa 和密码能连上说明服务端已经准备好了。顺带提一下如果你不想用 sa也可以自己新建一个 SQL 账号授予相应权限。做法是在“登录名”上右键新建创建时选择“SQL Server 身份验证”然后在“服务器角色”页勾选 sysadmin效果和 sa 差不多。生产环境建议用这种方式方便控制权限和追责。3.3 客户端连接字符串与常见参数服务端配置完毕客户端这边也要讲究一点。用 SSMS 连接时服务器名称的填法有讲究。默认实例直接填 IP 或者机器名比如 192.168.1.10命名实例要填IP\实例名比如192.168.1.10\SQLEXPRESS。如果你刚才在配置管理器里把命名实例的端口固定到了 1433那也可以直接填IP,1433这种写法跳过 SQL Browser 的解析过程既快又稳。这种方法在写代码的连接字符串里特别实用。C# 和 Java 的连接字符串分别长这样// C# / .NET Server192.168.1.10,1433;DatabaseMyDB;User Idsa;PasswordYourStrongPassword;TrustServerCertificateTrue;// Java JDBC jdbc:sqlserver://192.168.1.10:1433;databaseNameMyDB;usersa;passwordYourStrongPassword;encrypttrue;trustServerCertificatetrue;注意到没我在两个连接串里都加了TrustServerCertificateTrueJava 里是trustServerCertificatetrue这个参数很关键。新版驱动默认会对服务器证书做校验如果你的 SQL Server 用的是自签名证书不加这个参数就会报“证书链是由不受信任的颁发机构颁发的”错误。这个报错现在太常见了很多人以为是网络问题其实就是证书信任的问题。4. 2008R2、2014、2017 三个版本的差异4.1 三个版本在远程配置上的相同点先说共同的部分免得你在这三个版本之间切换的时候手忙脚乱。远程配置的底层逻辑差不多都是配置管理器启用 TCP/IP、重启服务、防火墙放行、开启 SQL 身份验证流程完全一致。数据库引擎的默认端口都是 1433sa 账号的位置也一样。所以如果你已经熟悉了 2014 的操作到了 2008R2 和 2017 上按同样的路径走就行。界面风格上2008R2 老一些是传统的企业管理器风格2014 开始往扁平化走2017 的配置管理器跟 2016 之后差不多但功能位置没变。4.2 2008R2 特别容易踩的坑2008R2 是我踩坑最多的地方。首先它的配置管理器藏得比较深在“开始菜单 → Microsoft SQL Server 2008 R2 → 配置工具”下面有时候装完系统找不到直接运行SQLServerManager10.msc也能打开。2008R2 还有一个问题默认安装时可能没装 SQL Server Browser 服务。如果你的应用需要靠实例名去连数据库没有 Browser 服务光放行防火墙也没用。检查方式配置管理器左侧找到“SQL Server 服务”看有没有“SQL Server Browser”这项状态如果是“已停止”右键启动并把它改成自动启动。这个版本太老很多人第一次接触 SQL Server 就是从 2008R2 开始的所以遇到这类基础问题容易懵。另外 2008R2 的 sa 密码策略默认比较严格设得太简单不让你通过。这个其实是个保护机制别去绕它。4.3 2014 和 2017 的新变化与隐藏坑2014 和 2017 的远程配置界面更友好配置管理器里协议状态一目了然。2017 开始默认安装时其实已经启用了 TCP/IP跟早期版本默认禁用不太一样但仍建议确认一遍因为很多时候装的是别人打包好的镜像里面设置未必干净。2017 还有一个特点默认启用了 Always On 相关组件如果你只是普通单机使用不会影响远程连接但会多耗一点内存。看到 SQL Server 进程内存占用高不用太意外这是设计如此不是出了故障。更隐蔽的问题是客户端驱动版本。2008R2 年代用老版本驱动连 2017 实例有时候会报“不支持此功能”之类的错升级一下 SSMS 或者 ODBC 驱动到 17 以上就好了。尤其是 ODBC Driver 17 连接时默认会强制要求加密连接导致一些老旧应用报 SSL 相关的错误。遇到这种可以在连接字符串里加上EncryptFalse或者TrustServerCertificateTrue来规避。4.4 版本对比速查表配置项SQL Server 2008R2SQL Server 2014SQL Server 2017配置管理器运行命令SQLServerManager10.mscSQLServerManager12.mscSQLServerManager14.mscTCP/IP 默认状态可能禁用可能禁用通常启用SQL Server Browser可能需要手动启动通常已安装默认安装默认端口143314331433认证模式切换路径属性 → 安全性属性 → 安全性属性 → 安全性常见客户端驱动坑老驱动兼容性加密连接报错证书信任报错这张表是给运维和开发同学快速定位用的。下次有人问“某某版本怎么开远程”你先问他版本号再照着表里的命令直接开配置管理器能省不少沟通时间。5. 高频故障排查报错问得最多的几个5.1 “用户 sa 登录失败”这类报错分好几种情况。如果完整信息是“用户 sa 登录失败。原因: 该帐户当前被锁定”说明 sa 被锁定了不是密码问题。SQL Server 有账户锁定策略连续输错密码次数太多会触发锁定跟 Windows 的账户锁定一个道理。解锁路径先用 Windows 身份登录 SSMS找到 sa 属性在“状态”页把“锁定”勾掉。如果报错是“用户 sa 登录失败。原因: 密码与所提供的值不匹配”那就是密码错了重新确认密码。建议直接重置一次密码再试别在原有密码上猜来猜去。还有一种是“无法连接到服务器”之前就报登录失败那可能是认证模式没切过来回 3.1 节把混合模式打开。5.2 “在建立与服务器的连接时出错。在连接到 SQL Server 时默认设置 SQL Server 不允许远程连接”这个报错非常经典几乎就是配置管理器没设置好。如果遇到这个提示基本可以确定是 TCP/IP 协议没启用或者服务没重启。按第 2 章的步骤从头走一遍先启用协议再重启服务然后再连接九成能解决。这个报错在 2008R2 上出现频率最高因为旧版本默认就在协议层面限制远程访问。2014 和 2017 如果遇到多半是安装时选了某些定制配置。5.3 “证书链是由不受信任的颁发机构颁发的”这个报错基本上都是 SSL 证书信任问题。新版 ODBC Driver 18 默认强制启用加密还会对服务器证书做严格校验。SQL Server 默认用的自签名证书不在客户端的信任列表里于是连接直接被拒绝。解决办法有三种按推荐顺序排列连接字符串里加TrustServerCertificateTrue跳过证书链校验连接字符串里加EncryptFalse禁用加密注意这个只适合内网环境在 SQL Server 配置管理器里给实例配置一张受信任的证书前两种是绕开问题第三种是正规解法适合企业生产环境。个人测试和学习场景用前两种就够了别纠结。5.4 “无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接”这个报错在写 C# RestClient 之类的程序时偶尔碰到很多人第一反应是网络问题其实大概率是连接被服务器端主动断掉。原因可能是超时时间设置太短连接池里的连接已经被服务器回收或者服务器端的加密策略跟客户端不匹配。排查思路先用 SSMS 手动连一下确认服务器本身没问题再检查连接字符串里的超时参数比如Connect Timeout别设太短至少 15 秒最后确认驱动版本和加密参数按 5.3 的解法处理。这类报错在公网环境、中间有代理的情况下更容易出现因为代理可能主动断开空闲连接。如果场景允许内网直连会稳定得多。5.5 常见问题速查表现象排查顺序解决方案TCP/IP 已启用但远程连不上1. 服务是否重启 2. 防火墙 3. 云安全组重启服务放行 1433 端口找不到服务器/实例1. 实例名是否写对 2. Browser 服务 3. UDP 1434 防火墙固定端口用IP,端口形式连接sa 登录失败1. 是否锁定 2. 密码 3. 认证模式解锁账号重置密码切换混合模式SSL 证书报错1. 驱动版本 2. 加密参数加TrustServerCertificateTrue程序连接超时/被强制断开1. SSMS 手动测试 2. 超时配置 3. 中间网络设备调整超时确认驱动版本尽量内网直连这张表我建议截图收藏或者抄在你的运维笔记里。做数据库运维的人每天遇到的新问题千奇百怪但高频问题永远是这几个组合。排查不要跳步按顺序一项项排除比瞎猜高效得多。6. 最后补几个实操心得这几个心得是我这几年帮人排查远程连接问题总结出来的不是从文档里抄的。第一改配置前先看一眼现有状态别急着动。很多人上来就改协议、改端口结果服务起来了反而连不上就是因为没搞清楚原本什么配置是好的改坏了都不知道往哪退。改之前用 SSMS 本机连一次做个基线记录。第二固定端口这件事越早做越好。命名实例的动态端口问题平时不暴露一旦你需要在程序里配置连接串或者防火墙要做精细化放行动态端口就会让你怀疑人生。固定端口后连接串就写IP,1433既不依赖 SQL Browser也不受 UDP 1434 封禁影响稳得很。第三SQL Server 2017 之后的高版本如果看到连接报错就先查证书再查网络顺序别搞反。我见过有人为了一个 SSL 证书报错折腾了两天防火墙最后加上一个参数就通了非常浪费时间。第四2008R2 这个老版本能不用就别用来跑生产了。它已经停止主流支持很多年安全补丁和兼容性都跟不上。如果你是在学习环境里练手那无所谓照着这篇文章配通远程再去学 2014 或 2017 的差异点学习曲线会很平缓。如果是生产环境尽早规划升级到 2017 以上吧。
返回列表