开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

sqlserver复制报”应用复制的命令时在订阅服务器上找不到该行“解决方法

简介: 原文:sqlserver复制报”应用复制的命令时在订阅服务器上找不到该行“解决方法 最近遇到“应用复制的命令时在订阅服务器上找不到该行”问题,报错如下: 官方给出的建议是重新同步和初始化订阅,当然,这是一种选择,但是对于动辄上百G的生产库,这种方法会消耗大量的资源和时间。
+关注继续查看
原文:sqlserver复制报”应用复制的命令时在订阅服务器上找不到该行“解决方法

最近遇到“应用复制的命令时在订阅服务器上找不到该行”问题,报错如下:

官方给出的建议是重新同步和初始化订阅,当然,这是一种选择,但是对于动辄上百G的生产库,这种方法会消耗大量的资源和时间。可以通过定位出错数据,选择跳过,等从库追平主库后,修复错误数据方式,达到最终主从数据一致。

解决思路

1. 找到分发任务的事务序列号

获取当前出错的事务序列号有如下方法:

  •  如果是复制分发停止了,那么在错误信息中会显示事务序列号。上图中是‘0x000311CC00013A7300010000000’
  •  如果复制错误信息在显示窗口中被覆盖,比如选择了跳过错误(经过试验,发现跳过错误后,事务号会显示0x0000000000000000000000000000,所以最好不要跳过),或者其他错误覆盖了该错误,可以在分发服务器上执行 :
sp_helpsubscriptionerrors [ @publisher = ]'publisher'
, [ @publisher_db = ]'publisher_db' 
, [ @publication = ]'publication' 
, [ @subscriber = ]'subscriber' 
, [ @subscriber_db = ]'subscriber_db'

参数对应值可以通过在分发服务器查询获取:

获取publisher和subscriber

select * from MSsubscriber_info

获取publisher_db和publication

select * from MSpublications

在订阅服务器上执行,获取事务序列号

sp_setsubscriptionxactseqno [ @publisher= ]'publisher', 
[ @publisher_db= ]'publisher_db', 
[ @publication= ]'publication', 
[ @xact_seqno= ] xact_seqno

示例:

 

  •  直接查询订阅服务器目标库上相关表,字段transaction_timestamp就是序列号
SELECT * FROM dbo.MSreplication_subscriptions

2. 查看出错命令

获取事务序列号之后,查看事务号对应的具体命令:

sp_browsereplcmds [ [ @xact_seqno_start = ] 'xact_seqno_start' ]
    [ , [ @xact_seqno_end = ] 'xact_seqno_end' ] 
    [ , [ @originator_id = ] 'originator_id' ]
    [ , [ @publisher_database_id = ] 'publisher_database_id' ]
    [ , [ @article_id = ] 'article_id' ]
    [ , [ @command_id= ] command_id ]
    [ , [ @agent_id = ] agent_id ]
[ , [ @compatibility_level = ] compatibility_level ]

前两个参数是开始事务号和结束事务号,建议一定要输入publisher_database_id这个参数。该存储过程实际上查询的是MSrepl_commands表,该表的复合索引前缀是publisher_database_id该字段,对于大数据量的分法库,没用到索引的查询所消耗的时间可想而知。

command 默认的命名规则是sp_MS+operation+_schemaName+tableName

通过示例知道该操作表示对T_CarPakingRecord表进行update操作,最后的表示的是主键。

3. 补救措施

根据上面分析的命令结果,将完整数据插入到从库中(这里是补救缺失行错误,如果是插入重复则直接删除即可)

如果认为数据一致性不重要,则可以直接跳过,不推荐这样。跳过错误的命令:

sp_setsubscriptionxactseqno [ @publisher = ] '发布服务器主机名'
, [ @publisher_db = ] '发布数据库'
, [ @publication = ] '发布名称'
, [ @xact_seqno = ] 跳过的事务号

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
sql server数据库定时自动备份
     1、进入企业管理器中->管理->sql server代理->作业;  2、新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;  3、点击步骤标签,进入步骤面板。
1111 0
通过事务日志恢复SqlServer数据库到一个特定的时间点
Code--创建测试数据库CREATE DATABASE DbGO--对数据库进行备份BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMATGO--创建测试表CREATE TABLE Db.
729 0
sql server数据库的复制
关于SQLSERVER配置和维护复制:http://technet.microsoft.com/zh-cn/library/ms151247.
506 0
在非SqlServer数据库上实现MemberShip和Role功能(自定义MemberShipProvider和RoleProvider)
默认情况下,.Net网站上的MemberShip和Role功能只能用于SqlServer,如果要在其它数据库,比如Access,Oracle上使用该功能该怎么办呢? 其实MS早就为我们考虑到了,用户只要从MemberShipProvider和RoleProvider派生自己的Provider类,并...
834 0
缩小sql server数据库日志文件,限制sql server数据库日志文件的大小
由于经常和数据库打交道,经常见到在客户的机器上,SQL server数据库日志文件的大小,远远超过于数据库数据文件的大小,客户用的都是一些服务器,磁盘空间有的是,当然不在乎这点文件,可以,当客户要求查找一些数据的时候,就不得不备份客户的数据库,经常是备份回来的数据库,无法还原,原因就是我的PC上没有这么大的空间来还原,无奈啊, 只有把客户的数据库日志缩小一下了,于是从网上找了以下代码,可以收
1173 0
复制SqlServer数据库
在目前的工作中需要解决复制整个SqlServer数据库的问题,复制的内容包括数据库大纲、数据库中的存储过程、函数、表结构、主外键关系以及表中的所有数据等,也就是说copy版本与原数据库一模一样。经过一段时间的摸索,找到的一个比较简单的解决方案是:(1)在复制数据库之前,先备份该数据库到文件。
836 0
关于excel,access里的内容导到sqlserver数据库的问题?
<p>用SQL语句直接导入比较方便,快捷</p> <p>1.查询excel<br>SELECT * <br>FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',<br>  'Data Source="c:/Finance/account.xls";User ID=Admin;Password=;Extended properties=Excel 5.
1178 0
怎样用一条词句操作access和sqlserver(是内网上其它一台电脑)两个数据库?
<p>2、一条SQL运行两个数据库:<br>如果公司数据库和超市数据库的用户密码都一致,那么可以:<br>insert into 超市TABLE select * from  NKRXDATA.SAFECONTROL.dbo.公司TABLE<br>WHERE 。。。。。。<br>如果公司数据库和超市数据库的用户密码不一致,那么可以:<br>insert into超市TABLE select *
1191 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Spring Boot2.0实战Redis分布式缓存
立即下载
AliHB Real Time Cold data Backup
立即下载
yqdh_58c1286a0ee...1510407581.pdf
立即下载