search
HomeDatabaseMysql TutorialSQLServer复制出现the process could not execute 'sp

事务复制涉及三3个Job(代理) 1、快照, 这个 只在要求初始化的情况下执行一次 2、日志读取, 读取配置复制之后的数据变化, 并生成复制命令, 这个一直在运行状态 3、分发代理, 这个负责把复制命令同步到订阅服务器, 这个也一直在运行状态。 4、除此之外,还有清

事务复制涉及三3个Job(代理)

1、快照, 这个 只在要求初始化的情况下执行一次

2、日志读取, 读取配置复制之后的数据变化, 并生成复制命令, 这个一直在运行状态

3、分发代理, 这个负责把复制命令同步到订阅服务器, 这个也一直在运行状态。

4、除此之外,还有清除过期的命令的作业(REPL-清除分发)和清除快照的作业(REPL-清除快照)。

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

(1)事务命令过多导致日志读取器读取事务命令超时(或者服务器性能下降导致日志读取器读取事务命令超时)

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

前几天,有一台服务器的复制出现问题,日志读取器的作业失败, 重试之后依然失败,在作业的历史记录中,报错消息只有以下错误信息:

the process could not execute 'sp_replcmds' on 'server name' 

打开复制监视器之后,发现错误信息依然是:the process could not execute 'sp_replcmds' on 'server name' ,但是下面多了一行错误信息:

错误消息:

超时已过期(源:MSSQLServer,错误号:1003)

我们看下sp_replcmds 这个命令是干什么用的。

sp_replcmds:将在给定的数据库内运行 sp_replcmds 的第一个客户端视为日志读取器。返回被标记为复制的事务的命令。此存储过程在发布服务器的发布数据库上执行。

 

看来sp_replcmds 是取复制的命令的,结合上面的超时已过期的错误,可以想到该日志读取器在读取日志的时候超时了,即日志读取器的运行的查询的sql在运行时超时了。联想到最近我这台服务器有性能问题,因此查询消耗时间过长,也并非没有什么不可能的了。当然,也有可能是MSrepl_commands的命令比较多,可以在distribution库中运行以下代码查询数据量:

select count(1) from MSrepl_commands with(nolock) --目前我的数据库中有将近500w数据量,比较多,而其他的服务器就20w~30w的数据量。

 

确定原因之后,就需要把已经设置好的超时时间修改的长一点,以使日志读取器能在查询超时之前将标记为复制的事务的命令取出来。

1.启动复制监视器

2.右键-代理配置文件

SQLServer复制出现the process could not execute 'sp

3. 新建一个代理配置文件,将querytimeout的值修改为65533,这个是位置的最大值。

 SQLServer复制出现the process could not execute 'sp

重启日志读取器的作业,作业就正常运行了。

 

对于这方面的一些资料,可以参考:

http://blogs.msdn.com/b/repltalk/archive/2010/07/13/using-verbose-history-agent-profile-while-troubleshooting-replication.aspx

http://www.tuicool.com/articles/IV3QRr

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

(2)REPL-清除分发 作业运行时间过长导致锁表,造成日志读取器读取事务命令超时

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

日志读取作业一直失败并报the process could not execute 'sp_replcmds' on 'server name' 错误。

在遇到这种情况的时候,尝试重启服务器的sql 代理,然后日志读取器可以正常工作一段时间(我遇到的情况是几个小时),但每天都会失败,并导致日志读取器作业失败。由于晚上也会失败,但由于订阅服务器需要及时取得数据,因此当时写了个作业每天在凌晨3点钟重启发布服务器的sql agent,这样才使得事务复制可以正常工作。

发布服务器是sql server 2000,重启sql server agent的脚本如下:

--开启xp_cmdshell

sp_configure 'show advanced options',1

reconfigure

go

sp_configure 'xp_cmdshell',1

reconfigure

go

--重启sql server agent

--停止

use master

go

xp_cmdshell 'net stop SQLSERVERAGENT'

--启动

use master

go

xp_cmdshell 'net start SQLSERVERAGENT'

 但这种方法只是暂时的方法,在度娘和谷歌之后,找到以下原因:

之前出现的发布服务器重启Agent才能够把数据复制到订阅服务器是因为以下原因:

1、第二步日志读取操作,会将发布服务器中的各种insert,update和delete操作的命令存放在MSrepl_commands表中。(这句话中的“第二步” 请查看本文章的开头)

2、清除过期的命令的作业(REPL-清除分发)是每隔十分钟运行一次,每次会自动清除MSrepl_commands表中的过期命令。

3、REPL-清除分发 作业是调用sp_MSdelete_publisherdb_trans存储过程来清除过期的命令,sp_MSdelete_publisherdb_trans这个存储过程是每次用游标只取2000条数据,然后删除。

现发现MSrepl_commands表已经有11106751条数据,因此,需要删除的数据量过大,导致 REPL-清除分发 作业一直在运行,从而一直在删除MSrepl_commands表的数据,造成MSrepl_commands表经常被锁住。

4、日志读取操作这个步骤需要将新的命令插入到表MSrepl_commands中,而此表因为删除操作被长时间锁住之后,无法插入新的命令。而在游标所取出来的2000条数据被删除之后,游标再次取2000条数据之前,这时候表MSrepl_commands没有被锁住, 日志读取操作 作业这时候可以将新的命令插入到表MSrepl_commands中。如果表MSrepl_commands被锁住的时间过长,则日志读取操作 作业将会超时失败,然后重试运行这个作业,直到重试十次之后,该作业失败。这时候就不会有新的数据复制到订阅服务器中的业务库中。

