sp_filestream_force_garbage_collection (Transact-SQL)

适用于:SQL Server

强制 FILESTREAM 垃圾回收器(GC)运行,删除任何不需要的 FILESTREAM 文件。

在 GC 清理其中的所有已删除文件之前,无法删除 FILESTREAM 容器。 FILESTREAM GC 自动运行。 但是,如果需要在 GC 运行之前删除容器,可以使用 sp_filestream_force_garbage_collection 它手动运行 GC。

Transact-SQL 语法约定

语法

sp_filestream_force_garbage_collection
    [ @dbname = ] 'database_name'
    [ , [ @filename = ] 'logical_file_name' ]
[ ; ]

参数

[ @dbname = ] 'database_name'

表示要在其中运行 GC 的数据库的名称。

@dbnamesysname。 如果未指定,则假定为当前数据库。

[ @filename = ] 'logical_file_name'

指定要在其中运行 GC 的 FILESTREAM 容器的逻辑名称。 @filename是可选的。 如果未指定逻辑文件名,GC 将清除指定数据库中的所有 FILESTREAM 容器。

返回代码值

说明
0 操作成功
1 操作失败

结果集

说明
file_name 指示 FILESTREAM 容器名称
num_collected_items 指示此容器中已垃圾回收的 FILESTREAM 项(文件或目录)的数量。
num_marked_for_collection_items 指示此容器中已标记为 GC 的 FILESTREAM 项(文件或目录)的数目。 这些项尚未删除,但在 GC 阶段后可能有资格删除。
num_unprocessed_items 指示此 FILESTREAM 容器中未为 GC 处理的合格 FILESTREAM 项(文件或目录)的数量。 由于各种原因,项目可能未处理,包括:

- 由于日志备份或检查点尚未创建,因此需要固定的文件。

- 完整或BULK_LOGGED恢复模式下的文件。

- 存在长时间运行的活动事务。

- 副本 (replica)日志读取器作业未运行。 有关详细信息,请参阅 SQL Server 2008 中的 FILESTREAM 存储白皮书。
last_collected_xact_seqno 返回最后一个相应的日志序列号 (LSN),已垃圾回收指定 FILESTREAM 容器中小于该编号的文件。

注解

显式运行 FILESTREAM 垃圾回收任务,以在请求的数据库(和 FILESTREAM 容器)上完成。 GC 进程删除不再需要的文件。 此操作完成所需的时间取决于该数据库或容器中的 FILESTREAM 数据的大小,以及最近对 FILESTREAM 数据发生的 DML 活动量。 尽管此操作可以在数据库联机的情况下运行,但由于 GC 进程执行的各种 I/O 活动,这可能会影响数据库在运行期间的性能。

注意

建议仅在必要时和在常规操作时间之外运行此操作。

只能在单独容器或单独数据库上同时运行针对此存储过程的多个调用。

由于两阶段操作,存储过程应运行两次,以实际删除基础 FILESTREAM 文件。

垃圾回收依赖于日志截断。 因此,如果使用完整恢复模式最近在数据库上删除了文件,则仅当执行这些事务日志部分的日志备份并且日志部分标记为非活动状态后,才会对其进行垃圾回收。 在使用简单恢复模式的数据库上,在针对数据库发出日志截断后 CHECKPOINT 发生。

权限

需要db_owner数据库角色的成员身份。

示例

以下示例在数据库中运行适用于 FILESTREAM 容器的 fsdb GC。

A. 指定无容器

USE fsdb;
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'fsdb';

B. 指定容器

USE fsdb;
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'fsdb',
    @filename = N'FSContainer';