zoukankan      html  css  js  c++  java
  • SQL Server 2000事务复制问题

    2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来。可能都是些很白很二的问题,但人总是由最初的无知不断成长●-●


    SQL Server 2000事务复制问题
    服务器A(发布)
    服务器B(分发+订阅)
    1、创建发布时对表identity属性问题
    因为该发布不允许使用可更新的订阅,当 IDENTITY 列被传输到订阅服务器时,不会传输 IDENTITY 属性。(例如,在发布服务器上定义为 INT IDENTITY 的列在订阅服务器上将定义为 INT。)
    如果想将 IDENTITY 属性传输到订阅表,则必须进行如下操作:
    >>使用 IDENTITY 属性和 NOT FOR REPLICATION 选项手工创建订阅表。您可以通过让 SQL Server 在应用快照之前执行自定义脚本来执行该操作。若要指定自定义脚本,请先创建发布,再创建脚本,然后在发布属性的“快照”选项卡上输入该脚本的名称。
    >>设置名称冲突项目属性,以便 SQL Server 在订阅服务器上应用快照时不会除去现有的表
    对于这种该怎么操作,是按照提示还是忽略?
    2、对于比较大的数据库,如果我先备份发布数据库,然后在订阅服务器上还原,之后按正常步骤发布订阅,利用sp_scriptpublicationcustomprocs生成创建INSERT、UPDATE和DELETE存储过程的脚本;订阅时,选择不初始化架构和数据,同样对于自增字段是否有影响,该如何调整?
    3、快照代理调度问题,对于已生成过的快照是不是可以把它的调度给停了?


    问题解答1:根据业务需求,如果需将IDENTITY 属性传输到订阅表,则依据提示信息操作,同时因为identity字段是不能更新的,事务复制产生的update存储过程需要手动调整。
    问题解答2:SQL Server 通过备份文件初始化复制:http://www.cnblogs.com/gaizai/p/3309567.html
    上面的链接仅限2005及以上版本, 想在2000上面用备份文件“初始化”
    ----测试步骤---
    先配置好分发和发布服务器 ->创建发布(表A)-> 备份发布数据库 ->订阅服务器上还原
    ->手动生成复制所需的存储过程(sp_MSdel、sp_MSins、sp_MSupd),并到订阅数据库上执行
    ->UPDATE a SET ..WHERE id=1-> 在 MSrepl_commands、MSrepl_transactions 中能看到对应的记录
    ->创建强制订阅->UPDATE a SET .. WHERE id=2
    比对发布、订阅上表A 的记录,订阅上id=2有更新,id=1的却没有变化
    按理来说,我是创建好发布后备份的, 日志代理程序一直在运行,修改的事务也传到分发数据库上, 为什么最后没能应用的订阅上面?
    ----解答分析---
    一个事务复制的bug:http://www.cnblogs.com/stswordman/p/3258897.html
    --Log reader会读取发布项目的日志信息,将其写入到 Distribution数据库的msrepl_transactions 和msrepl_commands中;Msrepl_transactions 中的每一条记录都有一个唯一标识 xact_seqno,xact_seqno 对应日志中的 LSN。
    --Distribution agent包含两个进程,reader和writer 。Reader负责从分发数据库中读取数据,Writer负责将reader读取的数据写入到订阅数据库.
    --reader是通过sp_MSget_repl_commands 来读取Distribution数据库中(读取 Msrepl_transactions表和Msrepl_Commands 表)的数据
    大致逻辑是:Reader读取分发数据库中LSN大于@last_xact_seqno 的数据。Writer将读取到的数据写入订阅,并更新相应的LSN(subscription数据库的MSreplication_subscriptions表的transaction_timestamp列和Distribution数据库的msDistribution_history 表的xact_seqno列)。然后Reader 会继续用新的LSN来读取后续的数据,再传递给Writer,如此往复。

    1 select * from distribution2000..MSrepl_transactions
    2 select * from distribution2000..MSrepl_commands
    3 select * from distribution2000..MsDistribution_history
    4 select * from subscriptiondb..MSreplication_subscriptions --订阅创建后才能查询

    --创建订阅前对发布数据库执行更新操作,对应 MSrepl_transactions、MSrepl_commands 返回记录

    --分发数据库执行下面命令返回具体操作

    1 exec sp_browsereplcmds '0x000000C60000025C0005', '0x000000C60000025C0005'
    2 exec sp_browsereplcmds '0x000000C60000025D0004', '0x000000C60000025D0004'


    --创建强制订阅,查询MsDistribution_history、MSreplication_subscriptions

    结果可以看出订阅上的LSN直接更新为MSrepl_transactions中最大的xact_seqno,这就是问题所在

    --发布数据库再次更新数据,下面命令返回具体操作

    1 exec sp_browsereplcmds '0x000000C70000002E0004', '0x000000C70000002E0004'


    --查询 MsDistribution_history、MSreplication_subscriptions

    --发布、订阅数据比对

    问题解答3:如果通过快照初始化,第一次运行代理便可,不必设定每周去运行代理。

    【作者】: 醒嘞
    【出处】: http://www.cnblogs.com/Uest/
    【声明】: 本文内容仅代表个人观点。如需转载请保留此段声明,且在文章页面明显位置给出原文链接!
  • 相关阅读:
    双色球随机一注
    if else的简写
    select
    预解析
    json
    数组方法
    arguments
    国密SM4算法
    AES算法
    Feistel算法结构与DES加密算法
  • 原文地址:https://www.cnblogs.com/Uest/p/3476992.html
Copyright © 2011-2022 走看看