SS 2008 R2 中的 CDC 未捕获数据,但也没有错误
CDC in SS 2008 R2 not capturing data, but no errors either
首先是 post,所以我马上开始。预先感谢您的回答和考虑。
我对相关数据库 运行 所在的数据库引擎拥有完全权限,包括系统管理员。
据我所知,我已根据文档正确启用了此功能,并执行了以下操作:
运行 命令 EXEC sys.sp_cdc_enable_db
通过 c# 应用程序
我用它作为一个界面来处理设置、记录、
并比较 DML 数据库更改。
来自同一个应用程序,运行 命令
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'ORD_ATTACHMENTS',
@role_name = NULL
我已使用 SELECT [name], database_id, is_cdc_enabled FROM sys.databases
.
验证相关数据库已准备好用于 CDC
我也使用 SELECT [name], is_tracked_by_cdc FROM sys.tables
验证了 table 的准备情况。
运行 SELECT * FROM [msdb].[dbo].[cdc_jobs] WHERE [database_id] = DB_ID()
在数据库上下文中为捕获作业生成以下信息:
最大传输:7200
最大扫描:10
连续:1
轮询间隔:5
保留和阈值为 0。
通过 SSMS 将记录插入有问题的 table 后,相关的 CDC table 尽管存在,但其中没有任何数据。没有遇到任何错误,记录已成功添加到源 table。
附加信息:
- 数据库服务器曾经使用 Windows 纤程(轻量级池化)。我
已将其关闭、重新配置并重新启动服务器。
- 数据库曾经将兼容性设置为 SQL Server 2005 (90),但是
我已将其更新为 SQL Server 2008 (100)。再次重启
服务器。
- 我还将更改跟踪 属性 设置为 true
有问题的数据库,但我后来了解到这是
无关紧要。
源 table 具有以下字段:
[AttachmentID] [bigint] IDENTITY(1,1) NOT NULL,
[ORDNUM] [nvarchar](10) NOT NULL,
[FileName] [nvarchar](260) NOT NULL,
[FileContent] [varbinary](max) NULL,
[CreatedOn] [datetime] NOT NULL CONSTRAINT [DF_ORD_ATTACHMENTS_CreatedOn] DEFAULT (getdate())
此 table 没有字段从 CDC 中排除。
提前感谢您的帮助。
此致,
克里斯
2016-09-20 更新15:15:
运行 以下:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Agent XPs', 1;
GO
RECONFIGURE
GO
现在已切换到测试数据库以简化问题。在我的新测试中重新启用 CDC table(字段是 bigint PK 身份字段和 NVARCHAR(50) 可为空字段)。还是行不通。此外,捕获作业在 SQL 服务器代理下没有历史条目。
2016-09-20更新20:09
运行 sp_MScdc_capture_job 在数据库上下文中。根据作业设置,这可以是连续执行的过程。在 运行 之后,在 CDC table 中找到了数据。将尝试弄清楚如何自动进行此操作。
2016-09-28更新17:19
捕获作业的脚本如下:
USE [msdb]
GO
/****** Object: Job [cdc.CDCTest_capture] Script Date: 2016-09-28 5:18:13 PM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [REPL-LogReader] Script Date: 2016-09-28 5:18:13 PM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-LogReader' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-LogReader'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'cdc.CDCTest_capture',
@enabled=1,
@notify_level_eventlog=2,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'CDC Log Scan Job',
@category_name=N'REPL-LogReader',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Starting Change Data Capture Collection Agent] Script Date: 2016-09-28 5:18:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Starting Change Data Capture Collection Agent',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=3,
@on_success_step_id=0,
@on_fail_action=3,
@on_fail_step_id=0,
@retry_attempts=10,
@retry_interval=1,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'RAISERROR(22801, 10, -1)',
@server=N'AECON-SQL',
@database_name=N'CDCTest',
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Change Data Capture Collection Agent] Script Date: 2016-09-28 5:18:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Change Data Capture Collection Agent',
@step_id=2,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=10,
@retry_interval=1,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'sys.sp_MScdc_capture_job',
@server=N'AECON-SQL',
@database_name=N'CDCTest',
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'CDC capture agent schedule.',
@enabled=1,
@freq_type=64,
@freq_interval=0,
@freq_subday_type=0,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20160920,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'd1fc7d85-c051-4b24-af84-5505308caaf0'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
克里斯,
当您在数据库和 table 级别启用 CDC 时,会在 cdc 模式下创建许多其他对象。重要的是各种函数、_CT table 和两个作业 cdc.XXXX_capture & cdc.XXXX_cleanup(其中 XXXX 是数据库的全名)。
根据您目前的描述,尤其是考虑到最新的更新,错误似乎可能与作业本身有关。
一开始,这听起来很明显,但是您在此实例上有 SQL 代理 运行 吗?我只是问,因为你的初始描述中没有提到它。
如果它已经是 运行,那么您需要更深入地学习。
如果您导航到 SQL Agent/Jobs 文件夹(在 SSMS 下),找到捕获作业,右键单击并请求编写脚本,您应该会找到以下内容。
4 次通话:
sp_add_job@job_name=N'cdc.XXXX_capture'
sp_add_job步骤@step_name=N'启动变更数据捕获收集代理'
sp_add_jobstep @step_name=N'Change Data Capture Collection Agent'
sp_add_jobschedule @name=N'CDC 捕获代理计划。'
第二个 sp_add_jobstep 调用是执行您在上面指出的相同代码的那个,@command=N'sys.sp_MScdc_capture_job'。
您可以尝试手动启动作业,看看是否能启动它,或者至少向 _CT 提供一些数据 table。
此外,检查上面的最后一个电话,时间表,sp_add_job时间表。这也应该启用,@freq_type=64(以确保它在代理启动时启动)。
请提供您在回复中找到的结果,以帮助进一步排除故障。
谢谢,
问题原来是 SQL 服务器代理作业不是 运行,尽管 SQL 服务器表明它是。在服务控制台中打开此服务并能够在 CDC 中捕获数据。
特别感谢 LogicalMan,他非常耐心地与我一起完成了所有这一切。
首先是 post,所以我马上开始。预先感谢您的回答和考虑。
我对相关数据库 运行 所在的数据库引擎拥有完全权限,包括系统管理员。
据我所知,我已根据文档正确启用了此功能,并执行了以下操作:
运行 命令
EXEC sys.sp_cdc_enable_db
通过 c# 应用程序 我用它作为一个界面来处理设置、记录、 并比较 DML 数据库更改。来自同一个应用程序,运行 命令
EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'ORD_ATTACHMENTS', @role_name = NULL
我已使用 SELECT [name], database_id, is_cdc_enabled FROM sys.databases
.
我也使用 SELECT [name], is_tracked_by_cdc FROM sys.tables
验证了 table 的准备情况。
运行 SELECT * FROM [msdb].[dbo].[cdc_jobs] WHERE [database_id] = DB_ID()
在数据库上下文中为捕获作业生成以下信息:
最大传输:7200 最大扫描:10 连续:1 轮询间隔:5
保留和阈值为 0。
通过 SSMS 将记录插入有问题的 table 后,相关的 CDC table 尽管存在,但其中没有任何数据。没有遇到任何错误,记录已成功添加到源 table。
附加信息:
- 数据库服务器曾经使用 Windows 纤程(轻量级池化)。我 已将其关闭、重新配置并重新启动服务器。
- 数据库曾经将兼容性设置为 SQL Server 2005 (90),但是 我已将其更新为 SQL Server 2008 (100)。再次重启 服务器。
- 我还将更改跟踪 属性 设置为 true 有问题的数据库,但我后来了解到这是 无关紧要。
源 table 具有以下字段:
[AttachmentID] [bigint] IDENTITY(1,1) NOT NULL,
[ORDNUM] [nvarchar](10) NOT NULL,
[FileName] [nvarchar](260) NOT NULL,
[FileContent] [varbinary](max) NULL,
[CreatedOn] [datetime] NOT NULL CONSTRAINT [DF_ORD_ATTACHMENTS_CreatedOn] DEFAULT (getdate())
此 table 没有字段从 CDC 中排除。
提前感谢您的帮助。
此致, 克里斯
2016-09-20 更新15:15: 运行 以下:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Agent XPs', 1;
GO
RECONFIGURE
GO
现在已切换到测试数据库以简化问题。在我的新测试中重新启用 CDC table(字段是 bigint PK 身份字段和 NVARCHAR(50) 可为空字段)。还是行不通。此外,捕获作业在 SQL 服务器代理下没有历史条目。
2016-09-20更新20:09 运行 sp_MScdc_capture_job 在数据库上下文中。根据作业设置,这可以是连续执行的过程。在 运行 之后,在 CDC table 中找到了数据。将尝试弄清楚如何自动进行此操作。
2016-09-28更新17:19 捕获作业的脚本如下:
USE [msdb]
GO
/****** Object: Job [cdc.CDCTest_capture] Script Date: 2016-09-28 5:18:13 PM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [REPL-LogReader] Script Date: 2016-09-28 5:18:13 PM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-LogReader' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-LogReader'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'cdc.CDCTest_capture',
@enabled=1,
@notify_level_eventlog=2,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'CDC Log Scan Job',
@category_name=N'REPL-LogReader',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Starting Change Data Capture Collection Agent] Script Date: 2016-09-28 5:18:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Starting Change Data Capture Collection Agent',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=3,
@on_success_step_id=0,
@on_fail_action=3,
@on_fail_step_id=0,
@retry_attempts=10,
@retry_interval=1,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'RAISERROR(22801, 10, -1)',
@server=N'AECON-SQL',
@database_name=N'CDCTest',
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Change Data Capture Collection Agent] Script Date: 2016-09-28 5:18:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Change Data Capture Collection Agent',
@step_id=2,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=10,
@retry_interval=1,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'sys.sp_MScdc_capture_job',
@server=N'AECON-SQL',
@database_name=N'CDCTest',
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'CDC capture agent schedule.',
@enabled=1,
@freq_type=64,
@freq_interval=0,
@freq_subday_type=0,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20160920,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'd1fc7d85-c051-4b24-af84-5505308caaf0'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
克里斯,
当您在数据库和 table 级别启用 CDC 时,会在 cdc 模式下创建许多其他对象。重要的是各种函数、_CT table 和两个作业 cdc.XXXX_capture & cdc.XXXX_cleanup(其中 XXXX 是数据库的全名)。
根据您目前的描述,尤其是考虑到最新的更新,错误似乎可能与作业本身有关。 一开始,这听起来很明显,但是您在此实例上有 SQL 代理 运行 吗?我只是问,因为你的初始描述中没有提到它。
如果它已经是 运行,那么您需要更深入地学习。 如果您导航到 SQL Agent/Jobs 文件夹(在 SSMS 下),找到捕获作业,右键单击并请求编写脚本,您应该会找到以下内容。
4 次通话: sp_add_job@job_name=N'cdc.XXXX_capture'
sp_add_job步骤@step_name=N'启动变更数据捕获收集代理'
sp_add_jobstep @step_name=N'Change Data Capture Collection Agent'
sp_add_jobschedule @name=N'CDC 捕获代理计划。'
第二个 sp_add_jobstep 调用是执行您在上面指出的相同代码的那个,@command=N'sys.sp_MScdc_capture_job'。
您可以尝试手动启动作业,看看是否能启动它,或者至少向 _CT 提供一些数据 table。
此外,检查上面的最后一个电话,时间表,sp_add_job时间表。这也应该启用,@freq_type=64(以确保它在代理启动时启动)。
请提供您在回复中找到的结果,以帮助进一步排除故障。
谢谢,
问题原来是 SQL 服务器代理作业不是 运行,尽管 SQL 服务器表明它是。在服务控制台中打开此服务并能够在 CDC 中捕获数据。
特别感谢 LogicalMan,他非常耐心地与我一起完成了所有这一切。