可以删除MSDB吗?


9

我不是DBA,我只是用谷歌搜索MSDB所做的事情,基本上它是其工作和历史记录的SQL Agent数据库,现在我的云服务器空间不足,并且我有1年的MSDB值,可以删除它还是保留它作备份之用?

我的MSDB在250GB硬盘中为93GB。

Answers:


14

您不能msdb按照docs(强调我的)中所述删除数据库:

限制条件

无法在msdb数据库上执行以下操作:

  • 更改排序规则。默认排序规则是服务器排序规则。

  • 删除数据库。

  • 从数据库中删除来宾用户。

  • 启用更改数据捕获。

  • 参与数据库镜像。

  • 删除主要文件组,主要数据文件或日志文件。

  • 重命名数据库或主文件组。

  • 将数据库设置为OFFLINE。

  • 将主文件组设置为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硬盘中为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是Microsoft SQL Server中重要的系统数据库。msdb数据库主要由SQL Server代理用于存储系统活动,例如sql服务器作业,邮件,服务代理,维护计划,用户和系统数据库备份历史记录等,还由数据库引擎和管理工作室使用。

在数据库中无法执行某些“ DML与” DDL操作,MSDB例如:

  1. 我们无法从该数据库中删除表。
  2. We cannot drop this database
  3. 我们无法使该系统数据库消失off-line
  4. 我们无法mirroring在此数据库上执行数据库。
  5. 我们无法使用rename此数据库名称。等等…
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.