使用DTCPing工具解决MSDTC问题(新事务无法在指定的事务协调器中登记)

Microsoft的分布式服务支持团队每天都会帮助客户排除一些最常见的分布式事务错误,这些错误是MSRPC(Microsoft远程过程调用)通信在网络中因某些安全\防火墙设置而失败的直接结果。在应用程序层(如SQL)上,这些是将被冒泡的常见错误消息。

  • 服务器:消息7391,级别16,状态1,行2无法执行操作,因为OLE DB提供程序“SQLOLEDB”无法启动分布式事务。OLE / DB提供程序返回消息:新事务无法在指定的事务协调器中登记。
  • 新事务无法在指定的事务协调器中登记(0x8004d00a)
  • 事务已被隐式或显式提交或中止(0x8004d00e)

如果在使用应用程序中的分布式事务时遇到上述错误消息之一,请随时使用DTCPING工具找出问题所在。本博客介绍了如何使用DTCPing工具缩小问题的根源以及如何解决问题。

分布式事务(特别是OleTx事务)使用MSRPC协议与另一台机器上的MSDTC进行通信。为确保两台计算机能够使用MSRPC协议相互通信,您可以在两台计算机上运行DTCPING工具,以测试正常的RPC通信是否正常工作。在讨论此工具引发的各种错误之前,了解正确运行工具的正确方法非常重要,这样我们才能从工具中获得正确的输出

  1. 只要有多个服务器参与事务,分布式事务就会显示在图像中。如果分布式事务中只涉及一个服务器,并且在运行分布式事务时仍然遇到一些错误,那么这不是正确的文章。确定参与分布式事务的正确服务器后,在两台计算机上同时启动DTCPING.EXE工具。在放置正确的服务器名称并单击PING按钮之前,DTCPING.EXE应在两台计算机上同时运行。
  2. 在DTCPING工具的远程服务器名称部分中,您应该只放置您尝试运行分布式事务的服务器的NETBIOS名称。在指定服务器的IP地址或服务器的FQDN之后执行的任何测试都是无效测试。您必须提供您尝试运行分布式事务的服务器的NETBIOS名称,因为MSDTC使用MSRPC作为基础机制,MSRPC仅适用于NETBIOS名称解析。
  3. 在群集中 - 在群集计算机上,您应始终放置MSDTC资源所依赖的NETWORK RESOURCE的名称在“远程服务器名称”字段中。要找到要在DTCPing中使用的正确NETWORK NAME,请打开群集管理器并转到存在MSDTC资源的组。该组应具有DTC资源所依赖的一个网络名称资源。要查找网络名称,只需转到网络名称资源的属性,然后转到“参数”选项卡。您在其中看到的名称是此MSDTC资源的网络名称。让我们通过一个例子来理解这一点: - 假设您有一个2节点集群,其中两个节点的NETBIOS名称为DBSERVER01和DBSERVER02,并且您尝试从第三个服务器APPSERVER运行分布式事务。然后以正确的方式运行DTCPing,您应该在APPSERVER和集群的活动节点上启动DTCPING.EXE。(通过主动节点,我指的是DTC资源在线的节点。然后从群集管理器转到分布式事务处理协调器资源所在的NETWORK NAME资源的属性,并转到PARAMETERS选项卡。请注意此网络名称。确定正确的网络名称后,在群集的活动节点和APPSERVER上以及APPSERVER上的DTCPing窗口内启动DTCPING,在(远程服务器名称)字段中输入群集MSDTC资源的网络名称,然后点击PING。
  4. 在测试时,应始终只在服务器上运行一个DTCPING.EXE实例,对于后续测试,应始终关闭DTCPING工具并再次打开它。

确保您已正确阅读上述要点后,您应该只运行DTCPING工具并在远程服务器名称中输入正确的服务器名称,然后单击PING。如果一切正常,您应该看到该工具返回以下消息。(此处DTCPing从具有NETBIOS名称SOURCE的机器运行到具有NETBIOS名称DESTINATION的机器)

++++++++++++++++++++++++++++++++++++++++++++++
DTCping 1.9 Report for SOURCE
++++++++++++++++++++++++++++++++++++++++++++++
RPC server is ready
++++++++++++Validating Remote Computer Name++++++++++++
11-21, 04:31:01.455-->Start DTC connection test
Name Resolution:
DESTINATION-->65.52.22.254-->DESTINATION.contoso.com
11-21, 04:31:01.470-->Start RPC test (SOURCE-->DESTINATION)
RPC test is successful
Partner's CID:084B708C-F0C5-4E65-95F2-8E2DEF73FFF3
++++++++++++RPC test completed+++++++++++++++
++++++++++++Start DTC Binding Test +++++++++++++
Trying Bind to DESTINATION
11-21, 04:31:01.830-->SOURCE Initiating DTC Binding Test....
Test Guid:B5544E05-D64B-40AC-B283-71947914DED3
Received reverse bind call from DESTINATION
Network Name: SOURCE
Source  Port: 1116
Hosting Machine:SOURCE
Binding success: SOURCE-->DESTINATION
++++++++++++DTC Binding Test END+++++++++++++

如果看到上述消息,请转到第二个服务器并将源服务器的名称放在“远程服务器名称”字段中,然后单击PING并确保看到与上面相同的结果。如果两个服务器在运行DTCPING工具后返回成功但分布式事务仍然无法正常工作,那么您应该看到本文的第二部分讨论了当DTCPING在两台机器之间正常工作时如何解决分布式事务问题。

如果该工具的结果不成功,请确定您获得的错误,并按照以下部分中提到的步骤来修复错误消息。

错误消息1 - gethostbyname失败

DTCPing log file: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES8618
RPC server is ready
Please Start Partner DTCPing before pinging
++++++++++++Validating Remote Computer Name++++++++++++
Please refer to following log file for details: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES861840.log
Error(0xB7) at nameping.cpp @43
-->gethostbyname failure -->183(Cannot create a file when that file already exists.)
Can not resolve abc Invalid remote host name:abc

我认为这个错误不仅仅是自我解释。如果您在远程服务器名称中添加的主机名不是有效的主机名,您将获得此名称。通过运行ping命令,确保您在DTCPING工具中指定的远程服务器名称解析为有效的IP地址。如果该主机名未解析为任何IP地址,则可以尝试在hosts文件中添加主机名,然后再次尝试运行该工具。

错误消息2 - RPC服务器不可用

DTCping log file: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES8618
RPC server is ready Please Start Partner DTCping before pinging
++++++++++++Validating Remote Computer Name++++++++++++
Please refer to following log file for details: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES861896.log
Invoking RPC method on turtle86
Problem:fail to invoke remote RPC method Error(0x6BA) at dtcping.cpp @303
-->RPC pinging exception -->1722(The RPC server is unavailable.)
RPC test failed

这表示防火墙上的端口135或DCOM端口范围中的一个端口被阻止。为了进一步确认这一点,我们说你从SERVER01运行DTCPING到SERVER02,你得到了这个错误。现在打开SERVER01上的命令提示符并键入telnet SERVER02 135(在运行此测试之前,只需确保在服务器上启动Telnet服务。在Windows 2008 Server上,默认情况下不安装telnet服务,您必须安装它通过在服务器上配置角色服务。如果您看到一个光标闪烁的空白窗口,这足以告诉端口未被阻止,但如果telnet命令失败并出现错误,您可以轻松推断端口135被阻止,您应该检查您的网络团队使端口135在防火墙上双向打开。如果telnet到端口135工作正常,那么在SERVER02上执行NETSTAT -anob并找出DTCPING.EXE正在侦听的端口。然后返回SERVER01并执行telnet SERVER02 <PORT_NUMBER>。如果您收到此错误,则此测试必须失败。MSDTC使用MSRPC协议与远程计算机上的MSDTC通信。由于MSRPC协议正常工作,MSDTC可以自由使用1024-65535范围内的一个动态端口。如果MSDTC可以使用此范围内的任何一个端口,那么我应该如何配置我的防火墙?我是否应该领先并在防火墙上打开整个范围?那么什么是防火墙?答案是 - 你不要'请再次注意 - 此范围会影响所有使用MSRPC的程序,而不仅仅是MSDTC。您可以在注册表或DCOMCNFG UI中配置此范围。要指定此范围,请向下滚动到“限制DCOM端口范围”部分,该部分讨论如何限制DCOM使用特定端口范围。

错误消息3 - 远程过程调用失败

RPC server is ready
++++++++++++Validating Remote Computer Name++++++++++++
Problem:fail to invoke remote RPC method
Error(0x6BE) at dtcping.cpp @303
-->RPC pinging exception -->1726(The remote procedure call failed.)
RPC test failed

此错误是防火墙断开两台计算机之间TCP连接的结果。您必须与防火墙管理员联系,以帮助您找出防火墙关闭两台计算机之间TCP连接的原因。要解决此错误,您可以在两台计算机上安装网络监视器工具并重新运行测试,您应该看到尝试关闭连接的网络设备发送的TCP RESET数据包。

错误信息4 - 终结点映射器不再有端点

DTCping log file: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES8626
RPC server is ready Please Start Partner DTCping before pinging
++++++++++++Validating Remote Computer Name++++++++++++
Please refer to following log file for details: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES86268.log
Invoking RPC method on turtle86
Problem:fail to invoke remote RPC method Error(0x6D9) at dtcping.cpp @303
-->RPC pinging exception -->1753(There are no more endpoints available from the endpoint mapper.)
RPC test failed

此错误使得RPC似乎耗尽了DCOM端口,但您不应立即将此错误推断为端口耗尽。如果您能够在两台计算机上运行DTCPING.EXE并在启动EXE期间,该工具不会抱怨端口出错,那么此错误只是防火墙阻塞端口和故障排除的结果错误应该与故障排除“RPC服务器不可用”错误完全相同,如上所述。我为什么这么说?假设我们的DCOM端口耗尽(如果你指定了一个端口范围并且范围太小,小于30,则通常会发生这种情况),那么你应该在启动DTCPING.EXE时看到错误。因为那是DTCPing的时候。exe将联系End Point Mapper服务(RpcSS)并要求动态端口。如果DTCPing.exe启动就好了,那就意味着它获得了分配给它的正确端口,因此不存在Endpoint Mapper耗尽DCOM端口的问题。

错误消息5 - 错误消息5 - 访问被拒绝

Invoking RPC method on TURTLE86
Problem:fail to invoke remote RPC method
Error(0x5) at dtcping.cpp @303
-->RPC pinging exception
-->5(Access is denied.)

仅当目标计算机是Windows XP计算机或Windows VISTA计算机时才会出现此错误。这是RPC层中的附加安全性,它在客户端操作系统上配置。有关此安全方面的更多详细信息,请参见Technet上的文章“RPC Interface Restriction”

要解决此错误,只需按照以下步骤配置注册表项并重新启动计算机。

  1. 单击“开始”,单击“运行”,键入Regedit,然后单击“确定”。
  2. 找到并单击以下注册表项:  HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows NT
  3. 在“编辑”菜单上,指向“新建”,然后单击“密钥”。
  4. 注意如果RPC注册表项已存在,请转到步骤5。
  5. 键入RPC,然后按ENTER键。单击RPC。
  6. 在“编辑”菜单上,指向“新建”,然后单击“DWORD值”。
  7. 键入RestrictRemoteClients,然后按ENTER键。
  8. 单击RestrictRemoteClients。
  9. 在“编辑”菜单上,单击“修改”。
  10. 在“数值数据”框中,键入0,然后单击“确定”。
  11. 注意要启用RestrictRemoteClients设置,请键入1。
  12. 关闭注册表编辑器并重新启动计算机

错误消息6 - 没有足够的资源可用于完成此操作

DTCping log file: Z:\Tools\DTC_PING\TURTLE865072.log
Error(0x6B9) at rpcUtil.cpp @133
-->I_RpcServerAllocateIpPort
-->1721(Not enough resources are available to complete this operation.)
Error(0x6B9) at rpcUtil.cpp @54
-->1721(Not enough resources are available to complete this operation.)

启动DTCPING窗口后,您将立即收到此错误消息。此错误消息表示RPC正在耗尽计算机上的端口,因为您定义的DCOM端口范围太小或者有很多其他RPC应用程序正在使用DCOM端口(通常DCOM或RPC程序只使用一个DCOM端口,但应用程序可以通过直接调用RPC API来获取多个DCOM端口。要修复此错误消息,请按照以下步骤增加端口范围。

限制DCOM港口范围

1.转到开始 - >运行。输入DCOMCNFG。
2.转到“组件服务”下“计算机”文件夹下的“我的电脑”节点的属性。
3.在“我的电脑属性”下,在“默认协议”选项卡下查看。
4.在那里确保选择了面向连接的TCP / IP,然后单击属性。
你会看到这样一个窗口

EmptyPortRange

如果您没有看到上面的范围,并且窗口看起来与上面的那个完全相同,那么这意味着计算机上未配置DCOM端口范围。
您可以在上面的窗口中单击“添加”并键入范围(假设为5000-5100)并说出“确定”。确保它看起来像这样。(应为Internet范围选择单选按钮)

PortRange5000

您必须在两台计算机上配置此范围,然后必须重新启动两个服务器才能使此范围生效。完成后,您必须双向打开防火墙上的相同范围

假设您已经打开了足够的端口但仍然收到此错误消息。在这种情况下,您应该在返回此错误消息的计算机上运行NETSTAT -anob并尝试找出正在使用所有端口的程序。您应该查找在RPC端口范围中定义的端口,并查找正在侦听该端口范围的所有EXE。

我们希望本文能够为您提供有关如何使用DTCPing工具解决MSDTC问题的充分信息,我们希望您能够进一步解决和诊断与MSDTC相关的问题。如果您仍然需要我们的帮助来解决上述博客中提到的任何DTCPING错误,请随时从机器(运行DTCPING)收集DTCPING日志文件并打开Microsoft支持事件。一旦我们有正确的数据可供查看,我们(MSDTC支持团队)将非常乐意为您提供及时解决问题的方法。

如果您有兴趣深入了解DCOM和防火墙概念,请随时浏览以下有关DCOM问题的文章。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更这些源码资源,以适应各平台技术的最发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值