Như được đề cập trong các câu trả lời khác ở đây, không cố gắng xóa toàn bộ cơ sở dữ liệu msdb.
Bạn có thể muốn bỏ các bản ghi lịch sử nhất định được lưu trữ trong cơ sở dữ liệu msdb, sau đó thu nhỏ cơ sở dữ liệu nếu bạn cần tiết kiệm dung lượng. Xin lưu ý, tôi không khuyên bạn làm điều này vì cơ sở dữ liệu chắc chắn sẽ cần phải phát triển lại trừ khi bạn quản lý chặt chẽ không gian được sử dụng bởi msdb trên cơ sở liên tục.
Bạn có thể xóa lịch sử khỏi cơ sở dữ liệu msdb bằng các thủ tục được lưu trữ này:
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';
Để thu nhỏ msdb, bạn có thể sử dụng:
USE msdb;
DBCC SHRINKFILE (MSDBData, 0);
DBCC SHRINKFILE (MSDBLog, 0);
Các hoạt động trên sẽ cố gắng thu nhỏ dữ liệu msdb và tệp nhật ký đến kích thước nhỏ nhất có thể. Đối với tệp nhật ký, "kích thước nhỏ nhất có thể" bị giới hạn bởi tệp nhật ký ảo được phân bổ gần đây nhất.
FYI, bạn có thể thấy bao nhiêu không gian đang được sử dụng trong cơ sở dữ liệu bằng cách chạy mã sau đây:
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