Est-il correct de supprimer MSDB?

9

Je ne suis pas un DBA, j'ai seulement googlé ce que MSDB fait, c'est essentiellement une base de données de l'agent SQL de son travail et de son historique, maintenant je manque d'espace sur mon serveur cloud et j'ai 1 an de MSDB pour l'année 2017 , Puis-je le supprimer ou le conserver à des fins de sauvegarde?

Mon MSDB est de 93 Go sur un disque dur de 250 Go.

Terrence McGinnis
la source

Réponses:

14

Vous ne pouvez pas supprimer la msdbbase de données comme indiqué dans les documents (c'est moi qui souligne):

Restrictions

Les opérations suivantes ne peuvent pas être effectuées sur la base de données msdb:

  • Modification du classement. Le classement par défaut est le classement du serveur.

  • Suppression de la base de données.

  • Suppression de l'utilisateur invité de la base de données.

  • Activation de la capture des données modifiées.

  • Participer à la mise en miroir de bases de données.

  • Suppression du groupe de fichiers principal, du fichier de données principal ou du fichier journal.

  • Renommer la base de données ou le groupe de fichiers principal.

  • Définition de la base de données sur OFFLINE.

  • Définition du groupe de fichiers principal sur READ_ONLY.

La falsification des bases de données système n'est généralement pas une bonne idée. Vous devez vérifier où se trouve votre problème d'espace et envisager d'étendre vos disques.


Pour vérifier où se situe votre problème de taille:

  • Vérifiez la taille des tables et des index dans la msdbbase de données à l'aide de cette requête:

    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 sysjobhistoryapparaît dans l'espace, passez en revue votre politique de conservation des antécédents professionnels et assurez-vous que les horaires de vos travaux sont en échec et ne se déclenchent pas plus souvent qu'ils n'en ont besoin.

  • Vérifiez les données de la base de données et la taille des fichiers journaux avec cette requête:

    ;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 la taille du fichier journal est élevée, vous devez savoir quelle opération l'a fait augmenter sa taille et la résoudre. La réduction du fichier libérera de l'espace mais ne résoudra pas le problème sous-jacent.

EzLo
la source
mon MSDB est de 93 Go sur un disque dur de 250 Go, je pense que je ne devrais probablement pas étendre mon disque dur, mais pour l'instant je vais purger les anciens enregistrements
Terrence McGinnis
5

Comme indiqué dans d'autres réponses ici, n'essayez pas de supprimer l'intégralité de la base de données msdb.

Vous souhaiterez peut-être supprimer certains enregistrements d'historique stockés dans la base de données msdb, puis réduire la base de données si vous avez besoin d'économiser de l'espace. Sachez que je ne vous conseille pas de le faire car la base de données devra très certainement croître à nouveau, à moins que vous ne gériez étroitement l'espace utilisé par msdb de manière continue.

Vous pouvez supprimer l'historique de la base de données msdb à l'aide de ces procédures stockées:

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

Pour réduire msdb, vous pouvez utiliser ceci:

USE msdb;

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

Les opérations ci-dessus tenteront de réduire les données msdb et les fichiers journaux à la plus petite taille possible. Pour le fichier journal, la "plus petite taille possible" est limitée par le fichier journal virtuel le plus récemment alloué.

Pour info, vous pouvez voir combien d'espace est consommé dans une base de données en exécutant le code suivant:

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
la source
1

Selon la documentation du blog Microsoft, voici MSDB une base de données système importante dans Microsoft SQL Server. La base de données msdb est principalement utilisée par l'Agent SQL Server pour stocker les activités du système telles que les travaux du serveur sql, le courrier, le courtier de services, les plans de maintenance, l'historique de sauvegarde de la base de données des utilisateurs et du système, etc. Il est également utilisé par le moteur de base de données et le studio de gestion.

Il existe certaines opérations DMLEt DDLqui ne peuvent pas être effectuées dans la MSDBbase de données comme:

  1. Nous ne pouvons pas supprimer des tables de cette base de données.
  2. We cannot drop this database.
  3. Nous ne pouvons pas créer cette base de données système off-line.
  4. Nous ne pouvons pas faire de base mirroringde données sur cette base de données.
  5. Nous ne pouvons pas renamece nom de base de données. etc…
Md Haidar Ali Khan
la source