SQL Server 复制快照执行错误 错误代码 14068

问题描述:

  使用基于快照初始化的事务复制,在上次发布的时候,添加项,执行快照agent,报错,错误信息:

Error messages:
Message: The subscription status of the object could not be changed.
Command Text: sp_MSactivate_auto_sub
Parameters: @publication = 1
@article = %
@status = initiated

Stack: at Microsoft.SqlServer.Replication.AgentCore.ReMapSqlException(SqlException e, SqlCommand command)
at Microsoft.SqlServer.Replication.AgentCore.ExecuteWithResults(CommandSetupDelegate commandSetupDelegate, ProcessResultsDelegate processResultsDelegate, Int32 queryTimeout)
at Microsoft.SqlServer.Replication.Snapshot.TransSnapshotProvider.SetPublisherTranSequenceNumViaAutoSub(PublicationActivationState publicationActivationState, SqlConnection connection)
at Microsoft.SqlServer.Replication.Snapshot.TransSnapshotProvider.ActivateCSSPublicationAndSetTranSequenceNums(PublicationActivationState publicationActivationState, SqlConnection connection)
at Microsoft.SqlServer.Replication.Snapshot.TransSnapshotProvider.ConcurrentPreArticleFilesGenerationTransaction(SqlConnection connection)
at Microsoft.SqlServer.Replication.RetryableSqlServerTransactionManager.ExecuteTransaction(Boolean bLeaveTransactionOpen)
at Microsoft.SqlServer.Replication.Snapshot.TransSnapshotProvider.DoConcurrentPreArticleFilesGenerationProcessing()
at Microsoft.SqlServer.Replication.Snapshot.TransSnapshotProvider.DoPreArticleFilesGenerationProcessing()
at Microsoft.SqlServer.Replication.Snapshot.SqlServerSnapshotProvider.GenerateSnapshot()
at Microsoft.SqlServer.Replication.SnapshotGenerationAgent.InternalRun()
at Microsoft.SqlServer.Replication.AgentCore.Run() (Source: MSSQLServer, Error number: 14068)
Get help: http://help/14068
Server DB, Level 16, State 1, Procedure sp_MSrepl_changesubstatus, Line 1386
The subscription status of the object could not be changed. (Source: MSSQLServer, Error number: 14068)
Get help: http://help/14068

分析:

明显是可以看到,是由sp_MSrepl_changesubstatus,这个存储过程引起的。但是环境是2012 苦于找不到存储过程源代码,就搁置了问题。

今天google的时候发现这个过程,在2008时候的源代码:http://www.g-productions.nl/index.php?name=sp_MSrepl_changesubstatus

通过分析,不难发现,其实出错就2个可能,才会抛出14068错误:

1.sp_MSget_qualified_name,通过object_id查询object_name的时候

2.sp_MSLockMatchID,锁定某个对象的时候

那么就先排查第一个,还是通过上面的网站,找出sp_MSget_qualified_name源代码,发现是通过object_name(objid)如果为null就报错。

通过sp_MSrepl_changesubstatus源代码,向上排查,查看是否某些订阅对象的objid已经失效。

DECLARE @publication_ids TABLE ( pubid int )
INSERT INTO @publication_ids  ( pubid ) values  ( 1  )

SELECT    sxav.* INTO #t
FROM    sysextendedarticlesview sxav,
    syspublications sp,
    @publication_ids pi
WHERE    sp.pubid = sxav.pubid
AND    sp.pubid = pi.pubid

SELECT OBJECT_NAME(objid) ,name,dest_table,* FROM #t WHERE  OBJECT_NAME(objid) IS NULL    

发现一个artid=468的没有对象名,接下来就简单了,上面SQL中有,name,可以根据这个name知道是什么对象,看看数据库中是否存在,如果不存在,新建一个,如果存在就修改sysextendedarticlesview 。

但是发现sysextendedarticlesview 是一个试图,里面由2个表union all而成,那么就看对象到底在哪个表里面:

SELECT * FROM dbo.sysarticles WHERE artid = 468
SELECT * FROM dbo.sysschemaarticles WHERE artid = 468

我这边的情况是在syschemaarticles表上。

处理:

处理就很简单了:

1.更新掉objid:

UPDATE sysschemaarticles SET objid=1799833624 WHERE artid = 468

2.到发布里面,取消这个项。

3.为了测试,可以新增加一个项来测试,快照是否正常。

时间: 2024-08-27 00:52:41

SQL Server 复制快照执行错误 错误代码 14068的相关文章

16、SQL Server 复制及常见错误处理

