• SqlServer2008 跨服务器同步数据


    最近工作中需要跨服务器同步数据,在数据库DB1中的表T1插入数据,同时触发T1的触发器(这里暂不讨论触发器的效率问题),向另一台服务器DB2中的相同的一张表T2插入数据,查看了一些资料说,

    需要打开DTC(分布式交易协调器)协调跨多个数据库、消息队列、文件系统等资源管理器的事务,

    于是按照网上说的,将自己的DTC打开启动,步骤如下:

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

    然后在本机SqlServer里新建一个触发器测试了一下,提示“该伙伴事务管理器已经禁止了它对远程/网络事务的支持”

    出现这个问题的原因是对方电脑没有配置好DTC,所以需要将另一台服务器也做如下配置:

    两台服务器电脑做如下配置(windows2003系统):

    2. 单击“添加/删除 Windows 组件”。 
    3. 选择“应用程序服务器”,然后单击“详细信息”。 
    4. 选择“启用网络 DTC 访问”,然后单击“确定”。 
    5. 单击“下一步”;单击“完成”。 
    6. 在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"。
    7. 右键“我的电脑”->“属性”,在MSDTC选项卡中,点击“安全配置”按钮。
    8. 在安全配置窗口中做如下设置:
    (1)选中“网络DTC访问”
    (2)在客户端管理中选中“允许远程客户端”“允许远程管理”
    (3)在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”
    (4)保证DTC登陆账户为:NT AuthorityNetworkService 
    (5)单击"确定"。这样将会提示您"MS DTC 将会停止并重新启动。 
       所有的依赖服务将被停止。请按'是'继续"。单击"是"继续。 

    我当时先拿同事的电脑做了下测试,同事的系统是Win7,按上面的步骤没有找到“应用程序服务器”,需要按下面的方法操作:

    Vista, Windows 7,Windows Server 2008 MSDTC配置  
    1. 打开“控制面板(Control Panel)―管理工具(Administrative Tools)―组件服务(Component 
    Service)”(或者开始-运行 “Dcomcnfg.exe”)  


    2. 打开“组件服务(Component Service)―计算机(Computers)”  


    3. 在“我的电脑(My Computer)”上点击右键,点击“属性(Properties)”

    4. 在Local DTC Properties对话框中,点击“安全(Security)”选项卡。      在安全配置选项卡中做如下设置:  

    选中“网络DTC访问(Network DTC Access)”   在客户端管理(Client and Administration)中选中“允许远程客户端(Allow remote Clients)”
    和“允许远程管理(Allow Remote Administration)”  
    在事务管理通讯(Transaction Manager Communication)中选“允许入站(Allow 
    Inbound)”“允许出站(Allow Outbound)”“不要求进行验证(No Authentication Required)”  
    保证DTC登陆账户为:NT AuthorityNetwork Service 

     

    再次测试出现提示:“其他会话正在使用事务的上下文”,这是因为对方服务器表中也有触发器,需要进行一下判断。

    ********************************当两台服务器不在一个网段的时候,还有可能出现一个问题*******************************

    如果两台服务器在一个网段的时候,按上面的设置,基本就可以搞定了,但是当两台服务器不在一个网段的时候,SQLServer还有可能报下面的错误:

    链接服务的OLE DB 访问接“SQLNCLI10”返回了消息“该事务管理已经禁止了它对远程事务的支持”

    然后我对要请求访问的服务器A做了以下操作,修改A服务器的host文件,增加B的IP地址和服务器名,然后问题就解决了。

    下面给出测试的例子:

    --创建测试表
    CREATE TABLE [dbo].[TB1](
        [id] [int] NULL,
        [age] [money] NULL
    ) ON [PRIMARY]
    
    GO
    
    --创建链接服务器 
    exec sp_addlinkedserver   'it38 ', ' ', 'SQLOLEDB ', '172.16.3.38' --对方服务器地址
    exec sp_addlinkedsrvlogin  'it38 ', 'false ',null, 'sa', 'sa' --对方服务器用户名密码
    --删除创建的链接服务器时使用
    --exec sp_dropserver  'it38 ', 'droplogins ' 
    --为表TB1创建触发器
    CREATE TRIGGER [dbo].[tr_qiao] on [dbo].[TB1]
    FOR INSERT
    AS
    BEGIN
      SET NOCOUNT ON
      SET XACT_ABORT ON 
     INSERT INTO it38.[数据库名].dbo.TB1(id,age) 
      SELECT id, age FROM inserted;
    END
    GO
    
    --***********************************************
    --查询对方数据库表数据
    SELECT * FROM it38.[数据库名].[dbo].[TB1]
    --插入一条数据测试 INSERT INTO TB1(id,age) values(5,55);
    微信公众号:还没开呢!
    欢迎关注收取阅读最新文章
    • 您随手点赞是我不断书写的动力,如有错误,欢迎指正
    • 出处:http://www.cnblogs.com/nowar/
    • 本文版权归作者和博客园共有,欢迎个人转载,必须保留此段声明;商业转载请联系授权,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    汽车发动机参数指标含义
    谷歌浏览器Google Chrome和Adobe Flash Plugins插件安装问题
    今天研究成功ASP动态管理数据表及字段
    漂亮的弹出对话框!
    Opera Dragonfly 提供下载了
    javascript客户端验证函数大全
    C# Regex类用法
    只能输入数字的TextBox
    c#,winform,treeview,选中节点,选中相应的全部子节点,取消节点,取消父节点,小技巧
    WinForm中如何判断关闭事件来源于用户点击右上角的“关闭”按钮
  • 原文地址:https://www.cnblogs.com/nowar/p/DTC.html
Copyright © 2020-2023  润新知