大致流程:
1、分发服务器的快照代理作业,将发布服务器的发布库生成快照(快照生成时,会对发布库加锁,是不是?),并将快照保存在分发服务器所指定的磁盘位置
2、分发服务器的日志读取器代理作业,将发布服务器的发布库的事务日志读取出来,保存在分发服务器上
3、订阅服务器用第1步的快照,去初始化自己
4、分发服务器的分发作业,将第2步所获得的事务日志,分发给每一个订阅服务器
流程理解正确吗?存在疑问:
1、是不是分发库记录了每个快照的日志点啊???否则你用任何一个快照去初始化订阅库,分发怎么知道从哪个事务日志开始分发给从库啊???
2、快照生成时,会对发布库加锁,是不是?
3、用主库的快照,去初始化从库的时候。推送模式,快照保存在分发服务器本地磁盘,没事的。请求模式,必须放在从库能访问的位置(ftp,或共享目录,或copy到从库服务器本地磁盘)。是不是与分发代理(分发代理程序在分发服务器上运行,即为推模式,在订阅服务器运行,即为拉模式)位置有关?

解决方案 »

  1.   

    #1.事务性复制,你描述的基本正确,以推送订阅为例:
    1.初始化。快照生成初始阶段使用锁,同时记录日志起始点。保存快照文件。
    2.日志读取器监控数据变化。
    3.分发代理,应用1中的快照文件到订阅服务器;在订阅服务器上应该发布服务器的增量更改。
    #2.疑问解答:
    #1.是的,记录了日志点。记录在这个字段:distribution.dbo.MSdistribution_history.timestamp
    #2.会在快照初始化阶段加锁,同时记录日志起始点。(快照复制是整个生成快照阶段都加锁)
    #3.推送订阅:快照代理和分发代理都运行在分发服务器,所以快照文件夹保存在分发服务器上,两个代理访问一般没问题;请求订阅,快照代理运行在分发服务器,分发代理运行在订阅服务器,所以分发代理要想访问得对分发服务器上的快照文件夹有远程访问权限才行。
      

  2.   

     SELECT * FROM dbo.MSrepl_transactions  --xact_seqno,至于日志文件的LSN,应该没有存储,而是生成一系列的xact_seqno,来表明复制顺序
    SELECT * FROM dbo.MSrepl_commands  --command字段是具体命令的二进制代码,用16进制表示
    SELECT * FROM dbo.MSdistribution_history  --每个agent_id最大timestamp的记录的xact_seqno就是当前已经进行到的复制点
      

  3.   


    谢谢你,但我不明白xact是什么意思,能解答吗?
      

  4.   

    #1.所有的同步事务(快照初始化和日志读取器产生的同步事务),都会按事务边界存储在:MSrepl_transactions表中,且每一个同步事务都按顺序生成一个唯一的xact_seqno值;
    #2.每个同步事务所对应的同步命令(快照初始化和日志读取器产生的同步命令[其实就是带数据的INSERT,UPDATE,DELETE语句]),都会存储在MSrepl_commands表;
    #3.而MSdistribution_history表记录每个分发代理最后成功同步的那个xact_seqno。
    请参考复制相关的所有表:
    http://technet.microsoft.com/zh-cn/library/ms179855%28v=sql.90%29.aspx
      

  5.   

    谢谢,太感谢了!!!我还想问一下,
    发布时,所有表项目的属性,是什么意思啊?是不是指,复制到从库时,勾选的(外键约束、触发器...)都会自动复制过去?我将前10项都勾选了,但确定后,回头来看,又是原状(未勾选状态),反反复复试过很多次,msdn也没说这个地方有何作用?
      

  6.   


    我遇到一个新问题了。
    A(发布) -> B(分发+订阅),
    在没有删除复制关系之前,B重装后(旧的distribute库没有了),A上的发布都删除不了?提示:未将‘发布A’定义为‘B’的订阅服务器。
    无法更新分发数据库订阅表。无法更改订阅状态。我遇到了新问题,和这个类似http://bbs.csdn.net/topics/330160766 
    怎么办?
      

  7.   

    #5楼的功能只是为了批量设置某一类对象的复制属性。
    #6楼没有什么好办法。只能手动清除发布服务器上相关的复制系统表数据。楼主可创建一个复制法,用sql server profile工具抓一下相关存储过程,再看一下都涉及到哪些系统表,清除一下里面的数据。这些系统表,一般都存储在发布数据库的系统表下面,参考:
    TRUNCATE TABLE  dbo.syspublications  --发布
    TRUNCATE TABLE  dbo.sysarticles  --发布项目
    TRUNCATE TABLE  dbo.sysschemaarticles  --纯架构发布项目
    TRUNCATE TABLE  dbo.sysarticlecolumns   --发布列
    TRUNCATE TABLE  dbo.syssubscriptions  --订阅项目
    TRUNCATE TABLE  dbo.systranschemas  --项目架构更改
      

  8.   

    --command字段是具体命令的二进制代码,用16进制表示。这个内容明文怎么看呢?找了好多办法都没用
      

  9.   

    USE distribution
    GOSELECT TOP 100 
    CONVERT(nvarchar(1024), 
    CASE 
    WHEN type = 30 THEN SUBSTRING(command, 17, 1024)
    ELSE command 
    END)
    FROM MSrepl_commands