Va bene eliminare MSDB?


9

Non sono un DBA, ho solo cercato su Google quello che fa MSDB è fondamentalmente un DB di SQL Agent per il suo lavoro e la sua storia, ora sto esaurendo lo spazio nel mio server cloud e ho 1 anno di MSDB per un anno 2017 , È possibile eliminarlo o lo conservo a scopo di backup?

Il mio MSDB è 93 GB in un HDD da 250 GB.

Risposte:


14

Non è possibile eliminare il msdbdatabase come indicato nei documenti (il mio accento è mio):

restrizioni

Le seguenti operazioni non possono essere eseguite sul database msdb:

  • Modifica delle regole di confronto. Le regole di confronto predefinite sono le regole di confronto del server.

  • Eliminazione del database.

  • Eliminazione dell'utente guest dal database.

  • Abilitazione della modifica dei dati acquisiti.

  • Partecipare al mirroring del database.

  • Rimozione del filegroup primario, del file di dati primario o del file di registro.

  • Rinominare il database o il filegroup primario.

  • Impostazione del database su OFFLINE.

  • Impostazione del filegroup primario su READ_ONLY.

La manomissione dei database di sistema non è di solito una buona idea. Dovresti controllare dov'è il tuo problema di spazio e considerare di espandere le tue unità.


Per verificare dove si trova il tuo problema di dimensioni:

  • Controlla le dimensioni di tabella e indice all'interno del msdbdatabase usando questa query:

    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
    

    Se viene sysjobhistoryvisualizzato nello spazio, rivedi la tua attuale politica di affitto della cronologia dei lavori e assicurati che le pianificazioni dei tuoi lavori siano sotto controllo e che non si attivino più spesso del necessario.

  • Controlla i dati del database e le dimensioni dei file di registro con questa query:

    ;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'
    

    Se la dimensione del file di registro è elevata, è necessario scoprire quale operazione ha comportato l'aumento delle dimensioni e la risoluzione dei problemi. La riduzione del file libererà spazio ma non risolverà il problema sottostante.


il mio MSDB è 93 GB in un HDD da 250 GB, probabilmente prenderò in considerazione l'espansione del mio HDD ma per ora ammazzo Elimina i vecchi dischi Grazie.
Terrence McGinnis,

5

Come spiegato nelle altre risposte qui, non tentare di eliminare l'intero database msdb.

È possibile che si desideri eliminare determinati record della cronologia archiviati nel database msdb e quindi ridurre il database se è necessario risparmiare spazio. Attenzione, non ti consiglio di farlo poiché il database dovrà sicuramente crescere di nuovo a meno che tu non gestisca da vicino lo spazio utilizzato da msdb su base continuativa.

È possibile rimuovere la cronologia dal database msdb utilizzando queste procedure memorizzate:

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';

Per ridurre msdb, puoi usare questo:

USE msdb;

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

Le operazioni di cui sopra tenteranno di ridurre i dati msdb e i file di registro alla dimensione più piccola possibile. Per il file di registro, la "dimensione minima possibile" è limitata dal file di registro virtuale assegnato più di recente.

Cordiali saluti, è possibile vedere quanto spazio viene consumato in un database eseguendo il seguente codice:

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

1

Secondo la documentazione del blog di Microsoft, ecco MSDB un importante database di sistema in Microsoft SQL Server. Il database msdb viene utilizzato principalmente da SQL Server Agent per archiviare attività di sistema come lavori sql server, posta, broker di servizi, piani di manutenzione, cronologia di backup del database utente e di sistema, ecc. Viene anche utilizzato dal motore di database e dallo studio di gestione.

Esistono alcune operazioni DMLAnd DDLche non possono essere eseguite nel MSDBdatabase come:

  1. Non è possibile eliminare le tabelle da questo database.
  2. We cannot drop this database.
  3. Non possiamo far andare questo database di sistema off-line.
  4. Non possiamo fare database mirroringsu questo database.
  5. Non è possibile renamequesto nome di database. eccetera…
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.