事务复制数据库添加新表:无需重建发布及新快照可行吗?
事务复制中添加新表的高效方案(无需重建发布/全量快照)
嗨Travis,刚好处理过不少生产环境下的事务复制扩容问题,完全不用删除重建整个发布,也不用生成全量快照——这对怕锁、怕停机的生产库太友好了!下面给你一步步拆解操作:
一、快速将新表添加到现有发布
有两种方式可选,看你习惯用图形界面还是命令行:
方式1:SSMS图形界面操作
- 打开SQL Server Management Studio,连接到发布服务器
- 展开「复制」→「本地发布」,找到你的目标发布,右键选择「属性」
- 在弹出的属性窗口中切换到「项目」标签页,点击「添加」按钮
- 在列表里选中你新建的两张表,确认后保存即可(如果需要自定义复制规则,比如过滤列、设置同步选项,可在这一步调整)
方式2:T-SQL命令行操作(更适合自动化/生产环境批量操作)
先执行sp_addarticle添加每张表到发布,再用sp_addsubscription配置订阅端同步:
-- 添加第一张新表到发布 EXEC sp_addarticle @publication = N'你的发布名称', @article = N'NewTable1', @source_object = N'NewTable1', @source_owner = N'dbo', -- 表的所属架构,按需修改 @destination_table = N'NewTable1', @destination_owner = N'dbo', @type = N'logbased', -- 事务复制必须选logbased类型 @schema_option = 0x000000000803509D; -- 默认的事务复制表架构选项,可根据需求调整 -- 添加第二张新表到发布 EXEC sp_addarticle @publication = N'你的发布名称', @article = N'NewTable2', @source_object = N'NewTable2', @source_owner = N'dbo', @destination_table = N'NewTable2', @destination_owner = N'dbo', @type = N'logbased', @schema_option = 0x000000000803509D; -- 配置推送订阅(如果是拉取订阅,把@subscription_type改成N'Pull') EXEC sp_addsubscription @publication = N'你的发布名称', @article = N'NewTable1', @subscriber = N'订阅服务器名称', @destination_db = N'订阅端数据库名称', @subscription_type = N'Push'; EXEC sp_addsubscription @publication = N'你的发布名称', @article = N'NewTable2', @subscriber = N'订阅服务器名称', @destination_db = N'订阅端数据库名称', @subscription_type = N'Push';
二、快照处理:仅生成新表的快照,无需全量重建
划重点:不需要生成整个发布的全新快照,只需要为新增的两张表生成「增量快照片段」即可,锁的范围仅局限于这两张新表,对现有业务几乎无影响:
方式1:SSMS操作
- 回到发布的属性窗口,切换到「快照」标签页
- 点击「生成快照」,在弹出的对话框中选择「仅生成新添加项目的快照」(这个选项会自动跳过已同步的现有表,只处理新增的表)
方式2:T-SQL命令行操作
执行以下命令启动快照生成,系统会自动识别仅需要同步的新表:
EXEC sp_startpublication_snapshot @publication = N'你的发布名称';
三、生产环境注意事项
- 主键要求:事务复制要求被复制的表必须有主键,如果你的新表没加主键,先补加后再添加到发布
- 锁的影响:生成新表快照时,只会锁定这两张新表,且锁的时间很短(数据量越小,耗时越短),完全适合夜间停机窗口执行
- 数据同步:如果新表已有数据,快照会把初始数据同步到订阅端;如果是空表,仅同步表结构
- 前置检查:操作前先确认现有复制链路状态正常(可通过SSMS的「复制监视器」查看),避免新增表时引入额外问题
内容的提问来源于stack exchange,提问作者Travis Brand
相关产品推荐
相关产品推荐

