Czy można usunąć MSDB?

9

Nie jestem DBA, przeglądałem tylko to, co robi MSDB, jest to po prostu DB SQL Agent jego zadania i historii, teraz zabrakło mi miejsca na moim serwerze w chmurze i mam 1 rok MSDB na rok 2017 , Czy można to usunąć, czy też zachowuję to w celu tworzenia kopii zapasowych?

Mój MSDB ma pojemność 93 GB na dysku twardym o pojemności 250 GB.

Terrence McGinnis
źródło

Odpowiedzi:

14

Nie można upuścić msdbbazy danych, jak podano w dokumentacji (moje wyróżnienie):

Ograniczenia

Nie można wykonać następujących operacji na bazie danych msdb:

  • Zmiana sortowania. Domyślnym zestawieniem jest zestawienie serwera.

  • Usuwanie bazy danych.

  • Usunięcie użytkownika-gościa z bazy danych.

  • Włączanie przechwytywania danych zmian.

  • Udział w dublowaniu baz danych.

  • Usuwanie podstawowej grupa plików, podstawowy plik danych lub plik dziennika.

  • Zmiana nazwy bazy danych lub podstawowej grupy plików.

  • Ustawienie bazy danych na OFFLINE.

  • Ustawienie podstawowej grupa plików na READ_ONLY.

Manipulowanie przy systemowych bazach danych zwykle nie jest dobrym pomysłem. Powinieneś sprawdzić, gdzie jest twój problem z przestrzenią i rozważyć rozszerzenie dysków.


Aby sprawdzić, gdzie jest twój problem z rozmiarem:

  • Sprawdź rozmiary tabel i indeksów w msdbbazie danych za pomocą tego zapytania:

    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

    Jeśli sysjobhistorypojawi się w kosmosie, przejrzyj aktualną politykę wynajmu miejsc pracy i upewnij się, że harmonogramy prac są sprawdzane i nie uruchamiają się częściej niż potrzebują.

  • Sprawdź dane bazy danych i rozmiary plików dziennika za pomocą tego zapytania:

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

    Jeśli rozmiar pliku dziennika jest wysoki, musisz dowiedzieć się, która operacja spowodowała jego zwiększenie, i rozwiązać problem. Zmniejszenie pliku zwolni miejsce, ale nie rozwiąże podstawowego problemu.

EzLo
źródło
mój MSDB ma pojemność 93 GB na dysku twardym o pojemności 250 GB, prawdopodobnie nie rozważam rozszerzenia mojego dysku twardego, ale na razie jestem chory Wyczyść stare rekordy Dzięki.
Terrence McGinnis
5

Jak opisano w innych odpowiedziach tutaj, nie próbuj usuwać całej bazy danych msdb.

Możesz usunąć niektóre rekordy historii, które są przechowywane w bazie danych msdb, a następnie zmniejszyć bazę danych, jeśli chcesz zaoszczędzić miejsce. Pamiętaj, że nie radzę ci tego robić, ponieważ baza danych z pewnością będzie musiała ponownie się rozbudować, chyba że będziesz stale zarządzał przestrzenią używaną przez msdb.

Możesz usunąć historię z bazy danych msdb przy użyciu tych procedur przechowywanych:

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

Aby zmniejszyć plik MSDB, możesz użyć tego:

USE msdb;

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

Powyższe operacje będą próbowały zmniejszyć dane msdb i pliki dziennika do możliwie najmniejszego rozmiaru. W przypadku pliku dziennika „najmniejszy możliwy rozmiar” jest ograniczony przez ostatnio przydzielony wirtualny plik dziennika.

Do sprawdzenia, ile miejsca zajmuje baza danych, uruchamiając następujący kod:

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
źródło
1

Zgodnie z dokumentacją blogu Microsoft, tutaj MSDB jest ważna systemowa baza danych na serwerze Microsoft SQL. Baza danych MSDB jest używana głównie przez SQL Server Agent do przechowywania działań systemowych, takich jak zadania serwera SQL, poczta, broker usług, plany konserwacji, historia tworzenia kopii zapasowych bazy danych użytkowników i systemu itp. Jest również używana przez silnik bazy danych i studio zarządzania.

Istnieją pewne DMLOraz DDLOperacje, które nie mogą być wykonywane w MSDBbazy danych takie jak:

  1. Nie możemy usunąć tabel z tej bazy danych.
  2. We cannot drop this database.
  3. Nie możemy zmusić tej systemowej bazy danych do działania off-line.
  4. Nie możemy zrobić bazy danych mirroringna tej bazie danych.
  5. Nie możemy renamenazwać tej bazy danych. itp…
Md Haidar Ali Khan
źródło