¿Está bien eliminar MSDB?

9

No soy un DBA, solo busqué en Google lo que hace MSDB, es básicamente una base de datos del Agente SQL de su trabajo e historial, ahora me estoy quedando sin espacio en mi servidor en la nube y tengo 1 año de MSDB año 2017 , ¿Está bien eliminar esto o lo guardo con fines de copia de seguridad?

Mi MSDB es de 93 GB en un disco duro de 250 GB.

Terrence McGinnis
fuente

Respuestas:

14

No puede soltar la msdbbase de datos como se indica en los documentos (el énfasis es mío):

Restricciones

Las siguientes operaciones no se pueden realizar en la base de datos msdb:

  • Cambio de colación. La clasificación predeterminada es la clasificación del servidor.

  • Descartar la base de datos.

  • Descartar el usuario invitado de la base de datos.

  • Habilitación de cambio de captura de datos.

  • Participando en reflejo de bases de datos.

  • Eliminar el grupo de archivos primario, el archivo de datos primario o el archivo de registro.

  • Cambiar el nombre de la base de datos o grupo de archivos primario.

  • Establecer la base de datos en OFFLINE.

  • Establecer el grupo de archivos primario en READ_ONLY.

La manipulación de las bases de datos del sistema no suele ser una buena idea. Debe verificar dónde está su problema de espacio y considerar expandir sus unidades.


Para verificar dónde está su problema de tamaño:

  • Verifique los tamaños de tabla e índice dentro de la msdbbase de datos utilizando esta consulta:

    USE msdb
    GO
    
    SELECT 
        t.NAME AS TableName,
        s.Name AS SchemaName,
        p.rows AS RowCounts,
        SUM(a.total_pages) * 8 AS TotalSpaceKB, 
        CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
        SUM(a.used_pages) * 8 AS UsedSpaceKB, 
        CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
        (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
        CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
    FROM 
        sys.tables t
    INNER JOIN      
        sys.indexes i ON t.OBJECT_ID = i.object_id
    INNER JOIN 
        sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
    INNER JOIN 
        sys.allocation_units a ON p.partition_id = a.container_id
    LEFT OUTER JOIN 
        sys.schemas s ON t.schema_id = s.schema_id
    GROUP BY 
        t.Name, s.Name, p.Rows
    ORDER BY 
        TotalSpaceMB DESC

    Si sysjobhistoryaparece en el espacio, revise su política actual de retención de historial de trabajo y asegúrese de que los horarios de sus trabajos estén bajo control y no se activen más de lo necesario.

  • Verifique los datos de la base de datos y los tamaños de los archivos de registro con esta consulta:

    ;with fs
    as
    (
        select database_id, type, size * 8.0 / 1024 size
        from sys.master_files
    )
    select
        name,
        (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeInMB,
        (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeInMB
    from 
        sys.databases db
    where
        db.name = 'msdb'

    Si el tamaño del archivo de registro es alto, debe averiguar qué operación lo hizo aumentar su tamaño y solucionarlo. Reducir el archivo liberará algo de espacio pero no resolverá el problema subyacente.

EzLo
fuente
mi MSDB es de 93GB en un HDD de 250GB, probablemente consideraré expandir mi HDD pero por ahora está mal Purgar los viejos registros Gracias.
Terrence McGinnis
5

Como se cubre en otras respuestas aquí, no intente eliminar toda la base de datos msdb.

Es posible que desee eliminar ciertos registros del historial que están almacenados en la base de datos msdb y luego reducir la base de datos si necesita ahorrar espacio. Tenga en cuenta que no le aconsejo que haga esto, ya que la base de datos seguramente tendrá que volver a crecer a menos que administre estrechamente el espacio utilizado por msdb de forma continua.

Puede eliminar el historial de la base de datos msdb utilizando estos procedimientos almacenados:

USE msdb;
EXEC dbo.sp_delete_backuphistory @oldest_date = '2018-01-01T00:00:00';
EXEC dbo.sp_purge_jobhistory @job_name = NULL
    , @job_id = NULL
    , @oldest_date = '2018-01-01T00:00:00';

Para reducir msdb, puede usar esto:

USE msdb;

DBCC SHRINKFILE (MSDBData, 0);
DBCC SHRINKFILE (MSDBLog, 0);

Las operaciones anteriores intentarán reducir los datos de msdb y los archivos de registro al tamaño más pequeño posible. Para el archivo de registro, el "tamaño más pequeño posible" está limitado por el archivo de registro virtual asignado más recientemente.

Para su información, puede ver cuánto espacio se consume en una base de datos ejecutando el siguiente código:

USE <database_name>;

DECLARE @Schema sysname;
DECLARE @Table sysname;
DECLARE @DSName sysname;

--if you're interested in a subset of the objects in a database,
--specify that subset by modifying these variables.  @DSName is
--the name of a filegroup, or possibly a partition.
SET @Schema = NULL;
SET @Table = NULL;
SET @DSName = NULL;

SELECT DataSpace = ds.name
    , ObjectName = QUOTENAME(s.name) + '.' + QUOTENAME(o.name)
    , IndexName = i.name
    , IndexType = i.type_desc
    --, total_pages
    --, used_pages
    --, data_pages
    , TotalMB = CONVERT(INT, total_pages * 8192E0 / 1048576)
    , UsedMB = CONVERT(INT, used_pages * 8192E0 / 1048576)
    , DataMB = CONVERT(INT, data_pages * 8192E0 / 1048576)
    , [rows]
    --, i.*
FROM sys.allocation_units au
    INNER JOIN sys.data_spaces ds ON au.data_space_id = ds.data_space_id
    INNER JOIN sys.partitions p ON (au.container_id = p.hobt_id AND (au.type = 1 OR au.type = 3)) OR (au.container_id = p.partition_id AND au.type = 2)
    INNER JOIN sys.indexes i ON p.index_id = i.index_id AND p.object_id = i.object_id
    INNER JOIN sys.objects o ON p.object_id = o.object_id
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE /*o.is_ms_shipped = 0
    AND total_pages > 128
    AND */(ds.name = @DSName OR @DSName IS NULL)
    AND (s.name = @Schema OR @Schema IS NULL)
    AND (o.name = @Table OR @Table IS NULL)
ORDER BY ds.name, o.name, i.name
Max Vernon
fuente
1

Según la documentación del blog de Microsoft, aquí MSDB hay una importante base de datos del sistema en el servidor Microsoft SQL. La base de datos msdb es utilizada principalmente por el Agente SQL Server para almacenar actividades del sistema como trabajos del servidor sql, correo, intermediario de servicios, planes de mantenimiento, historial de copia de seguridad de la base de datos del usuario y del sistema, etc. También lo utiliza el motor de base de datos y el estudio de administración.

Hay ciertas operaciones DMLAnd DDLque no se pueden realizar en la MSDBbase de datos como:

  1. No podemos descartar tablas de esta base de datos.
  2. We cannot drop this database.
  3. No podemos hacer que esta base de datos del sistema vaya off-line.
  4. No podemos hacer una base mirroringde datos en esta base de datos.
  5. No podemos renameeste nombre de base de datos. etc ...
MD Haidar Ali Khan
fuente