sql >> Base de Datos >  >> RDS >> Sqlserver

Bases de datos del sistema SQL Server:mantenimiento de MSDB

En los artículos anteriores de la serie Bases de datos del sistema de SQL Server, analizamos las bases de datos del sistema que se instalan de forma predeterminada durante la instalación de SQL Server, comprendimos el propósito de cada una de esas bases de datos del sistema y exploramos la base de datos Tempdb y su mantenimiento con más detalle. En este artículo, exploraremos la base de datos MSDB con más detalle junto con los problemas más frecuentes relacionados con la base de datos MSDB y cómo resolverlos de la manera correcta.

La base de datos MSDB

El MSDB La base de datos del sistema de SQL Server almacena toda la información de configuración crítica y la información histórica relacionada con el servicio del agente de SQL Server, el agente de servicio de SQL Server, el correo de la base de datos, el envío de registros, la creación de reflejo de la base de datos, etc.:

  • Servicio del Agente SQL Server
    • Trabajos del Agente SQL Server:datos de configuración y detalles del historial
    • Alertas del Agente SQL Server:datos de configuración
    • Operadores del Agente SQL Server:datos de configuración
    • Proxies del Agente SQL Server:datos de configuración
    • Información relacionada
  • Correo de base de datos de SQL Server, incluido Service Broker:datos de configuración y detalles de registro de correo histórico.
  • Detalles de copia de seguridad y restauración de SQL Server:datos históricos de todos los eventos de copia de seguridad y restauración de la base de datos que ocurren en la instancia de SQL Server.
  • Planes de mantenimiento, paquetes SSIS e información relacionada:datos de configuración, datos relacionados y datos sobre la ejecución de todos estos elementos a través de trabajos del Agente SQL Server.
  • Configuraciones de envío de registros, perfiles de agentes de replicación, trabajos de recopiladores de datos:datos de configuración de todas las técnicas de alta disponibilidad mencionadas.

Siempre que se modifique alguna de las configuraciones críticas anteriores, se recomienda realizar una revisión Completa. copia de seguridad de la base de datos MSDB para evitar cualquier pérdida de datos si ocurre una falla.

Aunque el Servicio del Agente SQL Server almacena detalles de configuración críticos en tablas en MSDB base de datos, SQL Server también almacena algunos detalles de configuración en el Registro de Windows. Para eso, utiliza el procedimiento almacenado extendido llamado sp_set_sqlagent_properties .

Echemos un vistazo rápido a la ubicación del Registro donde SQL Server almacena las configuraciones del Servicio del Agente SQL Server. Importante :Esto es solo para fines de aprendizaje y no recomendamos cambiar ningún valor de configuración. De lo contrario, podría terminar en errores extraños relacionados con el servicio del Agente SQL Server.

Abra el Editor del Registro escribiendo regedit en el símbolo del sistema:

Haz clic en Entrar para abrir el Editor del Registro :

Ahora, navegue hasta la ruta:

Equipo\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.MSSQLSERVER\SQLServerAgent

Vea los detalles de configuración a continuación. El fragmento marcado se refiere al nombre de la instancia de SQL Server y puede variar en su entorno según la versión de SQL Server y el nombre de la instancia.

Una mirada rápida al registro indica que hay ciertos parámetros almacenados relacionados con el servicio del Agente SQL Server. Dado que no recomendamos cambiar ningún parámetro relacionado con el Servicio del Agente SQL Server y compartido anteriormente solo con fines de aprendizaje, no profundizaremos en ello aquí.

Sin embargo, si tiene la intención de cambiar cualquiera de las propiedades del Servicio del Agente SQL Server para cumplir con los requisitos comerciales o de producción, puede modificarlo haciendo clic con el botón derecho en el Servicio del Agente SQL Server y seleccionando Propiedades. como se muestra a continuación.

Aunque hay muchos parámetros disponibles relacionados con el servicio del Agente SQL Server y el alcance de este artículo está relacionado con la base de datos msdb, los excluí y cubrí solo las opciones específicas de la base de datos msdb haciendo clic en el menú Historial como se muestra a continuación, donde puede configurar el tamaño de los registros del historial de trabajos y el historial del agente.

Problemas frecuentes en la base de datos MSDB

En cualquier instancia de producción de SQL Server, tendremos una gran cantidad de trabajos del Agente SQL Server, correos electrónicos de bases de datos, planes de mantenimiento y copias de seguridad completas/transaccionales habilitadas. Dependiendo del nro. de bases de datos en la instancia o el no. de los trabajos del Agente SQL Server disponibles, o el uso del correo electrónico de la base de datos, nuestro servidor SQL comenzará a registrar la información del historial de todas las funciones habilitadas, lo que aumentará el tamaño de la MSDB base de datos. Si no se mantiene adecuadamente, esto afectará el rendimiento de la base de datos MSDB y las operaciones relacionadas con eso.

