MSDTC服务出错

Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network

access in the security configuration for MSDTC using the Component Services Administrative tool.
出现以上错误
修改下面路径的hosts文件
添加数据库服务器的ip地址与服务器名称的映射
(数据库服务器IP地址与服务器名字)
(192.168.2.10    it-china)

C:\WINDOWS\system32\drivers\etc\hosts

# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost
192.168.2.10    it-china

下列任一条件没有满足就会出现该错误:

1. 必须启动MSDTC服务。(sqlserver的服务)

    2. 所涉及的Server之间如果存在网关、防火墙,需要开启TCP 135端口和RPC动态分配的端口号。    分布式事务需要使用这个端口通讯。

    3. 如果Server之间跨网段,则Server之间需要能互相PING到机器名(而不是IP地址)。

    如果相互PING机器名有问题,修改system32/driver/etc目录下的hosts文件

4 察看dcomcnfg中察看msdtc的安全配置选项,保证双方都可以交互

如果装了windows2003 SP1 或者xp sp2 请看 Windows Server 2003 Service Pack 1 和 Windows XP Service Pack 2 的分布式事务处理协调器服务中的新功能

5 如果windows2003(XP)开启了update服务,则检查注册表[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSDTC]的键值TurnOffRpcSecurity是否为1,如果为0修改为1

 

6 IP地址解析问题

  另外一种原因就是中间层、客户端不能按照数据库服务器的IP地址解析机器名。

  解决方法是在中间层、客户端、数据库双方的hosts文件中分别加入其他两个机器的IP地址和机器名,另外更加保险的做法是在各自的TCP/IP协议的Wins中加入其他两个机器的IP地址。

 7  设置问题

  对于Windows2003+SP1,需要设置组件服务的属性中的“安全配置”的“事务管理器”通信卫“不要求进行验证”,系统默认值是“要求对方进行验证”。

 

http://expert.csdn.net/Expert/topic/2835/2835706.xml?temp=.1959955  

  回复人:   j9988(j9988)    

   

  一.A.不用事务,关用SELECT   语句.是否可以分布式查询?  

   

        B.LINKSERVER   在做分布式更新事务时不能对本机操作.(就是不能环回分布式事务)  

   

        C.DBCC   TRACEON   (3604,   7300)--用跟踪看更详细错误信息.  

       

        D.下载MS提供的DTCPing.exe   分装在两台机上,按README说明来运行它.看出错信息.  

  http://download.microsoft.com/download/complus/msdtc/1.7/nt45/en-us/DTCPing.exe  

   

  二.两台机的MSDTC是否都打开了.  

   

  三.MSDTC设置是否正确.  

  1.打开命令提示,运行"net   stop   msdtc",然后运行"net   start   msdtc"。  

  2.转至"组件服务管理工具"。  

  3.浏览至"启动管理工具"。  

  4.选择"组件服务"。  

    a.展开"组件服务"树,然后展开"我的电脑"。  

    b.右键单击"我的电脑",然后选择"属性"。  

    C.在   MSDTC   选项卡中,确保选中了下列选项:   网络   DTC   访问  

  网络管理  

  网络事务  

          XA   事务  

    e.另外,"DTC   登录帐户"一定要设置为"NT   AuthorityNetworkService"。  

  5.单击"确定"。这样将会提示您"MS   DTC   将会停止并重新启动。  

      所有的依赖服务将被停止。请按'是'继续"。单击"是"继续。  

  6.单击"确定"关闭"我的电脑"属性窗口。  

   

  四.  

  MSDTC依赖于RPC,RPC使用的端口是135,测试135端口是否打开.是否有防火墙?如果有先关了防火墙.  

  telnet   IP   135  

  如果是关闭的打开它.  

   

  五.  

  有的机由于各种原因),SQLOLEDB不能使用分布式事务,更改为"MSDASQL"   的ODBC方式联接.  

  使用RRAS而不是RAS.(控制面版--管理工具--远程服务管理器)  

  Check   whether   you   are   using   Remote   Access   Server   (RAS)   to   access   remote   servers.   If   so,   make   sure   that   you   have   implemented   Routing   RAS   (RRAS).   Linked   server   does   not   work   on   RAS   because   RAS   allows   only   one   way   communication.  

   

   

  七.检查你的两台服务器是否在同一个域中.  

  如果不在同一个域中,是否建立可信任联接.  

   

  八.如果是WIN2000,升级到SP4  

   

  九.升级MDAC到2.6以上,最好是2.8.  

   

  十.要安装SQL的最新补丁:   sp3a  

  '全部补丁的位置  

  http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766  

   

  '应该安装的补丁sql   2000   sp3  

  http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c-d11a66b03816/chs_sql2ksp3.exe   

 

 