SQL Server 复制 复制是一组技术的组合,可以用此组合对数据和数据库对象进行复制由一个数据库移动到另一个数据库. 复制的英文是Replication,重复的意思,而不是Copy.复制的核心功能是存储转发,在源数据库中进行增.删.改之后,重复这个动作到其他数据库. 使用复制的原因 1.负载均衡:通过将数据复制到其他数据库服务器来减少当前服务器的负载. 2.分区:将经常使用的数据和历史数据进行隔离. 3.授权:将一部分数据提供给需要使用数据的人. 4.数据合并:每个区域都有各自的数据,将其数

SQL Server复制出错文章集锦

SQL Server复制出错文章集锦 为了方便大家对数据库复制过程中出错的时候更好地解决问题 本人收集了SQL Server相关复制出错解决的文章   The process could not execute 'sp_repldone/sp_replcounters' on 'ServerName' 潇湘隐者 事物复制遇到的几个错误 万剑齐发 一个事务复制的bug--更新丢失 续 stswordman 复制中发布服务器和订阅服务器内容不一致的解决办法 CareySon 一个事务复制的bug--

玩转SQL Server复制回路の变更数据类型、未分区表转为分区表

玩转SQL Server复制回路の变更数据类型.未分区表转为分区表 复制的应用: 初级应用:读写分离.数据库备份 高级应用:搬迁大型数据库(跨机房).变更数据类型.未分区表转为分区表 京东的复制专家 菠萝 曾经写过文章.在数据库大会上也做过演讲,但是我相信真正按照菠萝兄的文章自己去做一次实验的人应该不多 京东的复制专家 菠萝 的文章地址:Replication的犄角旮旯(一)--变更订阅端表名的应用场景 为什麽要玩转复制,大家想象一下:变更数据类型.未分区表转为分区表 这些业务场景经常都会发生,

第五篇 SQL Server代理理解代理错误日志

本篇文章是SQL Server代理系列的第五篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.在第四篇中我们看到,SQL Server代理可以通过数据库邮件发送通知.如果有什么不正确的,你必须查看数据库邮件日志.在这一篇,你将学习如何理解和查看所有相关的SQL Server代理错误日志.你将回顾最常见的错误信息,掌握哪些信息需要你采取行动,哪些信息只是单纯的信息而已.一旦你理解错误日志,在处理SQL Serv

SQL Server复制的阶段:1级 - SQL Server复制简介

塞巴斯蒂安·梅内,2012/12/26 该系列 本文是"Stairway系列:SQL Server复制的阶梯"的一部分 SQL复制可以解决运行数据库驱动的应用程序中的许多问题.出版/订阅者模型并不完全容易理解,脚本和监控复制系统的复杂性需要考虑.在这里,最后是一系列文章,注意为所有类型的SQL Server复制生成一个无行话的方法. 级别1:SQL Server复制简介 主要条目:rep-li-ca-tion 发音:\?re-pl? - 'ka-sh?n \ 功能:名词 日期:14世纪

SQL Server复制的阶梯:第1级 - SQL Server复制简介

                                                                          SQL Server复制的阶梯:第1级 -  SQL Server复制简介 <Pro SQL Server Internals, 2nd edition>      作者:Dmitri Korotkevitch       翻译:何圳冰 该系列 本文是Stairway系列的一部分:SQL Server复制的进阶 SQL Replication可以解

翻译:SQL Server复制的阶梯:第1级 - SQL Server复制

简介 作者:Sebastian Meine, 2012年12月26日 该系列 本文是Stairway系列的一部分:SQL Server复制的阶梯 SQL Replication可以解决运行数据库驱动的应用程序中的许多问题.发布/订阅者模型不是很容易理解,脚本和监视复制系统的复杂性需要一些思考.最后,这是一系列文章,它们负责制作所有类型的SQL Server Replication的无术语方法. 第1级:SQL Server复制简介 主要条目:rep-li-ca-tion 发音:\?re-pl?-

SQL Server附加数据库出现错误5123的正确解决方法

SQL Server附加数据库出现错误5123的正确解决方法 因为自己有一本基于SQL Server 2005的数据库教程,里边使用的示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008.起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server

SQL SERVER出现大量一致性错误的解决方法

如果DBCC CHECKDB发现了比较少的一致性错误,可以使用   DBCC UPDATEUSAGE(DatabaseName,"dbo.ObjectName"); 语句逐个针对表或索引中的每个分区更正行.已用页.保留页.叶级页和数据页的计数.但是如果数据库出现大量一致性错误.例如如下所示: DBCC results for 'JO_T_CUTXX'. 消息 2508,级别 16,状态 1,第 1 行 The In-row data USED page count for object