Está tudo bem excluir o MSDB?

9

Eu não sou um DBA, apenas pesquisei o que o MSDB faz. Basicamente, é um banco de dados do SQL Agent do seu trabalho e histórico. Agora estou ficando sem espaço no meu servidor em nuvem e tenho 1 ano no MSDB no ano de 2017 , Posso excluir isso ou eu o mantenho para fins de backup?

Meu MSDB tem 93 GB em um HD de 250 GB.

Terrence McGinnis
fonte

Respostas:

14

Você não pode descartar o msdbbanco de dados conforme indicado nos documentos (ênfase minha):

Restrições

As seguintes operações não podem ser executadas no banco de dados msdb:

  • Alterando o agrupamento. O agrupamento padrão é o agrupamento do servidor.

  • Soltando o banco de dados.

  • Removendo o usuário convidado do banco de dados.

  • Ativando a captura de dados alterados.

  • Participando do espelhamento de banco de dados.

  • Removendo o grupo de arquivos principal, o arquivo de dados primário ou o arquivo de log.

  • Renomeando o banco de dados ou o grupo de arquivos primário.

  • Configurando o banco de dados para OFFLINE.

  • Definindo o grupo de arquivos primário como READ_ONLY.

A adulteração dos bancos de dados do sistema geralmente não é uma boa ideia. Você deve verificar onde está o seu problema de espaço e considerar expandir suas unidades.


Para verificar onde está o seu problema de tamanho:

  • Verifique os tamanhos de tabela e índice dentro do msdbbanco de dados usando esta consulta:

    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 sysjobhistoryaparecer no espaço, revise sua política atual de aluguel de histórico de tarefas e verifique se as agendas de suas tarefas estão sob controle e não são acionadas com mais frequência do que precisam.

  • Verifique os dados do banco de dados e os tamanhos dos arquivos de log com esta consulta:

    ;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 o tamanho do arquivo de log for alto, você precisará descobrir qual operação o fez aumentar o tamanho e solucionar problemas. Reduzir o arquivo liberará algum espaço, mas não resolverá o problema subjacente.

EzLo
fonte
meu MSDB tem 93GB em um HDD de 250GB, provavelmente considerarei expandir meu HDD, mas por enquanto estou doente Limpe os registros antigos Obrigado.
Terrence McGinnis
5

Conforme abordado em outras respostas aqui, não tente excluir o banco de dados msdb inteiro.

Você pode descartar determinados registros de histórico armazenados no banco de dados msdb e encolher o banco de dados, se precisar economizar espaço. Esteja ciente de que não o aconselho a fazer isso, pois o banco de dados certamente precisará crescer novamente, a menos que você gerencie de perto o espaço usado pelo msdb continuamente.

Você pode remover o histórico do banco de dados msdb usando estes procedimentos armazenados:

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

Para reduzir o msdb, você pode usar o seguinte:

USE msdb;

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

As operações acima tentarão reduzir os dados msdb e os arquivos de log para o menor tamanho possível. Para o arquivo de log, o "menor tamanho possível" é limitado pelo arquivo de log virtual alocado mais recentemente.

Para sua informação, você pode ver quanto espaço está sendo consumido em um banco de dados executando o seguinte código:

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

De acordo com a documentação do blog da Microsoft, aqui MSDB está um banco de dados importante do sistema no Microsoft SQL Server. O banco de dados msdb é usado principalmente pelo SQL Server Agent para armazenar atividades do sistema, como trabalhos do servidor sql, correio, intermediário de serviço, planos de manutenção, histórico de backup de banco de dados do usuário e do sistema, etc. Também é usado pelo mecanismo de banco de dados e pelo estúdio de gerenciamento.

Existem certas operações DMLAnd DDLque não podem ser executadas no MSDBbanco de dados como:

  1. Não podemos descartar tabelas desse banco de dados.
  2. We cannot drop this database.
  3. Não podemos fazer com que esse banco de dados do sistema vá embora off-line.
  4. Não podemos fazer banco mirroringde dados nesse banco de dados.
  5. Não podemos renameesse nome de banco de dados. etc ...
Md Haidar Ali Khan
fonte