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

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

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

解决思路

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

  • 如果是复制分发停止了,那么在错误信息中会显示事务序列号。上图中是‘0x000311CC00013A7300010000000’
  • 如果复制错误信息在显示窗口中被覆盖,比如选择了跳过错误,或者其他错误覆盖了该错误,可以在分发服务器上执行 :
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

示例:

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 ]

前两个参数是开始事务号和结束事务号,输入这两参数即可

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

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

3. 补救措施

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

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

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

select*from MSpublications

时间: 2024-10-10 18:02:16

sqlserver复制延迟报”应用复制的命令时在订阅服务器上找不到该行“的相关文章

在SecureCRT上,使用命令行从远程服务器上传或者下载文件

引言: 在服务器上,一般都会通过命令行来进行访问.对于上传或者下载文件的需求,除了使用filezilla之类的工具之外,还可以使用rz/sz来完成类似操作. 1.  SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. 一般的运维或者开发人员都是使用这些工具来远程登录服务器,完成相应操作. 2.  上传或者下载文件需求 一般服务器如果开发了21端口,并支持ftp协议,则可以使用filezi

数据库复制(一)--复制介绍

介绍: 在运行着的数据库驱动的应用程序中,SQL复制能解决许多问题.由于发送/订阅的模式不是十分容易理解,复杂的脚本语言和监视复制系统也是需要一定的思想在里面.希望在接下来的几个章节中能尽量将基本原理和操作阐述的详细完整些,便于大家理解. 在SQLServer中,复制就是产生或复制数据:比如你需要去创建一个你数据的副本,或者复制一个那份数据的改变,SQL复制就派上用场了. 复制的副本可以在同一个数据库中也可以在远程的分隔的服务器上. 副本与源数据保持实时同步,或者在规定时间间隔内保持同步.单步同

数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器

[SQL Server高可用性]数据库复制:修改表结构.新增表.新增存储过程 会被复制到订阅服务器? 在SQL Server上配置好数据库复制后: 1.如果给表加了字段,会不会复制到订阅服务器呢?如果是删除1个字段呢? 2.如果新创建了1个表,会不会被同步过去呢? 3.如果新建了一个存储过程,会不会同步过去呢? 本文将会通过实验,回答上述问题. 1.首先,需要配置数据库复制. 这里为了简单起见,用了机器上的2个SQL Server 2008R2的实例. 两个实例分别是:MSSQLSERVER.S

seconds_behind_master监控复制延迟的不足及pt-heartbeat改进方法

seconds_behind_master含义及不足 seconds_behind_master的值是通过将salve服务器当前的时间戳与二进制日志中的事件的时间戳相比得到的,所以只有执行事件时才会报告延迟. 1.1  如果备库复制线程没有运行,就会报延迟为null. 1.2  一些错误比如网络不稳定可能导致复制中断或停止复制线程,但是seconds_behind_master将显示为0,而不是显示错误 1.3  即使备库线程正在运行,备库有时候可能无法计算延时,如果发生这种情况,备库会报0或者

MySQL 5.7并发复制和mysqldump相互阻塞引起的复制延迟

本来MySQL BINLOG和SHOW PROCESSLIST命令属于八竿子打不着的两个事务,但在最近故障排查中,发现主库和从库已经存在很严重的复制延迟,但从库上显示slave_behind_master值为0,复制SQL线程与备份线程之间相互阻塞,但未报死锁. 在从库上执行SHOW PROCESSLIST发现复制的SQL线程等待锁,而等待SQL的WHERE条件竟然是类似于WHERE C1='ABC' AND C2>'2018-03-01' AND C2<'2018-03-26' 这种个范围查

mha 复制检查报错“There is no alive server. We can&#39;t do failover”

安装mha所参考的文章: http://linzhijian.blog.51cto.com/1047212/1906434 http://www.cnblogs.com/xiaoboluo768/p/5984530.html 参考以上文章搭建mha0.57+centos7+mariadb10.1.22 配置文件内容: 验证: 1.验证ssh成功 2.验证复制状态失败 解决思路: 1.远程测试数据库是否可以连接,可以连接 答案:未解决 2.肯定不能度娘了 在谷歌上查询到wubx大师回答的如上错误的

linux下复制文件报cp: omitting directory `XXX&#39;

错误操作:这个错误是因为在linux下我使用cp复制一个文件夹A到另一个目录下时报错cp: omitting directory `XXX' 原因:文件夹A中还有子目录文件,所以linux不允许直接复制,而是必须要把A文件夹中的子目录文件全部都要复制过去才行,所以使用cp时还得使用参数 -r. 例如:拷贝当前目录下的A文件夹到另一个文件夹B中:cp -r A ../B/ 同样的,如果遇到,要删除一个目录文件时,也必须要用-r 这个命令选项:rm -r A 从这里可以知道 -r  这个选项表示递归

SQLServer 2005 数据库定阅复制实现双机热备(主要是sharepoint 内容数据库)

原文:SQLServer 2005 数据库定阅复制实现双机热备(主要是sharepoint 内容数据库) 场景 公司最近的sharepoint的数据库服务器老是出问题,并且在一旦出现问题,就导致无法正常工作.最主要的是我们要加班还原以前的数据库,这是最头疼的.于是在网上查找资料,实现主备机的同步,对于sharepoint而言我们只需做到sharepoint的内容数据库同步即可.这种技术有个专业名词叫做双机热备. 双机热备原理 双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可

SqlServer将表中数据复制到另一张表

insert into phone2(ph,attr,type,carrier) select top 1000 ph,attr,type,carrier from phone 将表phone的字段和前1000条数据复制到Phone2表 数据库中的某个表删除重复数据(phone2表不能存在) select distinct  * into phone2 from phone 表phone的数据放到phone2中(phone2表可以存在) insert into phone2(ph,attr,ty