MSDB를 삭제해도 괜찮습니까?


9

나는 DBA가 아니며 MSDB 가하는 일을 기본적으로 SQL 에이전트의 작업 및 기록 DB 인 것으로 Google 검색했습니다. 이제 클라우드 서버에 공간이 부족하고 2017 년 1 년분의 MSDB가 있습니다 , 이것을 삭제해도됩니까, 아니면 백업 목적으로 유지합니까?

내 MSDB는 250GB HDD에서 93GB입니다.

답변:


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'

    로그 파일 크기가 크면 크기를 늘리고 문제를 해결 한 작업을 찾아야합니다. 파일을 줄이면 약간의 공간이 확보되지만 근본적인 문제는 해결되지 않습니다.


내 MSDB는 250GB HDD에서 93GB입니다. 아마도 HDD 확장을 고려할 것이지만 지금은 아픈 오래된 레코드를 제거하십시오. 감사합니다.
테렌스 맥기니스

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 마이크로 소프트 SQL 서버의 중요한 시스템 데이터베이스입니다. msdb 데이터베이스는 주로 SQL Server 에이전트에서 SQL Server 작업, 메일, 서비스 브로커, 유지 관리 계획, 사용자 및 시스템 데이터베이스 백업 기록 등과 같은 시스템 활동을 저장하는 데 사용되며 데이터베이스 엔진 및 관리 스튜디오에서도 사용됩니다.

특정있다 DML그리고 DDL에서 수행 할 수없는 작업 MSDB데이터베이스와 같은 :

  1. 이 데이터베이스에서 테이블을 삭제할 수 없습니다.
  2. We cannot drop this database.
  3. 우리는이 시스템 데이터베이스를 만들 수 없습니다 off-line .
  4. 데이터베이스를 할 수 없습니다 mirroring 에서 를 .
  5. rename이 데이터베이스 이름을 사용할 수 없습니다 . 기타…
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.