MSDBを削除してもよろしいですか?


9

私はDBAではありません。MSDBが何をしているのかをググっただけです。基本的には、そのSQL Serverの職務と履歴のDBです。今、クラウドサーバーのスペースが足りなくなり、1年分のMSDBが2017年分あります。 、これを削除しても大丈夫ですか、それともバックアップのために保持しますか?

私の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の拡張を検討しますが、今のところ病気です。
Terrence McGinnis

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

マイクロソフトのブログのドキュメントによる MSDBと、ここにはMicrosoft SQLサーバーの重要なシステムデータベースがあります。msdbデータベースは、主にSQL Serverエージェントによって使用され、SQLサーバージョブ、メール、サービスブローカー、メンテナンスプラン、ユーザーおよびシステムデータベースのバックアップ履歴などのシステムアクティビティを格納します。また、データベースエンジンや管理スタジオでも使用されます。

次のようなデータベースでは実行できない特定のDMLAnd 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.