Windows 2003 下分布式事务协调器(DTC)的配置 【转载】

2007年04月16日 星期一 16:25

 

分布式事务在Windows 2003的配置比较麻烦,原来我就碰到过怎么设置也启动不了的情况,近日在别人指导下弄好了,顺便写个配置步骤,希望对大家有用

1、 添加/删除程序中,选择添加Windows组件,选择应用程序服务器,选择启用分布式事务网络访问

2、 在DTC所涉及的所有服务器中,启用NETBIOS,确保所有服务器能相互ping通对方,具体为修改所有服务器中的C:WindowsSystem32Driversetchosts文件(具体可参考hosts文件的内部帮助)。[注意]必须修改所有的服务器中的hosts文件

3、 禁用SQL Server 的DTC RPC安全,具体为在HKEY_LOCAL_MACHINESoftwareMicrosoftMSDTC下新建一个DWord键,名称为TurnOffRpcSecurity,设置其值为1

4、 重启MSDTC

5、 关闭网络防火墙(或者开放相应的端口)

-------------------------------------------------------------------------------------------------------

主要是两个原因:
1.MSDTC - 安全配置,勾选:网络DTC访问,允许入站,允许出站,并且不要求进行验证。
注意:是不要求进行验证

2.两台服务器并不在同一个域中时,要让他们相互信任,需要配置hosts文件。


也可以参考我的帖子:
http://blog.csdn.net/hb_gx/archive/2007/10/15/1826436.aspx

 

-------------------------------------------------------------------------------------------------------

 

适用环境

操作系统:windows 2003

数据库:sql server 2000/sql server 2005

使用链接服务器进行远程数据库访问的情况

一、  问题现象

在执行分布式事务时,在sql server 2005下收到如下错误:

消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行

无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启

动分布式事务。

在sql server 2000下收到如下错误:

该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。

[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]

OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB'

ITransactionJoin::JoinTransaction returned 0x8004d00a]。

二、  解决方案

1.        双方启动MSDTC服务

MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双

方服务器启动MSDTC(Distributed Transaction Coordinator)服务。

2.        打开双方135端口

MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证

RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。  

  使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(

比如Advanced Port Scanner)扫描端口以判断端口是否开放。

3.        保证链接服务器中语句没有访问发起事务服务器的操作

在发起事务的服务器执行链接服务器上的查询、视图或存储过程中含有访问发起事务

服务器的操作,这样的操作叫做环回(loopback),是不被支持的,所以要保证在链

接服务器中不存在此类操作。

4.        在事务开始前加入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服务器,通常有两种情况:

l         第一种情况,产品选”sql server”

EXEC sp_addlinkedserver

   @server='linkServerName',

   @srvproduct = N'SQL Server'

这种情况,@server (linkServerName)就是要链接的sqlserver服务器名或者ip地址

l         第二种情况,访问接口选“Microsoft OLE DB Provider Sql Server”或

“Sql Native Client”

EXEC sp_addlinkedserver  

   @server=' linkServerName ',

   @srvproduct='',

   @provider='SQLNCLI',

   @datasrc='sqlServerName'

这种情况,@datasrc(sqlServerName)就是要链接的实际sqlserver服务器名或者ip

地址。

Sql server数据库引擎是通过上面设置的服务器名或者ip地址访问链接服务器,DTC服

