sqlserver利用存储过程,收缩数据库文件,释放磁盘空间

查看当前数据库文件使用率信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
USE 数据库名
 
GO
 
SELECT a.name as 逻辑文件名, size/128 [totalspace文件大小(兆)],
 
   FILEPROPERTY(a.name, 'SpaceUsed')/128 [usedspace已用空间(兆)],
 
   size/128 - FILEPROPERTY(a.name, 'SpaceUsed')/128 [未用空间(兆)],
 
   FILEPROPERTY(a.name, 'SpaceUsed')*100.0/size [使用率(%)]
 
FROM sys.database_files a cross join (select recovery_model_desc, log_reuse_wait,log_reuse_wait_desc,is_auto_shrink_on  from sys.databases where name=DB_NAME())b
 
WHERE type=0;

 创建存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CREATE PROCEDURE dbo.ShrinkDataFile
 
   @logicalFileName NVARCHAR(128)
 
AS
 
BEGIN
 
   SET NOCOUNT ON;
 
   DECLARE @initialSize INT;
 
   DECLARE @targetSize INT;
 
   DECLARE @shrinkSize INT;
 
   DECLARE @usedSpace INT;
 
   DECLARE @minSize INT;
 
   SELECT @initialSize = size / 128,
 
          @usedSpace = FILEPROPERTY(name, 'SpaceUsed') / 128
 
   FROM sys.master_files
 
   WHERE name = @logicalFileName;
 
   SET @minSize = @usedSpace + 1000; -- 可收缩最大空间+1000
 
   SET @shrinkSize = 1024;    -- 每次释放1G空间
 
   SET @targetSize = @initialSize - @shrinkSize;
 
   IF @targetSize < @minSize
 
       SET @targetSize = @minSize;
 
   DBCC SHRINKFILE (@logicalFileName, @targetSize);
 
   SELECT size / 128 AS CurrentSizeMB
 
   FROM sys.master_files
 
   WHERE name = @logicalFileName;
 
END
 
GO

调用存储过程

1
EXEC dbo.ShrinkDataFile @logicalFileName = 'test';
1
logicalFileName 为第一条查询语句得出的结果。

本文作者:亲爱的焦糖玛奇朵

本文链接:https://www.cnblogs.com/elanjie/p/18670154

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   亲爱的焦糖玛奇朵  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示