我有一个带有 4 个域控制器的域 test.local。
我有一台 SQL Server,有时重新启动我的一个域控制器时出现以下错误:
描述:SSIS 错误代码 DTS_E_OLEDBERROR。发生了 OLE DB 错误。错误代码:0x80004005。OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“登录失败。登录来自不受信任的域,不能与 Windows 身份验证一起使用。”。
为什么其他 3 个 DC 上没有进行身份验证?通常,当有多个域控制器时,会有负载平衡。
感谢您的帮助
答案1
似乎知道问题。
但我想知道这是否只是与您的 MSSQL 服务器上的某些网络设置或连接设置(持久性?)有关。这意味着当您重新启动 DC 时,SQL 服务器不知道,并且 SQL 正在尝试进行身份验证,它会在身份验证过程中切断连接或破坏来自 DC 的响应。
这是来自 Microsoft 文档
建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误
(我知道这是来自另一边的,但与链接的已知问题相关的似乎与网络有关)
答案2
这就是我解决这个问题的方法。
首先,您需要检查您的 SQL Server 实例是否在哪个身份验证系统上运行。使用 Windows AD 用户执行以下查询:
select auth_scheme from sys.dm_exec_connections where session_id=@@spid
KERBEROS
如果 SQL Server 使用 Kerberos 身份验证,则结果窗口的 auth_scheme 列中会出现一个列为“ ”的字符串。
如果身份验证是NTLM
,那么您就遇到了我遇到的问题。
因为如果您使用NTLM
,每次您的客户端尝试连接到 SQL Server 时,它都会查询 AD 以询问您是否获得授权。
在 Kerberos 身份验证中,有一个令牌系统。连接到 SQL 数据库的客户端将获得一个唯一令牌,其有效期为 10 小时(Windows 系统上的默认值)。然后它将过期。如果域控制器在令牌有效期内不可用,您仍然可以连接到 SQL Server。
(确保以域管理员身份执行命令)。要配置 Kerberos,您需要添加一个 SPN,如下所示:
SetSPN –A MSSQLSvc/<ComputerName>.<DomainName>:1433 <AccountName>
例如,如果我的 SQL Server 是 redmond.microsoft.com 域中的 Server1,并使用服务帐户 SqlSvcUsr 运行,则命令将是:
SetSPN –A MSSQLSvc/Server1.redmond.microsoft.com:1433 redmond\SqlSvcUsr
如果您想添加特定实例,那么它将是:
SetSPN –A MSSQLSvc/Server1.redmond.microsoft.com:50203 redmond\SqlSvcUsr
SetSPN –A MSSQLSvc/Server1.redmond.microsoft.com:MyInstance redmond\SqlSvcUsr
然后重新启动 SQL Server 服务。并再次执行查询:
select auth_scheme from sys.dm_exec_connections where session_id=@@spid
应该列出 Kerberos。
希望能帮助到你。