CDC в SS 2008 R2 не собирает данные, но и ошибок нет

Первый пост, так что сразу к делу. Заранее благодарю за ответы и внимание.

У меня есть полные права на механизм базы данных, на котором работает рассматриваемая БД, включая sysadmin.

Насколько мне известно, я правильно включил это в соответствии с документацией, выполнив следующие действия:

  1. Выполнение команды EXEC sys.sp_cdc_enable_db через приложение С#, которое я использую в качестве интерфейса для настройки, записи и сравнения изменений базы данных DML.

  2. Из того же приложения, выполнив команду

    EXEC sys.sp_cdc_enable_table 
    @source_schema = N'dbo', 
    @source_name   = N'ORD_ATTACHMENTS', 
    @role_name     = NULL
    

Я проверил, что рассматриваемая БД готова для CDC, используя SELECT [name], database_id, is_cdc_enabled FROM sys.databases.

Готовность стола я также проверял с помощью SELECT [name], is_tracked_by_cdc FROM sys.tables.

Запуск SELECT * FROM [msdb].[dbo].[cdc_jobs] WHERE [database_id] = DB_ID() в контексте базы данных дает следующую информацию для задания захвата:

maxtrans: 7200 maxscans: 10 непрерывный: 1 pollinginterval: 5

удержание и порог равны 0.

После вставки записей в рассматриваемую таблицу через SSMS связанная таблица CDC, хотя и присутствует, не содержит никаких данных. Ошибок не обнаружено, и запись успешно добавлена ​​в исходную таблицу.

Дополнительная информация:

  1. Сервер базы данных, используемый для использования волокон Windows (облегченный пул). Я отключил это, перенастроил и перезагрузил сервер.
  2. Раньше для базы данных была установлена ​​совместимость с SQL Server 2005 (90), но я обновил ее до SQL Server 2008 (100). Снова перезагрузил сервер.
  3. Я также установил для свойства отслеживания изменений значение true для рассматриваемой базы данных, но с тех пор я узнал, что это не имеет значения.

Исходная таблица имеет следующие поля:

[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())

Для этой таблицы из CDC не исключаются поля.

Заранее благодарим вас за любую помощь.

С уважением, Крис.

Обновление 20.09.2016, 15:15. Запустил следующее:

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'Agent XPs', 1;  
GO  
RECONFIGURE  
GO  

Теперь перешли на тестовую БД, чтобы упростить дело. Повторно включил CDC в моей новой тестовой таблице (поля — это поле идентификатора bigint PK и поле NVARCHAR (50), допускающее значение NULL). До сих пор не работает. Кроме того, задание захвата не имеет записей истории в агенте SQL Server.

Обновление 20.09.2016, 20:09 Запустил sp_MScdc_capture_job в контексте БД. Это может быть, в зависимости от настроек задания, непрерывно выполняемой процедурой. Данные были найдены в таблице CDC при запуске. Попытаюсь выяснить, как автоматически задействовать это.

Обновление 28.09.2016, 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

person C. Philp    schedule 20.09.2016    source источник


Ответы (2)


Крис,

Когда вы включаете CDC на уровне БД и таблицы, под схемой CDC создается ряд дополнительных объектов. Важны различные функции, таблица _CT и два задания cdc.XXXX_capture и cdc.XXXX_cleanup (где XXXX — полное имя базы данных).

Судя по вашему описанию, особенно с учетом последнего обновления, ошибка, возможно, связана с самими заданиями. Вначале это может показаться очевидным, но работает ли на этом экземпляре агент SQL? Я спрашиваю только потому, что это не упоминается в вашем первоначальном описании.

Если он уже запущен, то вам нужно будет немного углубиться. Если вы перейдете в папку SQL Agent/Jobs (в SSMS), найдите задание захвата, щелкните правой кнопкой мыши и запросите его сценарий, вы должны найти следующее.

4 вызова: sp_add_job @job_name=N'cdc.XXXX_capture'

sp_add_jobstep @step_name=N'Запуск агента сбора измененных данных'

sp_add_jobstep @step_name=N'Изменить агент сбора данных'

sp_add_jobschedule @name=расписание агента захвата N'CDC.'

Второй из этих вызовов sp_add_jobstep — это тот, который выполняет тот же код, который вы указали выше, @command=N'sys.sp_MScdc_capture_job'.

Вы можете попытаться запустить задание вручную, чтобы увидеть, запустит ли оно его в жизнь или, по крайней мере, предоставит некоторые данные в таблицу _CT.

Кроме того, проверьте последний из этих вышеприведенных вызовов, расписание sp_add_jobschedule. Это также должно быть включено с @freq_type=64 (чтобы обеспечить его запуск при запуске агента).

