本文介绍故障排除步骤,这些步骤可能有助于解决复制日志读取器代理在 SQL Server 中失败后发生的问题。
原始产品版本:SQL Server
原始 KB 数: 2892635
现象
当复制日志读取器代理在 Microsoft SQL Server 中失败时,会收到类似于 SQL Server 日志中的错误消息:
<时间戳> spid98 Replication-Replication 事务日志读取器子系统:代理 logreadername 失败。 进程无法在“服务器名称<”上执行“>sp_replcmds”。 <时间戳> spid258 错误:14151,严重性:18,状态:1。 <时间戳> spid258 Replication-Replication 事务日志读取器子系统:代理 logreadername 失败。 进程无法在“服务器名称<”上执行“>sp_replcmds”。
此外,可能会收到类似于以下内容的一个或多个错误消息:
-
18805/18836 LogReader 无法构造复制的命令<时间戳>状态:0,代码:20011,文本:“进程无法在”服务器名称<“上执行”>sp_replcmds”。 <时间戳> 进程无法在“服务器名称<”上执行“>sp_replcmds”。 <时间戳> 状态:0,代码:18836,文本:“UpdateText 的文本信息块无效:m_pHead-GetType>() : 1, m_TextDataType: 0, m_TextOpType: 3, ti:{RowsetId 7746362867712, {TextTimeStamp 480235880448, {RowId {PageId 2680944, FileId 1}, SlotId 21 }} , coloffset -1, textInfoFlags 0x4, textSize 177, offset 177, oldSize 0, newSize 0}. <时间戳> 状态:0,代码:18805,文本:“Logreader 无法从 LSN {00150725:00014316:009d}构造复制的命令。 <时间戳>状态:0,代码:22037,文本:“进程无法在”服务器名称<“上执行”>sp_replcmds”。
-
18805/18836 LogReader 无法构造复制的命令<时间戳>状态:0,代码:20011,文本:“进程无法在”服务器名称<“上执行”>sp_replcmds”。 <时间戳> 进程无法在“服务器名称<”上执行“>sp_replcmds”。 <时间戳> Repl 代理状态:6 <时间戳> 状态:0,代码:18805,文本:“日志读取器代理未能从日志序列号 (LSN) {00033a89:0000969c:000a} 构造复制的命令。 备份发布数据库并联系客户支持服务。 <时间戳>状态:0,代码:22037,文本:“进程无法在”服务器名称<“上执行”>sp_replcmds”。
-
LogReader Timeout 代理正在运行。 使用复制监视器查看此代理会话的详细信息。 Repl Agent Status: 3 Publisher: {call sp_repldone ( 0x0000172a0002ac900001, 0x0000172a0002ac900001, 0, 0)} Publisher: {call sp_replcmds (500, 0)} Status: 2, code: 0, text: 'the process not execute 'sp_replcmds' on '<Publisher name>'. 进程无法在“发布者名称<”上执行“>sp_replcmds”。 Repl 代理状态:5 状态:2,代码:0,文本:“超时已过期”。 从发布服务器“发布者名称<”>断开连接时,代理失败并显示“重试”状态。 请稍后尝试运行代理。
-
断言<时间戳>状态:0,代码:20011,文本:“进程无法在”服务器名称<“上执行”>sp_replcmds”。 <时间戳> 进程无法在“服务器名称<”上执行“>sp_replcmds”。 <时间戳> 状态:0,代码:18773,文本:“在命令构造期间找不到列”ClientPreferences“、ID 30 的文本信息记录。 <时间戳> 状态:0,代码:3624,文本:“系统断言检查失败。 有关详细信息,请查看 SQL Server 错误日志。 通常,断定失败是由软件 bug 或数据损坏导致的。 若要检查数据库是否已损坏,请考虑运行 DBCC CHECKDB。 如果您同意在安装过程中将转储发送到 Microsoft,则将向 Microsoft 发送微型转储。 更新可能在 Microsoft 的最新 Service Pack 或技术支持部门的 QFE 中提供。 '. <时间戳>状态:0,代码:22037,文本:“进程无法在”服务器名称<“上执行”>sp_replcmds”。
故障排除
错误消息 1:“18805/18836 LogReader 未能构造复制的命令”
在此消息中,可以确定在日志中创建事务的对象和更改。 为此,请使用以下信息:
代码 18836 提供可在其中找到对象的页面的 ID。
注意
可以使用 “如何使用 DBCC PAGE ”查看数据库页的内容。
代码 18805 提供可以提供对象的日志序列号(LSN):
dbcc Log(master, 3, 'lsn', '0x00000208:000000a0:0004', 'numrecs', 1)
错误消息 2:“18805/18836 LogReader 未能构造复制的命令”
错误消息 1 和错误消息 2 之间的主要区别是错误 2 不包含状态消息,并且不指向“textinfo”列。 Microsoft SQL Server 2008 Service Pack 3 (SP3)的累积更新包 11 中修复了此已知问题。
此问题仅发生在具有二进制大型对象(BLOB)数据类型列且项目不使用参数化命令进行复制的表上。 若要解决此问题,请执行以下步骤:
确定项目是否使用参数化命令。 为此,请运行以下查询:
SELECT STATUS, NAME FROM sysarticles WHERE NAME =''将状态值转换为二进制格式。 例如,对于状态值为 41,二进制值101001,右侧的第五位(也称为状态位)为 ON。 如果状态位为 1,则已设置。 如果状态位为 0,则未设置。 因此,必须运行
sp_changearticle才能配置参数化命令。 若要更改状态位,请运行以下命令:sp_changearticle 'ConstituentRequest_ETL_Trans', 'CRProfile', 'status', 'parameters'
错误消息 3: LogReader 超时
若要解决此问题,请使用以下一种方法:
增加日志读取器代理的 QueryTimeout 参数的值。
注意
默认情况下,此参数的值为 1,800 秒(30 分钟)。
将 QueryTimeout 参数的值设置为零(0),以禁用超时。
减少日志读取器代理的 ReadBatchSize 参数的值。
如果错误日志中的断言与这些知识库文章中的问题匹配,请安装相应的修补程序。