5、此时重启sql server agent,日志读取操作这个作业将会重启,然后重复上面的步骤,这时候就会 有新的数据复制到订阅服务器中的业务库中。

解决方法:

存储过程sp_MSdelete_publisherdb_trans 中的删除逻辑是每次取2000条数据,然后删除,一直循环直到删除完毕。

将这个存储过程每次取2000条数据修改为每次取100000条数据,在经过一天的删除操作之后,数据量又11106751变为三十多万。此时REPL-清除分发作业只需要几秒的时间就可以完成,不会再锁住表MSrepl_commands,其他作业可以顺利执行。

备注: 

存储过程sp_MSdelete_publisherdb_trans中调用了存储过程sp_MSdelete_publisherdb_trans 来做的删除操作,因此修改的存储过程实际上是sp_MSdelete_publisherdb_trans。在表MSrepl_commands中的大部分数据被删除之后,我将参数100000修改回2000了。

 

 

微软亚太地区数据库技术支持组的一些博客也详细说了复制的一些问题,可以参考一下:

http://blog.itpub.net/25175503/viewspace-705405/                 ----性能故障排除工具

http://blog.itpub.net/25175503/viewspace-705413/                 ----日志读取器读者线程延迟

http://blog.itpub.net/25175503/viewspace-705826/                 ---- 日志读取器写者线程延迟

http://blog.itpub.net/25175503/viewspace-705827/                 ----分发代理读者线程延迟

http://blog.itpub.net/25175503/viewspace-706127/                 ----分发代理写者线程延迟

 

 

 

 

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
sqlserver数据库中已存在名为的对象怎么解决sqlserver数据库中已存在名为的对象怎么解决Apr 05, 2024 pm 09:42 PM

对于 SQL Server 数据库中已存在同名对象,需要采取以下步骤:确认对象类型(表、视图、存储过程)。如果对象为空,可使用 IF NOT EXISTS 跳过创建。如果对象有数据,使用不同名称或修改结构。使用 DROP 删除现有对象(谨慎操作,建议备份)。检查架构更改,确保没有引用删除或重命名的对象。

sqlserver服务无法启动怎么办sqlserver服务无法启动怎么办Apr 05, 2024 pm 10:00 PM

当 SQL Server 服务无法启动时,可采取以下步骤解决:检查错误日志以确定根本原因。确保服务帐户具有启动服务的权限。检查依赖项服务是否正在运行。禁用防病毒软件。修复 SQL Server 安装。如果修复不起作用,重新安装 SQL Server。

怎么查看sqlserver端口号怎么查看sqlserver端口号Apr 05, 2024 pm 09:57 PM

要查看 SQL Server 端口号:打开 SSMS,连接到服务器。在对象资源管理器中找到服务器名称,右键单击它,然后选择“属性”。在“连接”选项卡中,查看“TCP 端口”字段。

sqlserver数据库在哪里sqlserver数据库在哪里Apr 05, 2024 pm 08:21 PM

SQL Server 数据库文件通常存储在以下默认位置:Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data可通过修改数据库文件路径设置来自定义数据库文件位置。

Java连接SqlServer错误如何解决Java连接SqlServer错误如何解决May 01, 2023 am 09:22 AM

问题发现这次使用的是SqlServer数据库,之前并没有使用过,但是问题不大,我按照需求文档的步骤连接好SqlServer之后,启动SpringBoot项目,发现了一个报错,如下:刚开始我以为是SqlServer连接问题呢,于是便去查看数据库,发现数据库一切正常,我首先第一时间问了我的同事,他们是否有这样的问题,发现他们并没有,于是我便开始了我最拿手的环节,面向百度编程。开始解决具体报错信息是这样,于是我便开始了百度报错:ERRORc.a.d.p.DruidDataSource$CreateCo

sqlserver英文安装怎么更改中文sqlserver英文安装怎么更改中文Apr 05, 2024 pm 10:21 PM

SQL Server 英文安装可通过以下步骤更改为中文:下载相应语言包;停止 SQL Server 服务;安装语言包;更改实例语言;更改用户界面语言;重启应用程序。

Win11无法安装SQL Server的原因及解决方案Win11无法安装SQL Server的原因及解决方案Dec 27, 2023 pm 07:48 PM

有网友反馈,在win11上无法安装sqlserver这款软件,不知道是怎么回事,根据目前的测试来看,win11存在硬盘问题,部分接口硬盘无法安装这款软件。win11为啥不能安装sqlserver:答:win11不能安装sqlserver是硬盘的问题。1、据了解,win11存在对于硬盘的检测bug。2、这导致sqlserver无法在“三星m.2接口”硬盘上安装。3、因此,如果我们要安装的话,需要准备一块其他硬盘。4、然后将该硬盘安装到电脑里,如果没有额外插槽的话就要换掉之前的硬盘。5、安装完成后,

sqlserver数据库日志怎么查询sqlserver数据库日志怎么查询Apr 05, 2024 pm 09:06 PM

可以通过以下步骤查询 SQL Server 数据库日志:1. 打开 SQL Server Management Studio,连接到数据库服务器;2. 展开“管理”节点,导航到“SQL Server 日志”;3. 选择要查询的日志文件,右键单击并选择“查看日志文件”;4. 浏览日志记录。其他查询日志方法:使用 Transact-SQL 查询、PowerShell Cmdlet。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!