Debezium:数据库中没有记录最大LSN;请确保 SQL Server 代理正在运行

Posted

技术标签:

【中文标题】Debezium:数据库中没有记录最大LSN;请确保 SQL Server 代理正在运行【英文标题】:Debezium: No maximum LSN recorded in the database; please ensure that the SQL Server Agent is running 【发布时间】:2020-07-21 03:12:12 【问题描述】:

此问题与:Debezium How do I correctly register the SqlServer connector with Kafka Connect - connection refused

在 Windows 10 中,我在 Docker 容器外部的 Microsoft SQL Server 实例上运行了 Debezium。我每 390 毫秒收到以下警告:

数据库中没有记录最大LSN;请确保 SQL 服务器代理正在运行 [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource]

我在 Github 上检查了 Debezium 的代码,并且我可以在代码 cmets 中找到此警告的唯一地方指出,只有在代理未运行时才应引发此警告。我已确认 SQL Server 代理正在运行。

为什么会出现此警告,我该如何解决?

注意:

我当前的解决方案似乎只能在非生产环境中工作 - 根据 Docker 的文档。

【问题讨论】:

【参考方案1】:

LSN 是与您的 SQL Server 更改相关的“片段”信息。如果您没有 LSN,则可能是您的 CDC 未运行或配置不正确。 Debezium 使用 LSN 进行复制,因此您的 SQL Server 需要生成它。

一些方法:

    您是否检查过您的表是否启用了 CDC?这将列出启用了 CDC 的表:
SELECT s.name AS Schema_Name, tb.name AS Table_Name
, tb.object_id, tb.type, tb.type_desc, tb.is_tracked_by_cdc
FROM sys.tables tb
INNER JOIN sys.schemas s on s.schema_id = tb.schema_id
WHERE tb.is_tracked_by_cdc = 1
    您的 CDC 数据库已启用并正在运行? (见here)

检查是否enabled:

SELECT * 
FROM sys.change_tracking_databases 
WHERE database_id=DB_ID('MyDatabase')

并检查是否正在运行:

EXECUTE sys.sp_cdc_enable_db;  
GO  
    您的 CDC 服务正在 SQL Server 上运行?见in docs
EXEC sys.sp_cdc_start_job;  
GO  
    在 CDC 中启用表时,我遇到了一些角色名问题。就我而言,在null 进行配置解决了我的问题(更多详情here)
    EXEC sys.sp_cdc_enable_table
        @source_schema=N'dbo',
        @source_name=N'AD6010',
        @capture_instance=N'ZZZZ_AD6010',
        @role_name = NULL,
        @filegroup_name=N'CDC_DATA',
        @supports_net_changes=1
     GO

【讨论】:

sys.change_tracking_databases 用于变更跟踪,与变更数据捕获不同。 Debezium AFAIK 也不使用更改跟踪。看到此警告时,此答案的其余部分似乎仍然是值得检查的好东西。【参考方案2】:

此错误的另一种可能性(我今天早上自己在尝试使新数据库联机时遇到了此警告)是 SQL 登录没有所需的权限。 Debezium 运行以下 SQL。检查您使用的 SQL 登录是否有权运行此存储过程,并返回您在 CDC 中设置的表。如果您收到错误或返回零行,请与您的 DBA 一起设置适当的权限。

EXEC sys.sp_cdc_help_change_data_capture

【讨论】:

【参考方案3】:

为威廉的回答添加更多内容。

对于 SQL Server 代理未运行

的情况

您可以通过以下方式启用它:

    控制面板 > 管理工具 > 点击“服务” 寻找 SQL Server 代理 右键开始

现在您可以在 mssql 中触发 cdc 作业查询。

PS:你需要有windows server的登录权限。

【讨论】:

以上是关于Debezium:数据库中没有记录最大LSN;请确保 SQL Server 代理正在运行的主要内容,如果未能解决你的问题,请参考以下文章

DB concept 恢复系统

Postgres Debezium 不发布记录的先前状态

mysql 之 checkpoint和LSN详解

Debezium PostgresConnector 实例化主题,因为表中没有数据

Debezium 有没有办法停止数据序列化?试图从源代码中获取值

Debezium 初始数据快照和相关实体顺序