Revisemos las funciones discutidas anteriormente y las tablas utilizadas para almacenar datos de historial para comprender cómo podemos mantener el tamaño de esas tablas bajo control.

  • Historial de copias de seguridad
  • Historial de trabajos del Agente SQL Server
  • Planes de mantenimiento
  • Historial de correo de la base de datos de SQL Server
  • Paquetes SSIS

Para averiguar qué tablas de la base de datos MSDB ocupan más espacio, podemos utilizar los Informes de uso de disco por tablas principales que viene como parte de los informes predeterminados de SQL Server en SQL Server Management Studio.

Abra SSMS y haga clic derecho en MSDB base de datos> Informes > Informes estándar > Uso de disco por tablas principales para generar el informe de tablas ordenadas por uso de disco:

Haga clic en Uso de disco por tablas principales para ver el informe. Como mi instancia es de desarrollo, no hay tablas enormes, pero este informe puede mostrar el tamaño de todas las tablas en una base de datos ordenadas en orden descendente.

También podemos usar la siguiente consulta para obtener los tamaños de las tablas dentro de una base de datos.

SELECT -- TOP(10)
	  SCHEMA_NAME(o.[schema_id]) Schema_name
	, o.name object_name
    , total_size = CAST(SUM(au.total_pages) * 8. / 1024 AS DECIMAL(18,2))
    , total_rows = SUM(CASE WHEN i.index_id IN (0, 1) AND au.[type] = 1 THEN p.[rows] END)
FROM sys.objects o 
JOIN sys.indexes i ON o.[object_id] = i.[object_id]
JOIN sys.partitions p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
JOIN sys.allocation_units au ON p.[partition_id] = au.container_id
WHERE i.is_disabled = 0
AND i.is_hypothetical = 0
AND o.Type in ('S','U','V')
GROUP BY o.name, SCHEMA_NAME(o.[schema_id])
ORDER BY 3 DESC

Una vez que sabemos qué tablas ocupan más espacio, podemos usar los procedimientos almacenados relacionados para mantener su tamaño bajo control.

Historial de copias de seguridad

La responsabilidad principal del DBA es garantizar que las copias de seguridad completas y los registros transaccionales estén habilitados en todas las instancias de producción de SQL Server para recuperar las bases de datos en un momento determinado.

SQL Server almacena los detalles de la copia de seguridad y la información de restauración en las siguientes tablas de la base de datos MSDB :

  • archivo de copia de seguridad
  • grupo de archivos de copia de seguridad
  • familia de medios de copia de seguridad
  • conjunto de medios de copia de seguridad
  • copia de seguridad
  • restaurar archivo
  • restaurar grupo de archivos
  • restaurar el historial

Para un significativo no. de bases de datos en la instancia de SQL Server configurada con copias de seguridad completas y copias de seguridad de registros transaccionales, los registros en las tablas anteriores pueden aumentar más rápido.

Por lo tanto, SQL Server proporciona dos procedimientos almacenados del sistema en MSDB base de datos para controlar el tamaño de las tablas anteriores:

  • sp_delete_backuphistory – elimina los datos del historial de copias de seguridad en las 8 tablas anteriores según la fecha más antigua parámetro.
  • sp_delete_database_backuphistory – elimina los datos del historial de copias de seguridad en las 8 tablas anteriores según el nombre de la base de datos .

La sintaxis para ejecutar los procedimientos almacenados del sistema anterior:

exec msdb.dbo.sp_delete_backuphistory @oldest_date = 'oldest_date'
exec msdb.dbo.sp_delete_database_backuphistory @database_name = 'database_name'

Cuando ejecutamos cualquiera de los procedimientos almacenados descritos anteriormente en una base de datos que contiene registros enormes en las tablas del historial de copias de seguridad, es posible que nos bloqueemos o notemos que los registros se eliminan muy lentamente. Para resolver esto, creamos el siguiente índice faltante en el conjunto de copia de seguridad mesa. Se puede identificar a través del plan de ejecución del procedimiento almacenado para ejecutar cualquiera de nuestros procedimientos almacenados más rápido.

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE OBJECT_ID = OBJECT_ID('[dbo].[backupset]') AND name = 'IX_BackupSet_FinDate_MediaSet')
CREATE NONCLUSTERED INDEX IX_BackupSet_FinDate_MediaSet ON backupset(backup_finish_date) 
INCLUDE (media_set_id)
GO

Historial de trabajos del Agente SQL Server

SQL Server almacena todo el historial de trabajos del Agente SQL Server en el msdb.dbo.sysjobhistory mesa. Además, SQL Server tiene un procedimiento almacenado del sistema llamado msdb.dbo.sp_purge_jobhistory que ayuda a mantener el sysjobhistory tamaño de la mesa bajo control.

La sintaxis para ejecutar sp_purge_jobhistory el procedimiento almacenado será:

exec msdb.dbo.sp_purge_jobhistory @job_name = 'job_name', @job_id = 'job_id', @oldest_date ='oldest_date'

Los 3 parámetros son opcionales y recomendamos ejecutar el procedimiento anterior pasando la fecha_antigua parámetro para mantener el sysjobhistory tamaño de la mesa bajo control.

Planes de mantenimiento

