Можно ли удалить MSDB?

9

Я не администратор баз данных, я только гуглил, что делает MSDB, это, в основном, база данных агента SQL его работы и истории, теперь у меня заканчивается свободное место на моем облачном сервере, и у меня есть год MSDB 2017 года Это нормально, чтобы удалить это или я оставляю его в целях резервного копирования?

Мой MSDB составляет 93 ГБ на жестком диске 250 ГБ.

Терренс Макгиннис
источник

Ответы:

14

Вы не можете удалить msdbбазу данных, как указано в документации (выделено мое):

ограничения

Следующие операции не могут быть выполнены с базой данных msdb:

  • Меняется сопоставление. Параметры сортировки по умолчанию - параметры сортировки сервера.

  • Удаление базы данных.

  • Удаление гостевого пользователя из базы данных.

  • Включение изменения данных захвата.

  • Участие в зеркалировании базы данных.

  • Удаление первичной файловой группы, первичного файла данных или файла журнала.

  • Переименование базы данных или основной файловой группы.

  • Установка базы данных в автономном режиме.

  • Установка основной файловой группы READ_ONLY.

Подделка системных баз данных обычно не является хорошей идеей. Вы должны проверить, где ваша проблема с пространством, и рассмотреть возможность расширения ваших дисков.


Чтобы проверить, где ваша проблема размера:

  • Проверьте таблицу и размеры индекса внутри msdbбазы данных, используя этот запрос:

    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

    Если он sysjobhistoryпоявляется в космосе, просмотрите текущую политику хранения истории заданий и убедитесь, что расписания ваших заданий проверяются и не запускаются чаще, чем им нужно.

  • Проверьте данные базы данных и размеры файла журнала с помощью этого запроса:

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

    Если размер файла журнала велик, вам необходимо выяснить, какая операция увеличила его размер, и устранить неполадки. Сжатие файла освободит некоторое пространство, но не решит основную проблему.

EzLo
источник
мой MSDB составляет 93 ГБ на жестком диске объемом 250 ГБ, вероятно, я бы не подумал о расширении моего жесткого диска, но пока плохо. Очистите старые записи. Спасибо.
Терренс Макгиннис
5

Как описано в других ответах, не пытайтесь удалить всю базу данных msdb.

Возможно, вы захотите удалить некоторые записи истории, которые хранятся в базе данных msdb, а затем уменьшить базу данных, если вам нужно сэкономить место. Имейте в виду , я не советую вам делать это, поскольку база данных, безусловно, будет нуждаться в повторном росте, если вы не будете тщательно управлять пространством, используемым msdb на постоянной основе.

Вы можете удалить историю из базы данных msdb, используя эти хранимые процедуры:

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

Чтобы уменьшить msdb, вы можете использовать это:

USE msdb;

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

Вышеуказанные операции будут пытаться сжать данные MSDB и файлы журналов до минимально возможного размера. Для файла журнала «наименьший возможный размер» ограничен самым последним выделенным файлом виртуального журнала.

К вашему сведению, вы можете увидеть, сколько места используется в базе данных, запустив следующий код:

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

Согласно документации блога Microsoft здесь MSDB важная системная база данных на сервере Microsoft SQL. База данных msdb используется главным образом агентом SQL Server для хранения системных действий, таких как задания сервера sql, почта, брокер служб, планы обслуживания, история резервного копирования пользовательских и системных баз данных и т. Д. Она также используется ядром базы данных и студией управления.

Существуют определенные операции DMLAnd, DDLкоторые нельзя выполнить в базе MSDBданных, например:

  1. Мы не можем удалить таблицы из этой базы данных.
  2. We cannot drop this database,
  3. Мы не можем заставить эту системную базу данных работать off-line.
  4. Мы не можем сделать базу данных mirroringна этой базе данных.
  5. Мы не можем renameэто имя базы данных. так далее…
Г-н Хайдар Али Хан
источник