现在的位置: 首页 > 综合 > 正文

SQL Server复制中错误处理__收藏

2013年10月06日 ⁄ 综合 ⁄ 共 4514字 ⁄ 字号 评论关闭

在SQL Server的复制中出现在错误“应用复制的命令时在订阅服务器上找不到该行”,换上以前的做法就是删除掉这个复制,然后再新建一个复制,但是这次,我突然想BAIDU一下,看看别人是怎么处理这个问题的,然后发现找到的文章都是从MSDN上抄下来的,因此我决定把我的做法写下来。

  首先查MSDN,确定这个错误的ID为20598,这个下面会用到;确定了错误ID之后,有两种方法可以跳过这个错误

  第一种是使用“右键-》复制-》分发服务器属性-》默认配置文件-》然后新建一个新的配置文件,”这样子就可以让分发的所有复制都使用新的配置文件,一般用来修改一些公共的参数。

  第二种是打开复制监视器,然后双击你要修改的那个复制,在“操作”菜单下有个代理配置文件,打开它后新建一个配置文件,然后使用这个配置文件,这种方法用来修改单个的复制的参数。

  新建后修改-SkipErrors这一项,点“值”栏后输入刚刚查到的ID号,就是20598,点确定,然后勾上你刚刚新建的这个配置文件。

  重启代理,打开复制监视器,你会发现它已经跳过了这个错误。

  如果是对等数据复制的话,要慎用,因为可能导致两个数据库的数据不一致,请先查明原因,然后再决定是否要跳过这个错误。 

  于事务性复制,有两种方法可以跳过在分发过程中遇到的错误:

  分发代理的 -SkipErrors 参数,可用来跳过某种类型的错误。有错误的事务将不提交,但后续的事务将提交。

  sp_setsubscriptionxactseqno 存储过程,可用来跳过一个或多个导致错误的事务。非SQL Server 的订阅服务器没有此选项。

  重要事项:

  在典型的复制处理中,应该不会遇到任何需要跳过的错误。跳过错误时要谨慎,要了解发生错误的条件、错误的起因以及需要跳过错误或特定事务而不解决的理由。如果在订阅服务器上跳过发布服务器上提交的事务,则这两个节点就不会完全同步,这会导致其他错误。

  -SkipErrors 参数:

  默认情况下,发布代理遇到错误时就会停止。如果使用 -SkipErrors 参数,并指定了预期的或不想让其干扰复制的错误,则代理就会记录错误信息,然后继续运行。例如,如果要指定分发代理,使其记录重复键违规但继续处理后续事务,就需要指定代理跳过错误 2601(不能在具有唯一索引 ’%.*ls’ 的对象 ’%.*ls’ 中插入重复键的行。)和 2627(违反了 %ls 约束 ’%.*ls’。不能在对象 ’%.*ls’ 中插入重复键): -SkipErrors 2601;2627

--------------------------------------------------------------------------------------------------------

附: Mssql错误代码对照表

错误 消息

MSSQL_ENG002601

不能在具有唯一索引 '%.*ls' 的对象 '%.*ls' 中插入重复键的行。

MSSQL_ENG002627

违反了 %ls 约束 '%.*ls'。不能在对象 '%.*ls' 中插入重复键。

MSSQL_ENG003165

数据库 '%ls' 已还原,但在还原/删除复制时出错。该数据库仍保留为离线状态。请参阅 SQL Server 联机丛书中的主题 MSSQL_ENG003165。

MSSQL_ENG003724

无法对 %S_MSG '%.*ls' 执行 %S_MSG,因为它正用于复制。

MSSQL_ENG004929

无法更改 %S_MSG '%.*ls',因为正在为复制而发布它。

MSSQL_ENG007395。请参阅对 Oracle 发布服务器进行故障排除

无法启动链接服务器“%ls”的 OLE DB 访问接口“%ls”的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。

MSSQL_ENG014005

无法删除发布。该发布已有订阅。

MSSQL_ENG014010

未将服务器“%s”定义为订阅服务器。

MSSQL_ENG014114

未将 '%s' 配置为分发服务器。

MSSQL_ENG014117

未将 '%s' 配置为分发数据库。

MSSQL_ENG014120

无法删除分发数据库 '%s'。此分发服务器数据库与发布服务器相关联。

MSSQL_ENG014121

无法删除分发服务器 '%s'。此分发服务器与分发数据库相关联。

MSSQL_ENG014144

无法删除订阅服务器 '%s'。在发布数据库“%s”中已有此服务器的订阅。

MSSQL_ENG014150

复制 - %s:代理 %s 成功。%s

MSSQL_ENG014151

复制 - %s: 代理 %s 失败。%s

MSSQL_ENG014152

复制 - %s:代理 %s 计划重试。%s

MSSQL_ENG014157

由发布 '%s' 的订阅服务器 '%s' 创建的订阅已过期,且已停止。

MSSQL_ENG014160

已设置发布 [%s] 的阈值 [%s:%s]。此发布的一个或多个订阅已过期。

MSSQL_ENG014161

已设置发布 [%s] 的阈值 [%s:%s]。请确保日志读取器和分发代理正在运行并且可以满足滞后时间要求。

MSSQL_ENG014162

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG014163

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG014164

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG014165

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG018456

用户 '%.*ls'.%.*ls 登录失败

MSSQL_ENG018752

