¡Hola, chicos!
En esta publicación, le demostraré cómo monitorear y auditar los cambios de datos en tablas usando Change Data Capture (CDC) en SQL Server. ya habia escrito el post SQL Server: cómo crear un historial de cambios de datos para sus tablas (registros de auditoría), que utiliza la función de desencadenadores de tabla para realizar esta tarea, pero me gustaría mostrar una solución más sólida (y menos manual), que está disponible desde SQL Server 2008 (Enterprise, Developer y Trial – Gracias por el consejo, Fabio Colli) y desde SQL Server 2016 SP1 en adelante también estuvo disponible en la edición Standard. En Azure SQL Database, se admite desde el nivel S3 en adelante.
Ampliamente utilizado en tablas que sufren cambios y que requieren auditorías y registros de cambios, CDC permite crear un historial de cambios de datos realizados en una tabla, todo de forma automática y sin necesidad de crear disparadores ni nada por el estilo. Con esta excelente característica, podemos identificar inserciones de datos, cambios (datos antes y después de la actualización) y datos eliminados de la tabla, así como cambios estructurales (DDL) realizados en las tablas monitoreadas.
Una vez que se activa esta característica en una tabla, se creará una nueva tabla espejo, con las mismas columnas que la tabla original y algunas columnas de metadatos más para controlar los cambios realizados en la tabla original. Esta nueva tabla, que se creará automáticamente, acepta consultas normales (SELECT) sobre sus datos. Vale la pena señalar que el monitoreo permanece activo, incluso después de reiniciar el servicio.
La captura de datos modificados (CDC) tiene un impacto bajo en la base de datos, ya que funciona a través de un trabajo del Agente SQL (un trabajo para cada base de datos que tiene CDC habilitado) que lee el registro de transacciones de forma asincrónica y almacena los cambios en la tabla de historial. Por este motivo, el modelo de recuperación de la base de datos se cambia automáticamente a COMPLETO si está en SIMPLE.
¿Qué bases de datos tienen CDC activos?
Ver contenido
Para verificar qué bases de datos en su instancia tienen Change Data Capture (CDC) activo, puede consultar la información en la vista del sistema sys.bases de datos.
SELECT [name], is_cdc_enabled
FROM sys.databases
Ejemplo:
¿Qué mesas están siendo monitoreadas con CDC?
Ver contenido
Para verificar qué tablas en una base de datos determinada tienen activa la función CDC, simplemente realice una consulta en la vista del sistema sys.tables, como se muestra en el siguiente ejemplo:
SELECT [name], is_tracked_by_cdc
FROM sys.tables
Ejemplo:
Cómo habilitar CDC en una base de datos (Nivel 1)
Ver contenido
El control de captura de datos modificados (CDC) se realiza a nivel de base de datos. Para activar CDC, utilizará el procedimiento almacenado del sistema. sys.sp_cdc_enable_db.
Ejemplo de uso:
USE [dirceuresende]
GO
EXEC sys.sp_cdc_enable_db
GO
Resultado:
Una vez que CDC se haya activado en la instancia, puede verificar que se creará un esquema “cdc” en la base de datos en cuestión:
Además, algunas tablas del sistema se crearon utilizando el esquema "cdc":
Las tablas creadas por CDC son:
cdc.captured_columns: Esta tabla del sistema enumerará todas las columnas de las tablas que tienen CDC habilitado. Esta información también se puede consultar utilizando el SP del sistema sys.sp_cdc_get_source_columns.
cdc.change_tables: Esta tabla del sistema enumerará todas las tablas que tienen CDC habilitado. Esta información también se puede consultar utilizando el SP del sistema sys.sp_cdc_help_change_data_capture.
cdc.ddl_historia: Esta tabla del sistema almacenará todos los cambios de DDL realizados en las tablas que tienen CDC habilitado. Esta información también se puede consultar utilizando el SP del sistema sys.sp_cdc_get_ddl_history.
cdc.index_columns: Esta tabla almacena información sobre los índices asociados con tablas que tienen CDC habilitado. Esta información también se puede consultar utilizando el SP del sistema sys.sp_cdc_help_change_data_capture.
cdc.lsn_time_mapping: Devuelve una fila por cada transacción en la tabla con CDC habilitado. Esta tabla se utiliza para asignar los valores confirmados entre el número de secuencia de registro (LSN) y el momento en que se confirma la transacción. Esta información también se puede recuperar con las funciones sys.fn_cdc_map_lsn_to_time y sys.fn_cdc_map_time_to_lsn.
Cómo habilitar CDC y monitorear cambios en la tabla (Nivel 2)
Ver contenido
Para comenzar a monitorear tablas y comenzar a almacenar el historial de cambios de datos (DML) y estructura (DDL), necesitará usar System SP sys.sp_cdc_enable_table.
Ejemplo de uso:
USE [dirceuresende]
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Clientes',
@role_name = NULL
GO
Resultado:
Después de ejecutar el SP anterior, se habilitó el monitoreo de captura de datos modificados (CDC) en la tabla deseada. Con esto se creará una nueva tabla, en el formato cdc.schema_tabela_CT, con las mismas columnas que la tabla original y algunas tablas de metadatos más para controlar el cambio.
Si desea monitorear los cambios en columnas específicas y no en todas las columnas de la tabla, puede usar esta sintaxis:
USE [dirceuresende]
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Clientes',
@role_name = NULL,
@captured_column_list = '[Id], [Nome], [Teste]'
GO
Ahora, hagamos algunos cambios en la tabla para ver cómo se comporta CDC.
Entrada de datos
Actualización de datos
Eliminación de datos
Truncar datos de la tabla
Como puede ver en la captura de pantalla a continuación, una vez que CDC se activa en una tabla, no podrá truncar los datos en una tabla.
Cambiar la estructura de la tabla
Como puedes ver, la columna __$operación nos permite identificar el tipo de operación realizada sobre la mesa, en la cual los valores posibles son:
1: BORRAR
2: INSERTAR
3: Valor ANTES DE ACTUALIZAR
4: Valor DESPUÉS DE LA ACTUALIZACIÓN
Recuerde habilitar CDC en el nivel de la base de datos antes de intentar habilitar CDC en una tabla. Si no hace esto, encontrará este mensaje de error:
Mensaje 22901, Nivel 16, Estado 1, Procedimiento sp_cdc_enable_table, Línea 39 [Línea 2 de inicio de lote]
La base de datos 'dirceuresende' no está habilitada para la captura de datos modificados. Asegúrese de que esté configurado el contexto de base de datos correcto y vuelva a intentar la operación. Para informar sobre las bases de datos habilitadas para la captura de datos modificados, consulte la columna is_cdc_enabled en la vista de catálogo sys.databases.
¿Qué empleos son estos creados por los CDC?
Ver contenido
Como pudiste ver en el tema “Cómo activar CDC y monitorear cambios en tablas”, al activar CDC en una tabla automáticamente se creaban 2 trabajos (si activas CDC en otras tablas se seguirán usando los mismos 2 trabajos, es decir, se crean 2 trabajos por base de datos monitoreada y no por tabla):
Y estos 2 trabajos tienen el siguiente propósito:
cdc.dirceuresende_capture: Trabajo que se ejecuta cada vez que el Agente SQL Server inicia y ejecuta el SP del sistema sys.sp_MScdc_capture_job, que a su vez ejecuta el SP sys.sp_cdc_scan, comenzando a monitorear la mesa.
cdc.dirceuresende_cleanup: Trabajo que se ejecuta diariamente a las 02:00 y tiene como finalidad controlar el tamaño de las tablas de control CDC, para evitar que crezcan descontroladamente. Este trabajo ejecuta el sistema SP sys.sp_MScdc_cleanup_job,
que a su vez ejecuta el SP sys.sp_cdc_cleanup_job_internal.
Una pregunta muy común para quienes quieren implementar los CDC es sobre la retención de datos. ¿Estos datos crecerán infinitamente, sin límite?
A esta pregunta, la respuesta es NO. De forma predeterminada, los datos crecerán hasta alcanzar el límite predeterminado de SQL Server (4320 minutos = 3 días), lo que podría ser mucho o poco dependiendo de sus necesidades.
Si desea cambiar el tiempo de retención, puede utilizar el procedimiento almacenado sys.sp_cdc_change_job:
EXEC sp_cdc_change_job
@job_type='cleanup',
@retention=10080 -- 7 dias (quantidade de minutos de retenção)
El valor máximo para este parámetro de retención es 52494800 minutos (100 años), pero si desea deshabilitar este límite, simplemente deshabilite el trabajo de limpieza (cdc.dirceuresende_cleanup)
Para ver los parámetros de retención actuales, utilice la siguiente consulta:
SELECT
[retention],
([retention]) / ((60 * 24)) AS RetentionInDays,
*
FROM
msdb.dbo.cdc_jobs;
Resultado:
Cómo deshabilitar CDC en una base de datos (Nivel 1)
Ver contenido
Si desea deshabilitar CDC para una base de datos, simplemente use el SP del sistema sys.sp_cdc_disable_db.
Ejemplo:
USE [dirceuresende]
GO
EXEC sys.sp_cdc_disable_db
GO
Resultado:
Vale la pena recordar que cuando deshabilita CDC en el nivel de la base de datos, TODOS los monitoreos CDC activos en el nivel de la tabla también se deshabilitarán y todos los datos históricos también se perderán (y NO se le cambiará acerca de la existencia de estos monitoreos activos en el nivel de la tabla).
Cómo deshabilitar CDC en una mesa (Nivel 2)
Ver contenido
Para deshabilitar CDC para una tabla específica, primero deberá identificar el nombre de la instancia de captura de CDC usando SP sys.sp_cdc_help_change_data_capture o consultando cdc.change_tablesy luego desactivar la monitorización con SP sys.sp_cdc_disable_table.
Vale la pena recordar que es posible deshabilitar CDC a nivel de base de datos, incluso si hay un monitoreo activo a nivel de tabla (y NO se le alertará sobre la existencia de este). Al final de este tema dejé algunas advertencias sobre lo que sucede cuando haces esto. ¡Lee hasta el final!
Identificación del nombre de la instancia de captura de CDC:
USE [dirceuresende]
GO
EXEC sys.sp_cdc_help_change_data_capture
GO
SELECT OBJECT_NAME([object_id]), OBJECT_NAME(source_object_id), capture_instance
FROM cdc.change_tables
Resultado:
Una vez que hemos identificado el nombre de la instancia (dbo_Clientes), ya podemos ejecutar el sys.sp_cdc_disable_table para desactivar efectivamente CDC en esta tabla:
USE [dirceuresende]
GO
EXEC sys.sp_cdc_disable_table
@source_schema = 'dbo', -- sysname
@source_name = 'Clientes', -- sysname
@capture_instance = 'dbo_Clientes' -- sysname
Resultado:
Después de deshabilitar CDC en la tabla, puede ver que la tabla de monitoreo se eliminó automáticamente. TEN MUCHO CUIDADO con esto, para no perder los valores registrados y perder tu historial. Si desea deshabilitar CDC pero no tiene intención de perder el historial, copie los datos de la tabla de historial a otra tabla antes de deshabilitar CDC en la tabla.
Vale la pena recordar que al desactivar CDC a nivel de base de datos, TODOS los monitoreos de CDC activos a nivel de tabla también se desactivarán y también se perderán todos los datos históricos.
Operaciones de captura de datos modificados (CDC) y copia de seguridad/restauración
Ver contenido
Como CDC es una característica interna de SQL Server que crea metadatos y trabajos para realizar algunas actividades, es posible que operaciones como la copia de seguridad/restauración no se comporten exactamente como se espera en determinadas situaciones.
Restaurando la misma base de datos, en la misma instancia
En esta situación, la restauración se realizará normalmente y el CDC seguirá activo y funcionando después de restaurar la base. Nada cambia.
Restaurar la copia de seguridad en la misma instancia pero con un nombre de base de datos diferente o en otra instancia
En ambos casos, CDC se desactivará y la información de metadatos grabada se perderá, lo que sería muy malo. Para evitar que esto suceda, debe utilizar el parámetro keep_cdc en el comando de restauración.
Ejemplo:
RESTORE DATABASE
[dirceuresende]
FROM
DISK = 'C:\Backups\dirceuresende.bak'
WITH
MOVE 'dirceuresende_dados' TO 'C:\Dados\dirceuresende_dados.mdf',
MOVE 'dirceuresende_log' TO 'C:\Dados\dirceuresende_log.ldf',
KEEP_CDC
Después de la restauración, deberá ejecutar los siguientes comandos para recrear los trabajos de CDC:
USE [dirceuresende]
GO
exec sys.sp_cdc_add_job 'capture'
GO
exec sys.sp_cdc_add_job 'cleanup'
GO
¡Eso es todo, amigos!
¡Espero que te haya gustado este post y que te pueda ser útil!
Un abrazo y ¡hasta la próxima!
Dirceu Resende
Arquitecto de Bases de Datos y BI · Microsoft MVP · MCSE, MCSA, MCT, MTA, MCP.
Comentários (0)
Carregando comentários…