
Автор: Mukesh Kumar - MICROSOFT Monitoring CDC using Extended Events in SQL Server 2022
В этой статье очень подробно описывается, как максимально полно контролировать и оперативно устранять проблемы в работе и производительности Change Data Capture (CDC), если использовать сбор расширенных событий xEvents. За работой CDC можно наблюдать с помощью двух расширенных событий CDC, которые появились в SQL Server 2022:
- repl_logscan_session
- cdc_cleanup_job_status
Введение в Change Data Capture
В настоящее время сбор данных об изменениях (CDC) доступен во всех поддерживаемых версиях SQL Server. Он собирает информацию о действиях по вставке, изменению и удалению данных, которые затрагивают отслеживаемые таблицы. Сведения об изменениях делаются доступными в легком для использования реляционном формате. Информация о колонках и метаданные, описывающие применение изменений к отслеживаемой базе данных, собираются в виде записей с изменениями и сохраняются в специальных системных таблицах, которые копируют структуру колонок отслеживаемых таблиц. Для получения информации о сделанных изменениях доступны специальные табличные функции. Получить более подробную информацию обо всём этом можно здесь.
Что отслеживают новые расширенные события MSSQL 2022 для CDC?
- Задание сбора изменений — записывает изменения в системную таблицу сбора изменений.
- Задание по очистке старых данных — удаляет старые данные из таблицы сбора изменений.
- repl_logscan_session - сообщает о ходе работы задания отслеживания изменений.
- cdc_cleanup_job_status - сообщает о ходе работы задания очистки системных таблиц.
Описание расширенного события repl_logscan_session
- Идентификатор сеанса CDC
- Текущая фаза сеанса***
- чтение конфигурации
- создание хэш-таблицы
- частичный откат
- EOR,
- частичный откат и EOR
- версия схемы
- последнее сканирование
- Фазовое состояние отражает начальную фазу = 0 и конечную фазу = 1
- Максимальное количество транзакций для обработки в каждом цикле сканирования max_trans (int), по умолчанию равно 500. Если указано иное, это значение должно быть положительным целым числом.
- Количество команд, обработанных в фазе 7 (последнее сканирование за сеанс)
- Количество обработанных (реплицированных или отслеживаемых) транзакций, установленное на этапе 2, после чего остаётся неизменным.
- Количество просмотренных записей журнала, доступных на этапе 2, после чего остается неизменным.
- Количество обнаруженных операций DDL для изменений в схемах RE, SE и статьи.
- Время начала сканирования журнала.
- Начальный LSN для текущего сеанса, доступен после начала фазы 2
- Конечный LSN для сеанса, доступен после окончания фазы 2
- LSN, который был отсканирован, доступный после окончания фазы 2, затем сохраняется без изменений.
- Самый ранний номер LSN в этом сеансе CDC, доступен на этапе 7, в противном случае 00000000:00000000:0000
- Последний обработанный номер LSN этого сеанса CDC, доступен на этапе 7, в противном случае 00000000:00000000:0000.
Фазы репликации и CDC
- Чтение конфигурации
- Первое сканирование, построение хэш-таблицы
- Второе сканирование (частичный откат)
- Второе сканирование (ошибки)
- Второе сканирование (ошибки частичного отката)
- Управление версиями схемы
- Последнее сканирование
- Завершение
Описание расширенного события CDC_cleanup_job_status
- Количество строк, удаленных из таблицы изменений.
- Идентификатор объекта таблицы изменений
- Номер обнаруженного сообщения об ошибке.
- Номер low_water_mark LSN (который идентифицирует строки, подлежащие очистке)
- Количество строк, удаленных из таблицы LSN_Time_Mapping.
- Время хранения до очистки (время в минутах для хранения в CT-таблице)
- Пороговое значение задания на очистку (размер пачки удаления)
Мониторинг CDC с помощью событий
- Настройка CDC.
- CDC с простыми вставками
- Процесс очистки в CDC
- CDC во время частичного отката
- CDC во время длительной очистки
Настройка CDC
GO
--Enable CLR
EXEC sp_configure 'clr enabled' , '1';
RECONFIGURE;
--Ensure CLR was enabled:
EXEC sp_configure 'clr enabled';
GO
Create database MyDB;
GO
--Size the database for testing
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 102400KB , FILEGROWTH = 256000KB )
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB_log', SIZE = 307200KB , FILEGROWTH = 256000KB )
GO
CDC с простыми вставками
USE MyDB;
GO
CREATE TABLE T1(
C1 BIGINT PRIMARY KEY,
C2 NVARCHAR(22));
--Ensure tables were generated
SELECT * from sysobjects where type = 'U';
-- Enable Database for CDC template
exec sp_changedbowner [sa]
-- ====
USE MyDB
GO
EXEC sys.sp_cdc_enable_db ;
GO
-- =========
-- Enable sample Tables for CDC
-- =========
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'T1',
@role_name = NULL,
@supports_net_changes = 1
GO
--verify cdc tables have been generated.
use myDB;
select * from cdc.dbo_T1_CT;
select * from sysobjects where type = 'U';
--check target table
select * from T1;
USE master;
GO
--Update filename and path as appropriate
CREATE EVENT SESSION [cdc_test] ON SERVER
ADD EVENT sqlserver.repl_logscan_session
ADD TARGET package0.event_file(SET filename = N'C:\output\xevents\cdc_test_event.xel')
WITH (STARTUP_STATE=OFF)
GO
Примечание: мы еще не запустили очистку и не вносили никаких изменений, поэтому мы просто увидим события сканирования журнала с поиском изменений.
Примечание: измените ограничение cnt1 на желаемое количество строк (в примере ниже установлено значение 255).
--Start with the next row count and load table
--with ascii character rows
--Replace 255 with desired number of rows.
--Note: arithmetic overflow at 1000000000 for
--int conversion so limit max rows.
--
use myDB;
DECLARE @cnt INT,
@cnt1 INT
select @cnt= (select count(*) from T1)+1;
select @cnt1= (select count(*) from T1)+255;
WHILE @cnt < @cnt1
BEGIN
INSERT INTO T1
VALUES (@cnt, char(@cnt));
SET @cnt = @cnt + 1;
- LSN 0000004A:00008CB8:0001 в начале транзакции (first_begin_cdc_lsn)
- Выполнено 254 команды (изменения DML) (транзакция завершена)
- LSN 0000004A:000094A0:0003 после завершения транзакции (last_commit_lsn)
- В фазе 2 (сборка с использованием хэш-таблицы) было использовано 760 записей журнала без откатов, ошибок или частичных фиксаций, а также без изменений версии схемы.
Процесс очистки CDC
EXECUTE sys.sp_cdc_change_job
_type = N'cleanup',
@retention = 3 --three-minute retention
GO
На практике, срок хранение будет более длительным, например, 3 дня по умолчанию (4320 минут), или еженедельно, или ежемесячно, или ежеквартально. 3 минуты на очистку таблицы изменений мы выставили для удобства демонстрации, только и всего. После завершения работы задания по очистке, таблица изменений должна быть полностью очищена. После завершения этой демонстрации обязательно установите порог хранения для задания очистки на подходящую для ваших задач величину.
CDC с частичным откатом
- Начнём транзакцию с помощью begin trans.
- Запустите команду DML для обновления тестовой таблицы.
- Создадим точку сохранения.
- Выполним ещё команды DML.
- Откатим все несохраненные транзакции
- Начните другую транзакцию с другим begin trans.
- Выполним ещё команды.
- Выполним фиксацию транзакции.
- Запустите еще одну транзакцию и зафиксируйте её, чтобы очистить первоначальную транзакцию.
Примечание: если вы повторяете сценарии из этой статьи, при необходимости подберите правильное для вашего теста значение для вставляемого числа строк, таблица T1 во время моего теста содержала 819 строк.
--Check last row and beyond
select *from T1 where C1 > 819;
select * from cdc.dbo_T1_CT;
-------
BEGIN TRAN;
INSERT INTO T1 VALUES (820, 'A');
PRINT 'A';
SAVE TRANSACTION FirstInsert
select @@TRANCOUNT
INSERT INTO T1 VALUES (821, 'B');
PRINT 'B';
INSERT INTO T1 VALUES (822, 'C');
PRINT 'C';
GO
--Roll them back
ROLLBACK TRANSACTION FirstInsert
select @@TRANCOUNT
BEGIN TRAN; --2
INSERT INTO T1 VALUES (823, 'D');
PRINT 'D';
COMMIT --2
select @@TRANCOUNT
PRINT 'Commit 2';
INSERT INTO T1 VALUES (824, 'E');
PRINT 'E';
PRINT 'Commit E';
--Note this would also work if we just executed another
--commit, but the demo just looks better ending with
--a command.
select @@TRANCOUNT
select * from T1 where C1 > 819;
select * from cdc.dbo_T1_CT;
select * from cdc.dbo_T1_CT;
CDC во время длительной работы задания очистки
CREATE EVENT SESSION [cdc_clean__up_job_test] ON SERVER
ADD EVENT sqlserver.cdc_cleanup_job_status
ADD TARGET package0.event_file(SET filename=N'C:\output\xevents\cdc_clean__up_job_test_event.xel')
WITH (STARTUP_STATE=OFF)
GO
Примечание: эта сессия начнёт показывать собранные данные только после того, как будет в очередной раз запущено задание по очистке CDC.
CREATE TABLE T3(
C1 BIGINT PRIMARY KEY,
C2 NVARCHAR(100) NULL);
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'T3',
@role_name = NULL,
@supports_net_changes = 1
GO
USE myDB;
--Start with the next row count and load table with ascii character rows
--Note: arithmetic overflow at 1000000000 for int conversion --so don't go that far.
DECLARE @cnt INT,
@cnt1 INT
select @cnt= (select count(*) from T3)+1;
select @cnt1= (select count(*) from T3)+5500000;
WHILE @cnt < @cnt1
BEGIN
INSERT INTO T3
VALUES (@cnt, '500000');
SET @cnt = @cnt + 1;
END;
Помните, что retention level составлял 3 минуты, и мы ждали 3 минуты перед запуском очистки, поэтому таблица CDC должна быть пустой.
select count(*) from T3;
select count(*) from cdc.dbo_T3_CT;
Комментариев нет:
Отправить комментарий