SQL Server almacena los detalles de todos los planes de mantenimiento en las siguientes tablas:

  • msdb.dbo.sysmaintplan_log
  • msdb.dbo.sysmaintplan_logdetail

SQL Server tiene un procedimiento almacenado incorporado llamado msdb.dbo.sp_maintplan_delete_log para mantener los tamaños de estas 2 tablas bajo control.

La sintaxis para ejecutar el procedimiento será:

exec msdb.dbo.sp_maintplan_delete_log @plan_id = '', @subplan_id = '', @oldest_Time = 'oldest_datetime'

Los 3 parámetros son opcionales. Recomendamos ejecutar el procedimiento anterior, pasando el parámetro old_time para mantener bajo control el tamaño de las dos tablas anteriores.

Historial de correo de la base de datos de SQL Server

SQL Server almacena todos los registros del historial del Correo electrónico de la base de datos en las siguientes tablas:

  • sysmail_mailitems
  • sysmail_log
  • archivos adjuntos de correo del sistema
  • sysmail_attachments_transfer

Para mantener estos tamaños de tablas de historial bajo control, SQL Server ofrece 2 procedimientos almacenados del sistema llamados msdb.dbo.sysmail_delete_mailitems_sp y msdb.dbo.sysmail_delete_log_sp.

La sintaxis para ejecutar estos procedimientos almacenados será:

exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = 'oldest_datetime', @sent_status = NULL
exec msdb.dbo.sysmail_delete_log_sp @logged_before = 'oldest_datetime', @event_type = NULL

Para ambos procedimientos, todos los parámetros son opcionales. Sin embargo, se recomienda utilizar el sent_before o logged_befor e parámetros para eliminar los registros más antiguos según el período de retención.

En algunos escenarios, si todas las tablas relacionadas con el Correo electrónico de la base de datos son enormes, ejecutar eliminar procedimiento correrá para siempre. Una forma más rápida de manejar el problema es eliminar la restricción de clave externa en sysmail_attachments y sysmail_send_retries tablas, trunque las 4 tablas anteriores y vuelva a crear las 2 claves externas en sysmail_attachments y sysmail_send_retries mesas como se muestra a continuación:

USE MSDB;

ALTER TABLE [dbo].[sysmail_attachments] DROP [FK_sysmail_mailitems_mailitem_id];
GO
ALTER TABLE [dbo].[sysmail_send_retries] DROP [FK_mailitems_mailitem_id];
GO

TRUNCATE TABLE [dbo].[sysmail_attachments];
TRUNCATE TABLE [dbo].[sysmail_send_retries];
TRUNCATE TABLE [dbo].[sysmail_mailitems];
TRUNCATE TABLE [dbo].[sysmail_log];

ALTER TABLE [dbo].[sysmail_attachments]  WITH CHECK ADD  CONSTRAINT [FK_sysmail_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_attachments] CHECK CONSTRAINT [FK_sysmail_mailitems_mailitem_id];
GO

ALTER TABLE [dbo].[sysmail_send_retries]  WITH CHECK ADD  CONSTRAINT [FK_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_send_retries] CHECK CONSTRAINT [FK_mailitems_mailitem_id];
GO

Paquetes SSIS

SQL Server almacena todos los SSIS(*.dtsx) paquetes en los msdb.dbo.sysssispackages mesa. Esta tabla es una tabla de configuración; sin embargo, en casos aleatorios, es probable que haya muchos paquetes SSIS volcados sobre la tabla. Hace que el tamaño de esta mesa crezca enormemente.

En esos casos, debemos identificar si hay paquetes no deseados y eliminar esos paquetes para mantener los sysssispackages tamaño de la mesa bajo control.

El resultado final

SQL Server no tiene trabajos integrados para manejar la tarea de eliminar en todas las tablas discutido anteriormente. Aún así, tenemos el parámetro de fecha más antigua disponible para todos los procedimientos anteriores.

Por lo tanto, el enfoque recomendado para manejar el tamaño de la tabla MSDB bajo control sería definir un período de retención basado en la cantidad de días y crear un nuevo trabajo del Agente SQL Server para ejecutar el siguiente script de forma programada:

declare @retention_date datetime = '2021-04-01'
exec msdb.dbo.sp_delete_backuphistory @oldest_date = @retention_date;
exec msdb.dbo.sp_purge_jobhistory @oldest_date = @retention_date;
exec msdb.dbo.sp_maintplan_delete_log @oldest_Time = @retention_date;
exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @retention_date;
exec msdb.dbo.sysmail_delete_log_sp @logged_before = @retention_date;

Conclusión

Hemos aprendido sobre la lista de tablas que pueden crecer más rápido en MSDB base de datos y cómo mantener el tamaño de estas tablas bajo control. Hemos derivado una secuencia de comandos útil con la lista de procedimientos para ejecutar con regularidad para evitar el MSDB base de datos creciendo a un tamaño enorme también. Espero que este artículo sea útil para su automatización y que esta información lo libere del mantenimiento de la base de datos MSDB y se concentre en otras actividades.