务也是通过服务器名或者ip地址访问链接服务器,所以要保证数据库引擎和DTC都能通

过服务器名或者ip地址访问到链接服务器。

数据库引擎和DTC解析服务器的方式不太一样,下面分别叙述

6.1       数据库引擎

第一种情况的@server或者第二种情况的@datasrc设置为ip地址时,数据库引擎会根据

ip地址访问链接服务器,这时不需要做名称解析。

第一种情况的@server或者第二种情况的@datasrc设置为sql server服务器名时,需要

做名称解析,就是把服务器名解析为ip地址。

有两个办法解析服务器名:

一是在sql server客户端配置中设置一个别名,将上面的服务器名对应到链接服务器

的ip地址。

二是在“C:\WINDOWS\system32\drivers\etc\hosts”文件中增加一条记录:

xxx.xxx.xxx.xxx   服务器名

作用同样是把服务器名对应到链接服务器的ip地址。

6.2       DTC

不管哪一种情况,只要@server设置的是服务器名而不是ip地址,就需要进行名称解析

,办法同上面第二种办法,在hosts文件中增加解析记录,上面的第一种办法对DTC不

起作用。

如果@server设置的是ip地址,同样不需要做域名解析工作。

7.       远程服务器上的名称解析

分布式事务的参与服务器是需要相互访问的,发起查询的服务器要根据机器名或ip查

找远程服务器的,同样远程服务器也要查找发起服务器,远程服务器通过发起服务器

的机器名查找服务器,所以要保证远程服务器能够通过发起服务器的机器名访问到发

起服务器。

一般的,两个服务器在同一网段机器名能就行很好的解析,但是也不保证都能很好的

解析,所以比较保险的做法是:

在远程服务器的在“C:\WINDOWS\system32\drivers\etc\hosts”文件中增加一条记录

----------------------------------------------------------------------------------------------------------------------------

SQL Server连接中的四个最常见错误:
一."SQL Server 不存在或访问被拒绝"
这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.
一般说来,有以下几种可能性:
1,SQL Server名称或IP地址拼写有误
2,服务器端网络配置有误
3,客户端网络配置有误
要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因.
============= 首先,检查网络物理连接 =============
ping <服务器IP地址/服务器名称>

如果 ping <服务器IP地址> 不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等.
还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server.防火墙软件可能会屏蔽对 ping,telnet 等的响应
因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口.
如果ping <服务器IP地址> 成功而,ping <服务器名称> 失败
则说明名字解析有问题,这时候要检查 DNS 服务是否正常.
有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,
具体的方法是:
1.使用记事本打开HOSTS文件(一般情况下位于C:\WINNT\system32\drivers\etc).
添加一条IP地址与服务器名称的对应记录,如:
172.168.10.24 myserver
2.或在 SQL Server 的客户端网络实用工具里面进行配置,后面会有详细说明.

============= 其次,使用 telnet 命令检查SQL Server服务器工作状态 =============
telnet <服务器IP地址> 1433

如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明 SQL Server 服务器工作正常,并且正在监听1433端口的 TCP/IP 连接
如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,
也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听.

=============接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道.是否启用了 TCP/IP 协议等等 =============
可以利用 SQL Server 自带的服务器网络使用工具来进行检查.

