Debezium:数据库中没有记录最大LSN;请确保 SQL 服务器代理是 运行

Debezium: No maximum LSN recorded in the database; please ensure that the SQL Server Agent is running

这个问题是关于:

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

No maximum LSN recorded in the database; please ensure that the SQL Server Agent is running
[io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource]

我在 Github 上检查了 Debezium 的代码,我唯一能在代码注释中找到此警告的地方指出,只有当代理不是 运行 时才应抛出此警告。我已经确认 SQL 服务器代理是 运行。

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

注:

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

LSN 是 "pieces" 与您的 SQL 服务器更改相关的信息。如果您没有 LSN,可能是您的 CDC 未 运行 或未正确配置。 Debezium 使用 LSN 进行复制,因此,您的 SQL 服务器需要生成它。

一些方法:

  1. 您是否检查过您的 table 是否启用了 CDC?这将列出启用了 CDC 的 table:
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
  1. 您的 CDC 数据库已启用并正在运行? (参见 here

检查是否 enabled:

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

并检查是否 运行:

EXECUTE sys.sp_cdc_enable_db;  
GO  
  1. 您的 CDC 服务在 SQL 服务器上 运行?参见 in docs
EXEC sys.sp_cdc_start_job;  
GO  
  1. 在 CDC 中启用 table 时,我在角色名方面遇到了一些问题。对于我的情况,在 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

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

EXEC sys.sp_cdc_help_change_data_capture

为 William 的回答添加更多内容。

对于案例SQL服务器代理不是运行

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

  1. 控制面板 >
  2. 管理工具>
  3. 点击“服务”
  4. 寻找SQL服务器代理
  5. 右键单击并开始

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

PS:您需要具有 windows 服务器的登录权限。