Ist es in Ordnung, MSDB zu löschen?

9

Ich bin kein DBA, ich habe nur gegoogelt, was MSDB macht. Es handelt sich im Grunde genommen um eine Datenbank des SQL-Agenten mit Job und Verlauf. Jetzt ist auf meinem Cloud-Server nicht mehr genügend Speicherplatz vorhanden und ich habe das MSDB-Jahr 2017 im Wert von 1 Jahr Ist es in Ordnung, dies zu löschen, oder behalte ich es zu Sicherungszwecken?

Meine MSDB ist 93 GB in einer 250 GB Festplatte.

Terrence McGinnis
quelle

Antworten:

14

Sie können die msdbDatenbank nicht wie in den Dokumenten angegeben löschen (Hervorhebung von mir):

Beschränkungen

Die folgenden Vorgänge können nicht für die msdb-Datenbank ausgeführt werden:

  • Sortierung ändern. Die Standardkollatierung ist die Serverkollatierung.

  • Löschen der Datenbank.

  • Löschen des Gastbenutzers aus der Datenbank.

  • Aktivieren der Änderungsdatenerfassung.

  • Teilnahme an der Datenbankspiegelung.

  • Entfernen der primären Dateigruppe, der primären Datendatei oder der Protokolldatei.

  • Umbenennen der Datenbank oder der primären Dateigruppe.

  • Einstellen der Datenbank auf OFFLINE.

  • Festlegen der primären Dateigruppe auf READ_ONLY.

Manipulationen an Systemdatenbanken sind normalerweise keine gute Idee. Sie sollten überprüfen, wo Ihr Speicherplatzproblem liegt, und erwägen, Ihre Laufwerke zu erweitern.


So überprüfen Sie, wo Ihr Größenproblem liegt:

  • Überprüfen Sie die Tabellen- und Indexgrößen in der msdbDatenbank mithilfe dieser Abfrage:

    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

    Wenn sysjobhistoryim Weltraum angezeigt wird, überprüfen Sie Ihre aktuellen Mietrichtlinien für den Jobverlauf und stellen Sie sicher, dass die Zeitpläne Ihrer Jobs überprüft werden und nicht häufiger als erforderlich ausgelöst werden.

  • Überprüfen Sie die Datenbankdaten und Protokolldateigrößen mit dieser Abfrage:

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

    Wenn die Größe der Protokolldatei hoch ist, müssen Sie herausfinden, durch welchen Vorgang die Größe erhöht wurde, und Fehler beheben. Durch das Verkleinern der Datei wird Speicherplatz freigegeben, das zugrunde liegende Problem wird jedoch nicht gelöst.

EzLo
quelle
Meine MSDB hat 93 GB in einer 250 GB-Festplatte. Ich werde wahrscheinlich in Betracht ziehen, meine Festplatte zu erweitern, aber jetzt werde ich die alten Datensätze löschen. Danke.
Terrence McGinnis
5

Versuchen Sie nicht, wie in anderen Antworten hier beschrieben, die gesamte msdb-Datenbank zu löschen.

Möglicherweise möchten Sie bestimmte Verlaufsdatensätze löschen, die in der msdb-Datenbank gespeichert sind, und dann die Datenbank verkleinern, wenn Sie Speicherplatz sparen müssen. Beachten Sie, dass ich Ihnen nicht rate, dies zu tun, da die Datenbank mit Sicherheit erneut wachsen muss, es sei denn, Sie verwalten den von msdb verwendeten Speicherplatz kontinuierlich.

Sie können den Verlauf mithilfe der folgenden gespeicherten Prozeduren aus der msdb-Datenbank entfernen:

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

Um msdb zu verkleinern, können Sie Folgendes verwenden:

USE msdb;

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

Mit den obigen Vorgängen wird versucht, die MSDB-Daten und Protokolldateien auf die kleinstmögliche Größe zu verkleinern. Für die Protokolldatei wird die "kleinstmögliche Größe" durch die zuletzt zugewiesene virtuelle Protokolldatei begrenzt.

Zu Ihrer Information können Sie sehen, wie viel Speicherplatz in einer Datenbank belegt ist, indem Sie den folgenden Code ausführen:

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
quelle
1

Gemäß der Microsoft- Blogdokumentation ist hier MSDB eine wichtige Systemdatenbank in Microsoft SQL Server. Die msdb-Datenbank wird hauptsächlich vom SQL Server-Agenten zum Speichern von Systemaktivitäten wie SQL Server-Jobs, E-Mail, Service Broker, Wartungsplänen, Benutzer- und Systemdatenbanksicherungsverlauf usw. verwendet. Sie wird auch von der Datenbank-Engine und dem Management Studio verwendet.

Es gibt bestimmte DMLUnd DDLOperationen, die in der MSDBDatenbank nicht ausgeführt werden können, wie:

  1. Wir können keine Tabellen aus dieser Datenbank löschen.
  2. We cannot drop this database.
  3. Wir können diese Systemdatenbank nicht zum Laufen bringen off-line.
  4. Wir können keine Datenbank mirroringfür diese Datenbank erstellen.
  5. Wir können renamediesen Datenbanknamen nicht . usw…
Md Haidar Ali Khan
quelle