点击:程序 -- Microsoft SQL Server -- 服务器网络使用工具
打开该工具后,在"常规"中可以看到服务器启用了哪些协议.
一般而言,我们启用命名管道以及 TCP/IP 协议.
点中 TCP/IP 协议,选择"属性",我们可以来检查 SQK Server 服务默认端口的设置
一般而言,我们使用 SQL Server 默认的1433端口.如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接.
============= 接下来我们要到客户端检查客户端的网络配置 =============
我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,
所不同的是这次是在客户端来运行这个工具.
点击:程序 -- Microsoft SQL Server -- 客户端网络使用工具
打开该工具后,在"常规"项中,可以看到客户端启用了哪些协议.
一般而言,我们同样需要启用命名管道以及 TCP/IP 协议.
点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致.
单击"别名"选项卡,还可以为服务器配置别名.服务器的别名是用来连接的名称,
连接参数中的服务器是真正的服务器名称,两者可以相同或不同.别名的设置与使用HOSTS文件有相似之处.
通过以上几个方面的检查,基本上可以排除第一种错误.
-----------------------------------------------------------------------------
二."无法连接到服务器,用户xxx登陆失败"
该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,
因此用户无法使用SQL Server的登录帐户(如 sa )进行连接.解决方法如下所示:
1.在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server
操作步骤:
在企业管理器中
--右键你的服务器实例(就是那个有绿色图标的)
--编辑SQL Server注册属性
--选择"使用windows身份验证"
--选择"使用SQL Server身份验证"
--登录名输入:sa,密码输入sa的密码
--确定
2.设置允许SQL Server身份登录
操作步骤:
在企业管理器中
--展开"SQL Server组",鼠标右键点击SQL Server服务器的名称
--选择"属性"
--再选择"安全性"选项卡
--在"身份验证"下,选择"SQL Server和 Windows ".
--确定,并重新启动SQL Server服务.
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,
那就通过修改注册表来解决此问题:
1.点击"开始"-"运行",输入regedit,回车进入注册表编辑器
2.依次展开注册表项,浏览到以下注册表键:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
3.在屏幕右方找到名称"LoginMode",双击编辑双字节值
4.将原值从1改为2,点击"确定"
5.关闭注册表编辑器
6.重新启动SQL Server服务.

此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,
但是仍然无法使用Windows身份验证模式来连接SQL Server.
这是因为在 SQL Server 中有两个缺省的登录帐户:
BUILTIN\Administrators
<机器名>\Administrator 被删除.
要恢复这两个帐户,可以使用以下的方法:
1.打开企业管理器,展开服务器组,然后展开服务器
2.展开"安全性",右击"登录",然后单击"新建登录"
3.在"名称"框中,输入 BUILTIN\Administrators
4.在"服务器角色"选项卡中,选择"System Administrators"
5.点击"确定"退出
6.使用同样方法添加 <机器名>\Administrator 登录.
说明:
以下注册表键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode
的值决定了SQL Server将采取何种身份验证模式.
1.表示使用"Windows 身份验证"模式
2.表示使用混合模式(Windows 身份验证和 SQL Server 身份验证).
-----------------------------------------------------------------------------
三.提示连接超时

如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,
不过是由于连接的时间大于允许的时间而导致出错.
这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,
并且是慢速连接时,有可能会导致以上的超时错误.有些情况下,由于局域网的网络问题,也会导致这样的错误.

要解决这样的错误,可以修改客户端的连接超时设置.
默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,
而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因).

具体步骤为:
企业管理器中的设置:
1.在企业管理器中,选择菜单上的"工具",再选择"选项"
2.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡
3.在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20.

查询分析器中的设置:
工具 -- 选项 -- 连接 -- 将登录超时设置为一个较大的数字
---------------------------------------------------------------------------------

四.大部分机都用Tcp/ip才能成功,有次我发现用Named Pipes才可以?
这是因为在WINDOWS 2000以后的操作系统中,MS为解决SQL SERVER的安全问题将TCP/IP配置
为SQLSERVER的默认连接协议,你可以在CLIENT NETWORK UTILITY中看到TCP/IP和NAME PIPE
的顺序。

你也可以在:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]
"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00
看到默认的协议。

2.怎么在程序中更改Named Pipes , Tcp/ip ,其sql语句怎么写?
你可以在上面提到的注册表的位置修改:
CLIENT端:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]
"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00

SERVER端:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib]
"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00

已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组可以由本文解决。

http://hi.baidu.com/easonshen/blog/item/e5e80916faa55807c83d6d7d.html

还可参考 百度百科 MSDTC  http://baike.baidu.com/view/723468.htm#sub723468

posted @ 2011-04-26 09:39  瞭望者  阅读(1749)  评论(1编辑  收藏  举报