一、链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

尊重原著作:本文转载自http://sfwxw456.blog.163.com/blog/static/631359742009321112120248/

 问题现象

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

   链接服务器"xxxxxxx"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。

   消息 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服务(启动方式:允许net start msdtc命令)
   MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。MSDTC(分布式交易协调器),协调跨多个数据库、消息队列、文件系统等资源管理器的事务。该服务的进程名为Msdtc.exe,该进程调用系统Microsoft Personal Web Server和Microsoft SQL Server。该服务用于管理多个服务器 .

   位置:控制面板--管理工具--服务--Distributed Transaction Coordinator

   依存关系:Remote Procedure Call(RPC)和Security Accounts Manager

   建议:一般家用计算机涉及不到,除非你启用Message Queuing服务,可以停止。

   解决办法:

    1)在windows控制面版-->管理工具-->服务-->Distributed Transaction Coordinator-->属性-->启动

    2)在CMD下运行"net start msdtc"开启服务后正常。

   注:如果在第1步Distributed Transaction Coordinator 无法启动,则是因为丢失了日志文件,重新创建日志文件,再启动就行了。重新创建 MSDTC 日志,并重新启动服务的步骤如下:

    (1) 单击"开始",单击"运行",输入 cmd 后按"确定"。

    (2) 输入:msdtc -resetlog (注意运行此命令时,不要执行挂起的事务)

    (3) 最后输入:net start msdtc 回车,搞定!

    3)另外需要在“服务”里找到这三个服务,都启动就行了

      I、Distributed Transaction Coordinator

      II、Remote Procedure Call (RPC)

      III、Security Accounts Manager

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

   操作:

    1)向防火墙添加msdtc.exe(入站出站)

    点击添加程序->点击浏览

    找到system32文件夹下的msdtc.exe文件,点打开即可。

   2)添加135端口(入站出站)

    点击添加端口

    填入135点确定即可。

  3.SQL2005设置

   打开SQL2005企业管理器

   右击根节点,打开服务器属性窗口将“需要将分布式事务用于服务器到服务器”的项勾上即可。

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

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

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

   在安全配置窗口中做如下设置:

  • 选中“网络DTC访问”。
  • 在客户端管理中选中“允许远程客户端”“允许远程管理”。
  • 在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”。
  • 保证DTC登陆账户为:NT Authority\NetworkService

  7. 链接服务器和名称解析问题
   建立链接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地址。

   Sql server数据库引擎是通过上面设置的服务器名或者ip地址访问链接服务器,DTC服务也是通过服务器名或者ip地址访问链接服务器,所以要保证数据库引擎和DTC都能通过服务器名或者ip地址访问到链接服务器。

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

   7.1 数据库引擎
    第一种情况的@server或者第二种情况的@datasrc设置为ip地址时,数据库引擎会根据ip地址访问链接服务器,这时不需要做名称解析。

    第一种情况的@server或者第二种情况的@datasrc设置为sql server服务器名时,需要做名称解析,就是把服务器名解析为ip地址。

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

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

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

      xxx.xxx.xxx.xxx 服务器名

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

   7.2 DTC
    不管哪一种情况,只要@server设置的是服务器名而不是ip地址,就需要进行名称解析,办法同上面第二种办法,在hosts文件中增加解析记录,上面的第一种办法对DTC不起作用。

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

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

