gpt4 book ai didi

c# - DBCC SHRINKFILE 的进展

转载 作者:可可西里 更新时间:2023-11-01 08:07:31 26 4
gpt4 key购买 nike

我有一个 21 Gb 的数据库;其中 20 Gb 是文件 (FileStream),我已经从表中删除了所有文件,但是当我进行备份时,备份文件仍然是 21 GB

为了解决这个问题,我提出了“释放未使用的空间”的想法。

所以我正在尝试收缩我的数据库,如下所示:

USE Db;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE Db
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (Db, 100);
GO
-- Reset the database recovery model.
ALTER DATABASE Db
SET RECOVERY FULL;
GO

SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);

如果我在 XX 分钟后对数据库进行备份,那么备份文件大小为 1 Gb,我可以看到未使用的空间已成功清理。换句话说,上面的 Sql 代码工作正常(数据库在 XX 分钟后收缩)。


问题 我需要等到此查询(收缩操作)完成,所以我正在尝试执行以下操作:

SELECT percent_complete, start_time, status, command, estimated_completion_time, cpu_time, total_elapsed_time
FROM sys.dm_exec_requests

我在上述查询的结果中找不到任何关于 SHRINKFILE 命令的信息。

enter image description here


我做错了什么吗?为什么我看不到缩DB操作的进度?

我的主要问题是:如何才能等到 SHRINKFILE 完成?例如,我是否可以从我的 C# 代码查询发送,并且在该查询的结果中我将获得 SHRINKFILE 操作是否已完成的信息?

最佳答案

衡量 DBCC SHRINKFILE 进度的问题在于,引擎无法通过一致的方式了解收缩文件需要完成多少工作。理解这一点就是知道 DBCC SHRINKFILE 是如何工作的。基本上,过程是:

  • 您声明要将文件缩小到某个点(比如 5 GB,从 10 GB 下降)。
  • 引擎会开始将页面从文件末尾移动到文件开头附近的下一个打开位置。

Shrink File Movement

  • 引擎一直运行直到 A) 它在您声明的点下移动了足够多的页面以减小文件大小或 B) 所有空白空间都在文件的后端。

那么为什么这意味着 SQL Server 不知道需要完成多少工作呢?因为它不知道你的空白空间在文件中有多零碎。如果东西压缩得很好并且靠近文件的前面,收缩文件将很快消失。如果没有,可能需要很长时间。好消息是,一旦页面在文件中移动,它们就被移动了。取消收缩文件不会撤消/回滚这项工作,因此如果您有一个收缩文件运行了一段时间,然后在它完成之前将其终止,所有页面移动都将保持不变。这意味着您可以在几乎您离开的地方重新启动收缩文件(除非在文件中创建任何新页面)。

关于c# - DBCC SHRINKFILE 的进展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20222514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com