Compartilhar via


SQL Server复制系列2 - Transactional Replication 的immediate_sync属性

在默认情况下,immediate_sync是关闭的,这个属性可以在创建publication时指定,也可以在创建完毕后修改。 如果immediate_sync为true, snapshot 文件和replicated transaction将一直保留到data retention.然后才会被删除。这会导致distribution 数据库增长,复制性能下降。 所以推荐设置为false. 需要注意的时,如果一个数据库有多个publication,只要其中有一个publication的immediate_sync为true,将会导致这个数据库的所有publication的replicated transaction的保留期都延长至data retention.

您可以在distribution database里执行下面的语句进行检查:

select p.publication,p.publisher_db,ser.name as publisherServer from MSpublications p inner join sys.servers ser on p.publisher_id =ser.server_id where immediate_sync=1 and publication_type =0

语句会列出immediate_sync为true的publication以及数据库和服务器信息。下面是一个执行结果的截图。

之后您需要去发布数据库执行下面的语句将immediate_sync禁止

exec sp_changepublication @publication = 'publicationName' ,@property = 'allow_anonymous' , @value = false

exec sp_changepublication @publication = 'publicationName' , @property = 'immediate_sync' , @value = false

有时候一些元数据信息无法被正确修改,导致即使immediate_sync为false, replicated transaction 仍然会被保留下来。 所以需要在distribution database中进行额外的检查:

select *From MSdistribution_agents where subscriber_id<0

如果这个查询仍然返回结果,则说明metadata有问题了。需要手工进行删除(请在Microsoft support service的指导下执行下面的语句)

select * into MSdistribution_agents_bak From MSdistribution_agents where subscriber_id<0

select * into MSdistribution_history_bak From MSdistribution_history where agent_id in (select id From MSdistribution_agents where subscriber_id<0)

delete From MSdistribution_history where agent_id in (select id From MSdistribution_agents where subscriber_id<0)

delete From MSdistribution_agents where subscriber_id<0