惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
IT之家
IT之家
V
V2EX
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
Martin Fowler
Martin Fowler
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
博客园 - 聂微东
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
The Cloudflare Blog
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
P
Palo Alto Networks Blog
T
Threatpost
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cloudbric
Cloudbric
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
T
The Blog of Author Tim Ferriss
L
Lohrmann on Cybersecurity
量子位
Security Latest
Security Latest
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
aimingoo的专栏
aimingoo的专栏
Forbes - Security
Forbes - Security
T
Tailwind CSS Blog

博客园 - MSSQL123

ubuntu24下 ext4和xfs类型磁盘以及PostgreSQL实例性能对比测试 PostgreSQL 18 新特性 skip scan,一个鸡肋的功能 PostgreSQL 17 流复制中开启逻辑复制槽同步,以及逻辑槽的故障转移 记一次PostgreSQL交叉表crosstab行转列导致的OOM TiDB 扩容与缩容 PostgreSQL 高可用集群 patroni 自动故障转移测试 Ubuntu 20 环境下 patroni 自动化安装,一分钟快速搭建 patroni 集群 Ubuntu 20 环境下 pg_auto_failover 自动化安装,一分钟快速搭建pg_auto_failover集群 PostgreSQL的消息队列扩展pgmq 磁盘IO延迟和队列深度的关系 TiDB 最小拓扑架构集群安装 PostgreSQL 逻辑复制中的同步和异步模式以及其表现 prometheus 的 altermanager Silences静默告警,优雅地抑制告警 “世界上百分之99的博士和他们的论文都是垃圾”,原本以为这个观点偏激 pg_auto_failover 在多种场景下自动故障转移的验证 pgbouncer连接池设置与压力测试的最大连接数测试 pg_auto_failover 自动故障转移参数 博文阅读密码验证 - 博客园 pg_auto_failover 高可用中,PostgreSQL实例配置文件的加载步骤 pg_auto_failover集群monitor节点的高可用 prometheus监控Linux Server node_exporter代理安装和配置 prometheus监控windows window_exporter代理安装和配置 Prometheus 和 Grafana 监控 PostgreSQL 记一次MySQL binlog日志导致磁盘空间占满的问题 SQLServer 2019 标准版在虚拟机上无法充分利用CPU的问题诊断 Windows Failover Cluster集群中的EventId 1196错误日志 pg_auto_failover 环境变量导致的show命令错误 SqlServer 事务复制(transaction replication)的复制位点信息 MySQL,SqlServer,PostgreSQL中,如何实现锁定一张表 PostgreSQL pg_auto_failover 高可用 2:pg_auto_failover集群运维 PostgreSQL pg_auto_failover 高可用 1:pg_auto_failover集群搭建 PostgreSQL patroni 高可用 4:HAProxy和Keepalived实现读写分离 PostgreSQL patroni 高可用 3:patroni 运维
SqlServer 事务复制的两个参数immediate_sync,allow_anonymous
MSSQL123 · 2025-10-20 · via 博客园 - MSSQL123

SqlServer的事务复制中,immediate_sync和allow_anonymous两个参数会影响到复制的后台行为和分发库(distribution)的数据保留方式,这两个参数单从名字上看,可能有些模棱两可甚至云里雾里,以下是个人结合复制的运维,对两个参数的理解。

1,immediate_sync

参数含义:是否执行“立即同步”,立即同步啥?谁来同步?有啥作用?表面含义跟没说一样,完全看不懂啥意思。
默认值:true,也就是“立即同步”。

表面上看,基本上看不出来这个参数到底是干嘛的,那么用人话,直白地说,当该immediate_sync 参数为true时,会产生以下行为:
1,当创建完发布之后,会立即(自动)创建一个快照备用(给谁备用,当然是订阅了,可现在还没有订阅啊)。
2,快照行为:还是可以反复用(true),快照是一次性用(false),默认为true的情况下,该快照会一直保留,直至超过保留期(Retention period)之后,才会被倍自动清理。
3,增量数据行为:在创建快照那一刻之后,分发数据库中会保留待发布的事务,对应在distribution库中的MSrepl_commands, ,MSrepl_transactions表,直至超过超过保留期(Retention period),才会被倍自动清理。
4,新建订阅会使用已有的快照完成初始化,以及结合distribution库中的增量数据做增量数据复制。


当该immediate_sync 参数为false时,会产生以下行为
1,当创建完发布之后,不会立即创建一个快照,只有新增订阅或者重新手动初始化的时候,才会生成快照
2,增量数据行为:只要快照之后的事务,被同步至订阅节点之后,就会[Distribution clean up: distribution]自动删除,不会等到保留期(Retention period)


2,allow_anonymous

参数含义:是否允许匿名订阅,匿名是什么意思?为什么要匿名?同样,表面含义跟没说一样,完全看不懂啥意思
默认值:true,也就是“允许匿名订阅”

