(4.39)sql server如何配置分布式事务(MSDTC)

官网参考:https://docs.microsoft.com/en-us/biztalk/core/troubleshooting-problems-with-msdtc?redirectedfrom=MSDN

一、如何配置分布式事务的详细步骤

1. 双方启动MSDTC服务

  MSDTC服务提供分布式事务服务,如果要在数据库中使用 SQL Server分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。

2. 打开双方135端口

  MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放。

  在双方防火墙中增加MSDTC.exe例外

  可用命令行: netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable

 

3.避免环回loopback

  保证链接服务器中语句没有访问发起事务服务器的操作在发起事务的服务器执行链接服务器上的查询、视图或存储过程中含有访问发起事务服务器的操作,这样的操作叫做环回(loopback),是不被支持的,所以要保证在链接服务器中不存在此类操作。‘

 

4.在事务开始前加入set xact_abort ON

  在事务开始前加入set xact_abort ON 语句对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。

 

5. MSDTC设置

打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键。在MSDTC选项卡中,点击“安全配置”按钮。

在安全配置窗口中做如下设置:l 选中“网络DTC访问”l 在客户端管理中选中“允许远程客户端”“允许远程管理”l 在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”l 保证DTC登陆账户为:NT Authority\NetworkService

 

6.服务器属性中开启

  

 

 

 

[ 链接服务器和名称解析问题建立链接SQL Server服务器]

通常有两种情况:

  第一种情况,产品选”SQL Server”EXEC sp_addlinkedserver @server='linkServerName', @srvproduct = N'SQL Server' 这种情况,@server (linkServerName)就是要链接的sqlserver服务器名或者ip地址。

  第二种情况,访问接口选“Microsoft OLE DB Provider SQL Server”或“Sql Native Client”EXEC sp_addlinkedserver @server=' linkServerName ', @srvproduct='', @provider='SQLNCLI', @datasrc='sqlServerName' 这种情况,@datasrc(sqlServerName)就是要链接的实际sqlserver服务器名或者ip地址。

连接服务器具体使用参考:https://www.cnblogs.com/gered/p/9223569.html#_label1

 

【最佳实践参考】

Windows中MSDTC(分布式事务处理)系统配置方法

 

DTC帮助我们实现分布式数据库服务器之间集合事务处理,即远程异地事务处理功能;

例如:有多个SQL SERVER服务器,我们要让它互相执行更新操作,但又要保证事务的完整性,就可以开启DTC功能进行实现;

SQL SERVER分布式事务脚本举例

{
SET XACT_ABORT ON
BEGIN TRAN
INSERT INTO [192.168.88.61].ccerp_test.dbo.spkfk ( spid , spbh )
SELECT '远程','远程'
INSERT INTO spkfk ( spid , spbh )
SELECT '本地','本地'
COMMIT
}

 

DTC配置方法

  1. 检查系统开启了DTC服务;

打开【管理工具】->【服务】,检查Distributed Transaction Coordinator、Remote Procedure Call (RPC)两个组件是否已启动;如果没有启动就将它们启动;

如图1:(一般正常启动了Distributed Transaction Coordinator组件,Remote Procedure Call (RPC)也会自动启动)

  

 

          (图1)

  1. 设置DTC服务;

打开【管理工具】->【组件服务】,找到【分布式事务处理协调器】,点属性对它进行设置;

2003、2008 SERVER设置它时,操作位置界面会若有区别;

但其需要设置的内容:

(1)、【默认协调器】:使用本地协调器;

  

 

 

(2)、设置内容:如图2:

  

 

 

          (图2)

  1. 设置参加DTC的各机防火墙;

打开【控制面板】->【防火墙】,添加例外的应用程序:将分布式协调器MSDTC.exe添加到例外中;

C:\Windows\System32\MSDTC.exe

设置完后防火墙设置如图3:

 


 

  

 

 

(如图3)

 

  1. MSDTC配置完后的测试;(注:把防火墙关了进行测)

微软提供的:DTCPing工具

下载链接:https://www.microsoft.com/en-us/download/details.aspx?id=2868

绿色的,直接点击:Dtcping.exe进行运行;然后解压到指定目录即可

   

然后

  

 

我们发现必须要写那个名称 NetBIOS 名称(主机名)

点击【PING】,如果上面的英文反馈是RPC拼通无问题就Ok,反之报错就需要继续检查;

如图下图,点击【PING】,如果上面的英文反馈是RPC拼通无问题就Ok,反之报错就需要继续检查;

  

 

【dtcping报错】

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问题的文章。

 

【参考文档】 

https://blog.51cto.com/joetang/1681167

posted @ 2020-03-21 09:52  郭大侠1  阅读(3275)  评论(0编辑  收藏  举报