Пару дней назад на работе возникала необходимость в одном из проектов отслеживания изменений в базе данных. Задача такая: есть насколько таблиц, которые нужно мониторить на предмет операций Insert, update и delete. Сначала, решили исползовать аудит, но он не давал нам необходимой информации, такой как с какого на какое значение быль выполнен update или что именно было удалено и т.п. Поискав решения вспомнил о SQL Server СDC (Change Data Capture). Никогда раньше не использовал эту службу и вот что нарыл:
 
use SRPV
go
Активация CDC-функционала для конкретной  базы данных
exec sys.sp_cdc_enable_db
Ппроверяем что значение поля is_cdc_enabled в sys.databases изменилось для БД SRPV. Это признак того что для указанной БД активирована служба CDC.
 
select name, is_cdc_enabled from sys.databases
Активируем CDC для конкретной таблицы (в данном примере это таблица WaggonsSend). Будет созданно 2 job-а. cdc.test_new_capture и cdc.test_new_cleanup
Для добавления таблицы указываем ее имя в @source_name.
 
exec sys.sp_cdc_enable_table 
    @source_schema = 'dbo', 
    @source_name = 'WaggonsSend' ,
    @role_name = 'CDC_Admins',
    @supports_net_changes = 1
Проверяем  таблица установлена источником СDC
  
select name, type, type_desc, is_tracked_by_cdc, * from sys.tables
where name in ('dbo_WaggonsSend')
Просмотр всех объектов созданных для обеспечения функционирования CDC.
select o.name, o.type, o.type_desc, s.name from sys.objects o
 join sys.schemas  s on s.schema_id = o.schema_id
where s.name = 'cdc'
Просмотр изменений в таблице можно просмотреть так:
use SRPV
DECLARE @begin_lsn binary(10), @end_lsn binary(10)
 SET @begin_lsn = sys.fn_cdc_get_min_lsn('dbo_WaggonsSend')
SET @end_lsn   = sys.fn_cdc_get_max_lsn()
select tm.tran_begin_time, 
        tm.tran_end_time, 
        tm.tran_id, 
    CASE __$operation
      when 1 then  'delete'
      when 2 then  'insert'
     when 3 then  'update (before the update)'
     when 4 then  'update (after the update)'
    end operation,
    ch.*
 from cdc.fn_cdc_get_all_changes_dbo_WaggonsSend(@begin_lsn, @end_lsn, 'all update old') ch
left join cdc.lsn_time_mapping tm on ch.__$start_lsn=tm.start_lsn
Просмотр джобов отвечающих за работу CDC (здесь можно просмотреть такие параметры как
 pllinginterval - с какой периодичностью в сек. движок будет сканировать транзакшн лог и заполнять хранилище информации
retention - количество минут сколько будет храниться инфа в хранилище. Отчисткой занимается джоб cdc.test_new_cleanup, запускаемый 1 разв неделю)
 
use msdb
select * from dbo.cdc_jobs
Редактирование этих параметроов
EXEC [sys].[sp_cdc_change_job]
    @job_type = N'capture',
    @pollinginterval = 5  --раз в пять секунд движок CDC будет сканировать транзакшн лог и пополнять хранилище информацией. Делается это джобом cdc.test_new_capture, который запущен всегда, т.е. один раз запущен и находится в статусе Running постоянно.
 
EXEC [sys].[sp_cdc_change_job]
    @job_type = N'cleanup',
    @retention = 10080 --  10080 минут - это 7 дней. Именно столько я установил для хранения истории в хранилище.
Просмотр всех таблиц на которых сконфигурированна CDC в текущей БД
 EXECUTE sys.sp_cdc_help_change_data_capture;
Хранилище это системные таблицы, созданные в процессе конфигурирования CDC. Информацию из можно селектить как с помощью хп cdc.fn_cdc_get_all_changes_dbo_WaggonsSend (синтаксис я указывал выше) так и напрямую
 
 select * from cdc.dbo_WaggonsSend_CT
where bla-bla-bla
А здесь подробнейшая информация на эту тему =))
 
 
Комментариев нет:
Отправить комментарий