我不是 DBA,我只是在谷歌上搜索了 MSDB 所做的事情,它基本上是其工作和历史记录的 SQL 代理的数据库,现在我的云服务器空间不足,我有 1 年的 MSDB 2017 年, 可以删除它还是保留它用于备份?
我的 MSDB 是 250GB 硬盘中的 93GB。
EzL*_*zLo 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
Run Code Online (Sandbox Code Playgroud)
如果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'
Run Code Online (Sandbox Code Playgroud)
如果日志文件大小很大,您需要找出导致它增大的操作并对其进行故障排除。缩小文件将释放一些空间,但不会解决根本问题。
如此处的其他答案所述,请勿尝试删除整个 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';
Run Code Online (Sandbox Code Playgroud)
要缩小 msdb,您可以使用以下命令:
USE msdb;
DBCC SHRINKFILE (MSDBData, 0);
DBCC SHRINKFILE (MSDBLog, 0);
Run Code Online (Sandbox Code Playgroud)
上述操作将尝试将 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2544 次 |
最近记录: |