SQL Server企业版到标准版事务复制报Online索引操作错误如何解决
报错的核心原因是发布端为企业版,复制项目的默认架构选项开启了「生成联机索引创建脚本」的开关,生成的快照架构脚本会自动加ONLINE=ON参数,和源库创建索引时是否用了ONLINE=ON没有必然关联,所以你之前重建源库索引的操作不会生效。
定位包含ONLINE=ON配置的复制项目
- 方法1:在发布端执行如下SQL查询,定位开启了在线索引生成选项的复制项目:
USE [你的发布数据库名] GO SELECT a.name AS 复制项目名, a.dest_table AS 订阅端目标表名, i.name AS 关联索引名, a.schema_option FROM sysarticles a JOIN sysindexes i ON a.objid = i.id WHERE (a.schema_option & 0x8000000) = 0x8000000 -- 0x8000000对应生成联机索引创建脚本的配置项 AND i.indid BETWEEN 1 AND 254 AND (i.status & 64) = 0 -- 排除统计信息、堆表等非物理索引项
返回结果中的项目即为生成带ONLINE=ON索引脚本的复制项目。
- 方法2:找到发布端配置的快照输出目录,打开对应项目的
.sch后缀架构脚本文件,直接搜索ONLINE=ON关键字,即可定位到对应的表和索引。
无需升级订阅端的解决方案
方案1:修改复制项目架构选项,禁用在线索引生成
执行如下SQL关闭对应复制项目的联机索引生成开关,无需修改源库索引配置:
USE [你的发布数据库名] GO EXEC sp_changearticle @publication = N'你的发布名称', @article = N'上一步查到的复制项目名', @property = N'schema_option', @value = (SELECT schema_option & ~0x8000000 FROM sysarticles WHERE name = N'对应复制项目名'), -- 仅移除联机索引配置,不影响其他架构选项 @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
如果需要批量处理所有项目,可遍历sysarticles表统一修改所有匹配项的schema_option。修改完成后重新生成快照,再次同步即可解决报错。
方案2:快照阶段跳过索引创建,同步完成后手动建索引
如果不需要复制自动同步索引配置,可在发布属性的项目配置中,取消勾选「复制聚集索引」「复制非聚集索引」选项,重新生成快照完成首次同步后,手动在订阅端执行不带ONLINE=ON的索引创建语句即可。
方案3:自定义架构脚本替代自动生成脚本
在复制项目的属性配置中,指定自定义的架构创建脚本,完全替换系统自动生成的带ONLINE=ON的脚本,快照应用时会优先执行你指定的自定义脚本。
内容的提问来源于stack exchange,提问作者T Fletcher
相关产品推荐
相关产品推荐

