凌峰创科服务平台

服务器msdtc不可用怎么办?

这个问题通常意味着分布式事务协调器服务没有正常运行,或者其配置存在网络或安全策略上的问题,导致客户端或其他服务器无法与它建立通信。

服务器msdtc不可用怎么办?-图1
(图片来源网络,侵删)

下面我将为您提供一个从问题分析逐步排查和解决的完整指南。


第一步:理解 MS DTC 是什么

  • 全称: Microsoft Distributed Transaction Coordinator (微软分布式事务协调器)。
  • 作用: 它是 Windows 操作系统的一个核心服务,用于跨多个数据库、消息队列或服务器协调和管理事务,一个事务需要同时更新位于两台不同 SQL Server 上的数据库,MS DTC 就负责确保这两个更新要么全部成功,要么全部失败(原子性)。
  • 常见应用场景:
    • SQL Server 镜像或 Always On 跨数据库事务。
    • 涉及多个数据库服务器的事务。
    • COM+ 应用程序。
    • .NET 应用程序中使用 TransactionScope

第二步:问题原因分析

当您收到“MS DTC 不可用”的错误时,可能的原因有很多,主要可以归结为以下几类:

  1. 服务未运行或配置错误: MS DTC 服务本身没有启动,或者其启动类型被设置为“禁用”。
  2. 防火墙阻止: Windows 防火墙或其他第三方防火墙阻止了 MS DTC 通信所需的端口(默认为 135 端口和动态 RPC 端口)。
  3. RPC/DCOM 配置问题: DTC 依赖于远程过程调用和组件对象模型服务,这些服务的配置可能不正确。
  4. 安全策略问题: DTC 通信需要特定的网络和安全权限(如 DTC Logon 和 Network Service 权限),这些权限可能缺失或被错误配置。
  5. 账户权限问题: 运行 MS DTC 服务的账户(通常是 NT AUTHORITY\NetworkService)权限不足。
  6. 资源冲突: MS DTC 所需的资源(如 MSDTC 日志文件所在的磁盘空间不足或权限问题)。
  7. 注册表损坏: 极少数情况下,与 DTC 相关的注册表项可能已损坏。

第三步:详细的排查和解决步骤

请按照以下顺序进行排查,因为后面的步骤依赖于前面的步骤。

步骤 1:检查 MS DTC 服务状态

这是最基本也是最重要的一步。

服务器msdtc不可用怎么办?-图2
(图片来源网络,侵删)
  1. 打开 服务器管理器,点击右上角的“工具” -> “服务”
  2. 在服务列表中找到 Distributed Transaction Coordinator
  3. 检查其 “状态” 是否为 “正在运行”
  4. 检查其 “启动类型” 是否为 “自动”“自动(延迟启动)”
  • 如果未运行
    • 右键点击该服务,选择 “启动”
    • 如果启动失败,请查看“服务”窗口下方的 “服务状态” 下的 “错误日志”“属性” -> “恢复” 选项卡,里面会有详细的错误原因。
    • 如果启动类型是“禁用”,请将其更改为“自动”,然后尝试启动。

步骤 2:检查并配置防火墙

DTC 通信需要开放特定端口。

  1. 打开 Windows Defender 防火墙(在控制面板中搜索)。
  2. 点击左侧的 “允许应用或功能通过 Windows Defender 防火墙”
  3. 点击 “更改设置”(需要管理员权限)。
  4. 在列表中找到 “分布式事务协调器”,确保它在您的网络类型(如“专用”)下是 勾选 状态。
  5. 如果找不到或者上述方法无效,可以尝试更直接的端口开放方法:
    • 在防火墙高级设置中,创建 “入站规则”
    • 规则类型选择 “端口”
    • 协议和端口选择 “TCP”,并输入 135
    • 操作选择 “允许连接”
    • 配置文件勾选 “专用”“公用”(根据您的网络环境)。
    • 给规则命名,Allow DTC RPC Endpoint Mapper
    • 重要提示: 135 端口只是 RPC 端点映射器,真正的 DTC 数据传输使用的是动态分配的 RPC 端口。最佳实践是配置 RPC 动态端口分配

如何配置 RPC 动态端口:

  1. 在服务器上打开 命令提示符(管理员)
  2. 运行以下命令来查看当前的 RPC 动态端口范围:
    netsh rpc show global

    确保结果中的 Dynamic Port Range32768-65535 或其他有效范围。

  3. 两台需要进行 DTC 通信的服务器上,都执行以下命令,将 RPC 动态端口范围设置为一个较小的、固定的范围(50000-50100),这样在防火墙中只需要开放这个范围即可,这比开放整个 32768-65535 要安全得多。
    netsh rpc set global 50000-50100
  4. 重启服务器 使配置生效。
  5. 在防火墙中,为两台服务器都创建一条新的入站规则,允许 TCP 端口 50000-50100 的通信。

步骤 3:配置 DTC 安全设置

这是最复杂的部分,但也是解决问题的关键。

服务器msdtc不可用怎么办?-图3
(图片来源网络,侵删)
  1. 在命令提示符(管理员)中运行 dcomcnfg 来打开 “组件服务”
  2. 依次展开 “组件服务” -> “计算机” -> “我的电脑”
  3. 右键点击 “我的电脑”,选择 “属性”
  4. 切换到 “MSDTC” 选项卡。
  5. 点击 “安全配置”
  6. 在弹出的窗口中,确保勾选了以下所有选项:
    • 网络 DTC 访问:必须勾选。
    • 允许远程客户端:勾选。
    • 允许远程管理:勾选。
    • 允许入站事务:勾选。
    • 允许出站事务:勾选。
    • 启用事务协调器:勾选。
    • 不要求认证根据您的安全策略决定,在测试环境中可以勾选以简化问题,但在生产环境中,建议使用 “要求认证”“要求认证和加密” 以确保安全。
  7. 切换到 “事务管理器通信” 选项卡,点击 “不安全”“安全”,为了排查问题,可以先选择 “不安全”,但最终应配置为 “安全”
  8. 点击 “确定” 保存所有设置。

步骤 4:检查 RPC/DCOM 配置

  1. 再次打开 “组件服务” (dcomcnfg)。
  2. 展开 “组件服务” -> “计算机” -> “我的电脑” -> “DCOM 配置”
  3. 找到 “分布式事务协调器”
  4. 右键点击它,选择 “属性”
  5. “常规” 选项卡:确保 “应用程序身份”“交互式用户”“网络服务”推荐使用 Network Service
  6. “位置” 选项卡:确保勾选了 “在此计算机上运行”
  7. “安全” 选项卡:
    • 启动和激活权限:点击 “编辑”,确保 Network Service(或您选择的服务账户)有“本地启动”和“本地激活”权限。
    • 访问权限:点击 “编辑”,确保 Network Service(或您选择的服务账户)有“本地访问”权限。
    • 配置权限:点击 “编辑”,确保 SystemNetwork Service 有“本地启动”和“本地调用”权限。
  8. 点击 “确定” 保存。

步骤 5:重启服务并验证

  1. 完成以上所有配置后,必须重启 MS DTC 服务
    • 打开“服务”,找到 Distributed Transaction Coordinator
    • 先点击 “停止”,等待几秒钟,再点击 “启动”
  2. 如果问题依旧,强烈建议重启服务器,这可以确保所有配置更改(尤其是防火墙和
分享:
扫描分享到社交APP
上一篇
下一篇