到底什么是“匿名”订阅?“匿名”订阅会产生什么结果?
allow_anonymous依赖于上面提到的immediate_sync参数,只有在允许了匿名订阅allow_anonymous=true的情况下,且immediate_sync=true的情况下,发布才可以在没有订阅的情况下生成快照,以及将快照之后的事务保留在distribution库中。
说白了就是,提前把发布的快照生成好(全量数据),然后事务数据(增量数据)写入distribution库中保留,就好像已经有了订阅一样,把数据都准备好。一旦真正有订阅过来,可以直接利用快照,以及distribution中的活动事务数据做同步。

allow_anonymous的结果就是一个发布对应一组“虚拟订阅”。

select * from syssubscriptions 

artid       srvid  dest_dbstatus sync_type login_name subscription_type distribution_jobid                 timestamp          update_mode loopback_detection queued_reinit nosync_type srvname
----------- ------ -------- ------ --------- ---------- ----------------- ---------------------------------- ------------------ ----------- ------------------ ------------- ----------- ----------------
7           -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x000000000000468D 0           1                  1             0           
8           -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x000000000000468E 0           1                  1             0           
9           -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x000000000000468F 0           1                  1             0           
10          -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x0000000000004690 0           1                  1             0           
11          -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x0000000000004691 0           1                  1             0           
12          -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x0000000000004692 0           1                  1             0           
7           2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AB 0           1                  1             0           sub_server\MSSQLSTD
8           2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AC 0           1                  1             0           sub_server\MSSQLSTD
9           2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AD 0           1                  1             0           sub_server\MSSQLSTD
10          2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AE 0           1                  1             0           sub_server\MSSQLSTD
11          2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AF 0           1                  1             0           sub_server\MSSQLSTD
12          2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046B0 0           1                  1             0           sub_server\MSSQLSTD


3,什么情况下需要取消匿名订阅

3.1 在往发布中新增对象的情况下,需要关闭匿名同步和立即创建快照

allow_anonymous和immediate_sync是一个相互依赖的参数,如果要取消立即同步:需要先关闭allow_anonymous,然后再关闭immediate_sync,否则会报错

关闭immediate_sync

EXEC sp_changepublication
@publication = '***_pub',
@property = 'allow_anonymous' ,    --想关闭immediate_sync,必须先关闭allow_anonymous
@value = 'false'
GO

EXEC sp_changepublication
@publication = '***_pub',
@property = 'immediate_sync' ,
@value = 'false'
GO

--查看复制属性
exec sp_helppublication;
go

打开immediate_sync

EXEC sp_changepublication
@publication = '***_pub',
@property = 'immediate_sync' ,
@value = 'true'
GO

EXEC sp_changepublication
@publication = '***_pub',
@property = 'allow_anonymous' ,    --想打开allow_anonymous,必须先打开immediate_sync
@value = 'true'
GO

--查看复制属性
exec sp_helppublication;
go

然后再往发布中增加发布对象,手动创建快照,此时创建的快照,是新增对象的快照,而不是整个发布的快照

3.2 在往发布中新增对象的情况下,需要关闭匿名同步和立即创建快照

发布数据保存在分发数据库distribution中,当的清理机制是靠[Distribution clean up: distribution]这个job每10分钟运行一次,自动删除(Retention period)过期数据的,(Retention period)默认是72小时。
如果发布对象过多,或者发布对象上的增删改过多,会产生大量的分发日志(通俗说就是distribution爆了,这种情况大概率是[Distribution clean up: distribution] job因为某些原因停了),在immediate_sync=true以及allow_anonymous=true的情况下,这个日志又要保留72小时,
因此可能造成distribution库的严重膨胀,以及造成[Distribution clean up: distribution]执行过滤缓慢,此时需要关闭allow_anonymous和immediate_sync,关闭后,分发的数据不受控于Retention period,只要分发完成后随即会被[Distribution clean up: distribution] job删除。

关于重Reinitialize新初始化的选项,是否可以勾选“generated the new snapshot now”,情况有点有复杂,我试了N多遍才试出来:

1,如果allow_anonymous和immediate_sync都是true的情况下,创建的订阅允许勾选“复选框generated the new snapshot now选项”
2,如果allow_anonymous和immediate_sync都是true的情况下,创建订阅,然后修改allow_anonymous和immediate_sync为false,则不允许“复选框generated the new snapshot now选项”
3,如果allow_anonymous和immediate_sync都是false的情况下,创建的订阅不允许勾选“复选框generated the new snapshot now选项”
4,如果allow_anonymous和immediate_sync都是false的情况下,创建订阅,然后修改allow_anonymous和immediate_sync为true,也不允许勾选“复选框generated the new snapshot now选项”(手动生成快照后,就允许了,这个地方搞的很乱)。

imageimage

在SqlServer的replication中,感觉这两个参数,有点历史遗留问题的影响,感觉有些啰嗦和混乱。

https://repltalk.com/2010/03/24/what-immediate_sync-means-in-transactional-replication/
https://repltalk.com/2010/02/03/what-is-a-virtual-subscription-in-transactional-replication/