一次只能有一个日志读取器代理或日志相关过程(sp_repldone、sp_replcmds 和 sp_replshowcmds)连接到某个数据库。如果执行了一个日志相关过程,那么在启动日志读取器代理或者执行另一个日志相关过程之前,请删除执行 第一个过程时所用的连接,或者在该连接上执行 sp_replflush。

MSSQL_ENG020554

复制代理在 %ld 分钟内没有记录任何进度消息。这表明代理已停止响应或系统活动过多。请确保正在将记录复制到目标,并且与订阅服务器、发布服务器和分发服务器的连接仍然是活动的。

MSSQL_ENG020557

代理关闭。有关详细信息,请参阅作业 '%s' 的 SQL Server 代理作业历史记录。

MSSQL_ENG020572

在验证失败之后,订阅服务器“%s”对发布“%s”中项目“%s”的订阅已被重新初始化。

MSSQL_ENG020574

订阅服务器“%s”对发布“%s”中项目“%s”的订阅未通过数据验证。

MSSQL_ENG020575

订阅服务器“%s”对发布“%s”中项目“%s”的订阅已通过数据验证。

MSSQL_ENG020596

只有 '%s' 或 db_owner 的成员可以删除匿名代理。

MSSQL_ENG020598

应用复制的命令时在订阅服务器上找不到该行。

MSSQL_ENG021075

发布 '%s' 的初始快照尚不可用。

MSSQL_ENG021076

项目 '%s' 的初始快照尚不可用。

MSSQL_ENG021286

冲突表 '%s' 不存在。

MSSQL_ENG021330

无法在复制工作目录下创建子目录。(%ls)

MSSQL_ENG021331

无法将用户脚本文件复制到分发服务器。(%ls)

MSSQL_ENG021385

快照无法处理发布 '%s'。可能是由于活动架构的更改操作或者是所添加的新项目所致。

MSSQL_ENG021617。请参阅对 Oracle 发布服务器进行故障排除

无法运行 SQL*PLUS。请确保分发服务器上安装了最新版本的 Oracle 客户端代码。

MSSQL_ENG021620。请参阅对 Oracle 发布服务器进行故障排除

通过系统 Path 变量获得的 SQL*PLUS 版本不够新,无法支持 Oracle 发布。请确保分发服务器上安装了最新版本的 Oracle 客户端代码。

MSSQL_ENG021624。请参阅对 Oracle 发布服务器进行故障排除

在分发服务器 '%s' 上找不到已注册的 Oracle OLEDB 访问接口 OraOLEDB.Oracle。请确保分发服务器上安装并注册了最新版本的 Oracle OLEDB 访问接口。有关其他信息,请参阅 SQL Server 联机丛书中“排除 Oracle 发布服务器故障”中的“SQL Server 错误 21624”。

MSSQL_ENG021626。请参阅对 Oracle 发布服务器进行故障排除

无法使用 Oracle OLEDB 访问接口 OraOLEDB.Oracle 连接到 Oracle 数据库服务器 '%s'。

MSSQL_ENG021627。请参阅对 Oracle 发布服务器进行故障排除

无法使用 Microsoft OLEDB 访问接口 MSDAORA 连接到 Oracle 数据库服务器 '%s'。

MSSQL_ENG021628。请参阅对 Oracle 发布服务器进行故障排除

无法更新分发服务器 '%s' 的注册表,以允许 Oracle OLEDB 访问接口 OraOLEDB.Oracle 与 SQL Server 一起在进程中运行。请确保当前登录名有权修改 SQL Server 拥有的注册表项。

MSSQL_ENG021629。请参阅对 Oracle 发布服务器进行故障排除

指示 Oracle 的 Oracle OLEDB 访问接口 OraOLEDB.Oracle 已注册的 CLSID 注册表项不在分发服务器上。请确保分发服务器上安装并注册了 Oracle OLEDB 访问接口。

MSSQL_ENG021642。请参阅对 Oracle 发布服务器进行故障排除

异类发布服务器需要链接服务器。已有一个名为 '%s' 的链接服务器。请删除链接服务器或另选一个发布服务器名称。

MSSQL_ENG021663。请参阅对 Oracle 发布服务器进行故障排除

找不到源表 [%s].[%s] 的有效主键。

MSSQL_ENG021684。请参阅对 Oracle 发布服务器进行故障排除

“Oracle 发布服务器 "%s" 的复制管理用户权限不足。有关所需权限,请参阅脚本 /MSSQL/Install/oracleadmin.sql。”

MSSQL_ENG021797

'%s' 必须是有效的 Windows 登录名,且格式为:'计算机\登录名' 或 '域\登录名'。请参阅 '%s' 的文档。

MSSQL_ENG021798

在继续操作之前,必须通过“%s”添加“%s”代理作业。请参阅 '%s' 的文档。

MSSQL_ENG024070

客户端没有所需的特权。

MSSQL_REPL020011

进程无法在“%2”上执行“%1”。

MSSQL_REPL027056

合并进程无法更改“%1”上的生成历史记录。进行故障排除时,请使用详细的历史日志记录来重新启动同步,并指定要写入的输出文件。

MSSQL_REPL027183

合并进程未能使用参数化的行筛选器来枚举项目中的更改。如果此操作仍失败,请增大该进程的查询超时值,缩短发布的保持期,并改进对已发布表的索引。

抱歉!评论已关闭.