Предоставьте результаты того, что вы нашли в ответе, чтобы помочь в дальнейшем устранении неполадок.

Спасибо,

person LogicalMan    schedule 21.09.2016
comment
Привет LogicalMan. Спасибо, что вернулись ко мне. Я смог запустить это вручную. Второй шаг задания (запуск агента сбора измененных данных) имеет значение N'RAISERROR(22801, 10, -1)' для параметра команды. Третий шаг (изменение агента сбора данных) имеет значение N'sys.sp_MScdc_capture_job' для параметра команды. Еще раз спасибо. - person C. Philp; 23.09.2016
comment
Кроме того, забыл добавить, что freq_type действительно равен 64. С уважением, - person C. Philp; 23.09.2016
comment
Никаких проблем C Philp, CDC может быть настоящим кошмаром, я внедряю его с 2008 года, и это может быть несколько чревато. Особенно, когда вы углубляетесь в это! Любые другие вопросы, просто спросите, это то, для чего мы все здесь :) - person LogicalMan; 23.09.2016
comment
Спасибо, Логический Человек. Правильно ли значение N'RAISERROR(22801, 10, -1)' для параметра команды для задания "Запуск агента сбора измененных данных"? - person C. Philp; 26.09.2016
comment
Да, Крис, здесь записано действие по запуску CDC. Вы можете проверить вывод этого, введя эту команду в запрос SSMS, и вы увидите следующее сообщение: Запуск задания агента сбора изменений данных. Чтобы сообщить о ходе операции, запросите представление динамического управления sys.dm_cdc_log_scan_sessions. Суть работы содержится внутри шага 2, как мы обсуждали выше. Надеюсь, это поможет. - person LogicalMan; 27.09.2016
comment
Еще раз спасибо LogicalMan. CDC не собирает данные, пока я сначала не запущу все вручную с помощью sp_MScdc_capture_job. есть идеи? - person C. Philp; 27.09.2016
comment
Итак, как только вы запускаете это вручную, оно работает без проблем? Если это так, то это действительно указывает на саму работу. Все, что он делает, это отключает этот SProc, а затем все идет своим чередом, используя 5-секундный цикл ожидания для опроса различных экземпляров. Можете ли вы просто запустить задание вручную, чтобы получить тот же эффект? Каковы последствия этого? - person LogicalMan; 28.09.2016
comment
Привет, Логичный Человек. Я полагаю, что мог бы запустить задание вручную, но я надеялся, что это произойдет автоматически для пользователя, поскольку это должно было быть приложением, экономящим время и работу, которое я создаю. Как только задание запущено, все работает нормально в том, что касается заполнения таблиц CDC. - person C. Philp; 28.09.2016
comment
Хорошо, тогда Крис. Вы вообще проверяли график работы? Он должен запускаться при запуске SQL (64). У меня такое ощущение, что если это единственный триггер, то процесс создания нового экземпляра CDC в БД должен запустить его. Хотя не уверен, что с этим происходит. Тони - person LogicalMan; 28.09.2016
comment
Привет, Тони! См. обновленный полный список сценариев работы выше. Параметр freq_type равен 64 для запланированного задания агента захвата CDC. Еще раз спасибо. - person C. Philp; 29.09.2016
comment
Я также запускал EXEC sys.sp_cdc_start_job @job_type = 'capture' в контексте БД. Это дало следующее сообщение: SQLServerAgent в настоящее время не запущен, поэтому его нельзя уведомить об этом действии. Однако, когда я запустил это: EXEC sp_configure 'показать дополнительные параметры', 1; ПЕРЕКОНФИГУРИРОВАТЬ; EXEC sp_configure «Опыты агента», 1; RECONFIGURE; сообщения были такими: Параметр конфигурации «показать дополнительные параметры» изменен с 1 на 1. Запустите оператор RECONFIGURE для установки. Параметр конфигурации «Agent XPs» изменен с 1 на 1. Для установки выполните инструкцию RECONFIGURE. Возможно, требуется перезагрузка? - person C. Philp; 29.09.2016
comment
Крис, это выглядит многообещающе. Как вы знаете, работа начинается с запуска агента SQL, и мне интересно, может ли перезагрузка выполнить эту работу. У вас есть агент SQL для автоматического запуска? Привет, Тони - person LogicalMan; 29.09.2016

Проблема оказалась в том, что задание агента SQL Server не выполнялось, хотя SQL Server указал, что оно запущено. Включил эту службу в консоли служб и смог записывать данные в CDC.

Отдельное спасибо LogicalMan, который очень терпеливо работал со мной во всем этом.

person C. Philp    schedule 02.11.2016