【**如果使用了事务BEGIN DISTRIBUTED TRANSACTION ```COMMIT TRAN,此点很重要,最好双方都配置。】

   分布式事务的参与服务器是需要相互访问的,发起查询的服务器要根据机器名或ip查找远程服务器的,同样远程服务器也要查找发起服务器,远程服务器通过发起服务器的机器名查找服务器,所以要保证远程服务器能够通过发起服务器的机器名访问到发起服务器。

   一般的,两个服务器在同一网段机器名能就行很好的解析,但是也不保证都能很好的解析,所以比较保险的做法是:

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

     xxx.xxx.xxx.xxx  发起服务器名

  其实在设置MSDTC安全那部分,允许远程客户端这个可以不勾选,但最重要的是下面那一步,在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”,在windows2003中默认的是选的第一项要求对双方进行验证,我遇到的情况,把这个改过来就不会再报错了。另外下面的那个登录用户只能用那个network service,用别的在sqlserver里就会说msdtc不可用。

二、select * into、drop、Truncate Table是不可以在链接中使用的(涉及到更权限)

三、SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问。

 问题现象

在Sql Server中远程查询的时候出现问题:

select * from openrowset( 'SQLOLEDB', 'DBSever\MSSQL2008'; 'sa'; '123321',SCJZData.dbo.[2014TestRemote])

结果提示:
    SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
 解决方法

 启用Ad Hoc Distributed Queries:
  exec sp_configure 'show advanced options',1
  reconfigure
  exec sp_configure 'Ad Hoc Distributed Queries',1
  reconfigure
 使用完成后,关闭Ad Hoc Distributed Queries:
  exec sp_configure 'Ad Hoc Distributed Queries',0
  reconfigure
  exec sp_configure 'show advanced options',0
  reconfigure

四、不支持对系统目录进行即席更新:配置选项 'show advanced options' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。

 运行SQL语句

use master
go
-- 启用 SQL Server 的 CLR 功能
exec sp_configure 'show advanced options',1;
go
RECONFIGURE
--RECONFIGURE WITH OVERRIDE

go
exec sp_configure 'clr enabled',1;
go
RECONFIGURE
--RECONFIGURE WITH OVERRIDE
go

if object_id('dbo.des_encrypt','FS') is not null
 drop function dbo.des_encrypt;
go

if object_id('dbo.des_decrypt','FS') is not null
 drop function dbo.des_decrypt;
go

-- 创建程序集
if exists (select * from sys.assemblies where name='DES')
 drop assembly DES;
go
create assembly DES authorization dbo
from 'C:\localccc.dll' -- dll 文件路径
with permission_set=safe;
go

create function dbo.des_encrypt (@text nvarchar(max), @key nvarchar(128))
returns nvarchar(max)
as external name DES.DES.DESEncrypt;
go

-- select dbo.des_encrypt(N'hello world', N'88888888');

create function dbo.des_decrypt (@text nvarchar(max))
returns nvarchar(max)
as external name DES.DES.DESDecrypt;
go

 问题现象

配置选项 'show advanced options' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。
消息 5808,级别 16,状态 1,第 1 行
不支持对系统目录进行即席更新。
配置选项 'clr enabled' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。
消息 5808,级别 16,状态 1,第 1 行
不支持对系统目录进行即席更新。

 解决办法

  把RECONFIGURE 改成 RECONFIGURE WITH OVERRIDE。

MSDTC问题集的更多相关文章

  1. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群

    需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...

  2. SQL Server 2012 AlwaysOn集群配置指南

    1. AlwaysOn介绍 AlwaysOn是SQL Server 2012提供的全新综合.灵活.高效经济的高可用性和灾难恢复解决方案.它整合了镜像和群集的功能,基于OS 故障转移群集(Windows ...

  3. sql server 集群配置

    Windows server2003 + sql server2005 集群配置安装 一:环境 软硬件环境 虚拟3台windows server 2003主机.当中一台做域控DC,另外两台作为节点wi ...

  4. windows server 2012 安装sql server集群

    第一步:准备工作 虚拟环境下模拟创建: 准备好3台虚拟机 操作系统,WindowsServer2012R2 操作系统安装完成后,需要注意如果虚拟机是克隆出来的,后面操作集群的时候需要计算机的sid不同 ...

  5. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  6. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  7. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  8. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  9. Ubuntu 14.04中Elasticsearch集群配置

    Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...

随机推荐

  1. jquery css3 手机菜单动画综合版

    html <header> <a id="go-back" href="javascript:window.location.back(-1)" ...

  2. 利用PHP/MYSQL实现的简易微型博客(转)

    数据库:ly_php_base 表:ly_micro_blog(仅仅有一个表)字段:id,title,date,content,hits 文件: 文件 描述 default.php 默认主页.显示博文 ...

  3. 如何禁用Visual Studio 2013的Browser Link功能

    VS2013新增的Browser Link功能虽然“强大”,但我并不需要. 但默认是开启的,会在页面中自动添加如下的代码,真是烦人! <!-- Visual Studio Browser Lin ...

  4. Eclipse error:Access restriction

    报错:Access restriction: The method decodeBuffer(String) from the type CharacterDecoder is not accessi ...

  5. ios 调用相机后 view 下沉问题

    我只加了一句代码 现在不报错了  因为这个问题是随机性的  我也不太明白这个地方是怎么回事   我只是这样子做了  问题不出来了 if ([[[UIDevice currentDevice] syst ...

  6. C语言实现界面(不通过MFC\避免遗忘)

    感觉MFC不属于程序员细究的东西,今实现基本界面避免日后遗忘. 源代码: #include<windows.h>#include<stdio.h>char str[] = {' ...

  7. (原)caffe中通过图像生成lmdb格式的数据

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5909121.html 参考网址: http://www.cnblogs.com/wangxiaocvp ...

  8. java中的IO流读取文件

    1 InputStream类和OutputStream类 InputStream.read()方法从文件中读取一个字节(0-255),然后将此字节转换成对应的整数返回.假设一个文件的编码为utf-8编 ...

  9. PHP获取客户端操作系统,浏览器,语言,IP,IP归属地等

    <?php class Client { ////获得访客浏览器类型 function Get_Browser(){ if(!empty($_SERVER['HTTP_USER_AGENT']) ...

  10. 一级域名301重定向到www二级域名

    301重定向有利于百度的搜索 例如一个域名 www.test.com如果不做设置会产生4个网址, (1)test.com(2)www.test.com(3)test.com/default.html( ...