☰
ShrinkDriver:使用 PowerShell 并行执行 DBCC SHRINKFILE 回收 SQL Server 数据文件空间
2026/9/25 3:56:05 网站建设 项目流程
  • 示例工程
  • 数据库
  • 教程
  • 后端

【免费下载链接】sql-server-samples

Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge

项目地址:https://gitcode.com/gh_mirrors/sq/sql-server-samples
点击查看免费下载

ShrinkDriver 是 sql-server-samples 仓库中samples/features/shrink/shrink-driver目录下的一个 PowerShell 工具,用于通过并行运行DBCC SHRINKFILE回收 SQL Server / Azure SQL 数据库中已分配但未使用的数据文件空间,并内置进度监控、增量收缩、自动重试与优雅停机能力。阅读本文后,你将掌握如何基于Invoke-ShrinkDriver在 Report(只读分析)与 Shrink(实际收缩)两种模式下管理数据文件空间,理解其参数体系、状态报告与文件结局分类,并学会运行其自带的单元与集成测试来验证行为。

为什么需要 ShrinkDriver:并行收缩的背景

数据库的数据文件(ROWS类型文件)在长期运行中会因大事务回滚、大量删除、索引重建等原因留下"已分配但未使用"(allocated but unused)的空间。DBCC SHRINKFILE是 T-SQL 提供的标准收缩命令,但手动对每个文件逐个执行存在明显痛点:

  • 大文件的一次性收缩耗时长,且收缩期间可能阻塞其他查询;
  • 多个文件串行处理,总耗时随文件数线性增长;
  • 收缩失败(超时、被阻塞、连接中断)缺乏重试与恢复机制;
  • 难以实时观察每个文件收缩的进度、等待类型与阻塞来源。

ShrinkDriver 把这些问题封装成一个可重复执行的 PowerShell 命令:它为每个数据文件建立一个独立会话(SPID)并行执行DBCC SHRINKFILE,以增量步长逐步收缩,并在出现瞬态故障时按指数退避重试。核心脚本位于 src/ShrinkDriver.ps1,版本信息记录在 CHANGELOG.md(当前 1.1.0)。

核心能力一览

根据 README.md 与脚本实现,ShrinkDriver 提供以下能力:

  • 两种运行模式:Report(默认)只列出每个文件的已用、已分配与可回收空间,不改变任何数据;Shrink才真正执行收缩。
  • 多文件并行收缩:每个文件一个会话(session),通过 Runspace Pool 并发执行,默认最多 5 个文件同时收缩(-Sessions),总耗时显著低于串行。
  • 增量分步收缩:每个文件以-StepGiB(默认 20 GiB)为步长逐步向目标大小收缩,而不是一次性大操作,降低单步风险。
  • 自动重试:对瞬态失败以指数退避 + 全抖动(full jitter)方式重试,并在无法继续收缩时转移到下一个文件。
  • 跳过低收益文件:可回收空间低于-MinReclaimGiB(默认 1 GiB)的文件直接跳过,不为微小收益启动昂贵的收缩。
  • 低优先级锁:默认以WAIT_AT_LOW_PRIORITY运行,减少对其他查询的阻塞;超时可选择中止自身收缩(SELF)或杀掉阻塞会话(BLOCKERS,需谨慎)。
  • 可观测与可中断:定期向控制台和日志文件输出状态报告,支持 Ctrl+C 两级优雅停机与可选的-MaxRuntimeMinutes总时间上限。
  • 多认证方式:支持 Entra ID(默认)、Windows 与 SQL 认证连接数据库。

环境要求与准备

运行 ShrinkDriver 需要满足以下前提(见 README.md 与脚本#Requires -Version 7.0声明):

项目要求
数据库平台SQL Server 2022 或更高版本、Azure SQL Managed Instance、Azure SQL Database
收缩权限Shrink模式需要db_owner数据库角色或sysadmin服务器角色成员
报告权限Report模式只需能连接到目标数据库(公共角色即可)
PowerShell7.0 或更高版本
依赖模块SqlServer 模块(Microsoft.Data.SqlClient 由该模块提供)

安装依赖模块:

Install-Module SqlServer -Scope CurrentUser

注意:脚本依赖 Microsoft.Data.SqlClient 类型,若未安装 SqlServer 模块,会在运行时抛出明确错误并提示上述安装命令(见 src/ShrinkDriver.ps1)。

快速上手:加载脚本并运行

脚本通过 dot-source 方式加载以定义Invoke-ShrinkDriver命令,然后即可调用。以下示例均来自 README.md:

. .\src\ShrinkDriver.ps1 # Report(默认):列出每个文件的已用、已分配与可回收空间,不改变任何数据 Invoke-ShrinkDriver -ServerName myserver.database.windows.net -DatabaseName MyDb # Shrink + Entra ID 认证(默认),收缩到可能的最小大小,最多 5 个文件并发 Invoke-ShrinkDriver -ServerName myserver.database.windows.net -DatabaseName MyDb -Mode Shrink -Sessions 5 # Shrink + Windows 认证:不收缩到 500 GiB 以下,最多 8 个文件并发 Invoke-ShrinkDriver -ServerName sql01 -DatabaseName MyDb -Mode Shrink -AuthType Windows -FileTargetSizeGiB 500 -Sessions 8 # Shrink + SQL 认证(未提供密码时安全提示输入) Invoke-ShrinkDriver -ServerName sql01 -DatabaseName MyDb -Mode Shrink -AuthType SQL -SqlLogin appuser # 连接到使用自签名证书的实例 Invoke-ShrinkDriver -ServerName devsql01 -DatabaseName MyDb -Mode Shrink -AuthType Windows -TrustServerCertificate

需要完整的参数说明与示例时,可随时查看命令的内置帮助:

Get-Help Invoke-ShrinkDriver -Full

参数体系详解

Invoke-ShrinkDriver的完整参数定义见 src/ShrinkDriver.ps1,这里按用途分组说明(含默认值与取值范围):

连接参数

参数说明
-ServerName(必填)目标 SQL Server / Azure SQL 逻辑服务器名称
-DatabaseName(必填)目标数据库名称
-AuthType认证方式:EntraID(默认)/Windows/SQL
-SqlLoginSQL 认证登录名,AuthType=SQL时必填
-SqlPassword密码,必须是SecureString而非明文;省略时运行时安全提示输入
-TrustServerCertificate允许服务器 TLS 证书无法校验时连接(连接仍加密)。默认关闭;仅作为回退——总是先尝试完整校验的连接

连接字符串固定启用Encrypt=true、Connect Timeout=30,应用名标记为ShrinkDriver,并关闭连接池(Pooling=false),以保证Dispose后物理连接真实关闭(src/ShrinkDriver.ps1)。Entra ID 认证先尝试环境凭据(托管标识、Azure CLI、Azure PowerShell、Visual Studio 的 "Active Directory Default"),不可用则回退到交互式浏览器登录("Active Directory Interactive")。

收缩行为参数

参数默认值说明
-ModeReportReport(只读分析)/Shrink(实际收缩)
-Sessions5并发收缩的文件数上限,自动封顶为合格文件数
-TruncateOnly关只释放每个文件末尾的未使用空间,不移动数据
-NoTruncate关只压缩(repack)文件,不释放空间
-WaitAtLowPriority$true以低锁优先级运行收缩,减少阻塞其他查询
-AbortAfterWaitSELF低优先级等待超时后:SELF中止自身收缩;BLOCKERS杀掉阻塞会话(会终止其他事务,谨慎使用)
-FileTargetSizeGiB无可选的文件大小下限(GiB),任何文件不会收缩到该值以下
-StepGiB20增量收缩的步长(GiB)
-MinReclaimGiB1值得运行一轮收缩的最低可回收空间(GiB);低于此值的文件跳过
-RetryCount5每个文件瞬态失败的重试次数,范围 0–50,0 表示不重试

TruncateOnly与NoTruncate互斥、TruncateOnly与FileTargetSizeGiB不兼容、SQL 认证必须提供SqlLogin、SqlPassword必须是 SecureString——这些规则由Test-ShrinkParameterSet在运行前校验并输出明确错误(src/ShrinkDriver.ps1)。各数值参数还声明了ValidateRange约束,越界会直接触发参数校验错误(单元测试Numeric parameter validation对此逐项断言,见 tests/ShrinkDriver.Unit.Tests.ps1)。

运行控制与输出参数

参数默认值说明
-MaxRuntimeMinutes无可选的总运行时间预算,达到后停止
-StatusIntervalSeconds180状态报告写入间隔(秒)
-StuckWindowSeconds300收缩被阻塞或长时间无进展时取消并重试的判定窗口(秒)。卡死检测只在每次状态报告时运行,因此实际按StatusIntervalSeconds的整数倍生效;低于报告间隔的值会被自动上调
-LogPath脚本旁的带时间戳日志日志文件路径;父目录必须已存在且可写,否则运行在开始任何工作前停止
-PassThru关向管道输出结构化结果对象(模式、总计、逐文件结局),供编程调用方使用

此外还有一组仅供测试使用的内部参数(刻意不出现在帮助中):-BackoffBaseSeconds/-BackoffCapSeconds缩短重试退避,-StepMBOverride/-MinReclaimMBOverride/-FileTargetMBOverride/-MaxRuntimeSecondsOverride允许以 MB 和秒为单位驱动真实路径,使集成测试快速、确定地执行。

Report 模式:动手前先看清可回收空间

Report是默认模式,也是推荐的"先分析、后操作"工作流的第一步。它不改变任何数据,只读取sys.database_files与FILEPROPERTY(name, 'SpaceUsed')计算每个在线、可写 ROWS 数据文件的已用、已分配与可回收空间,并给出数据库级汇总(src/ShrinkDriver.ps1)。

关键行为:

  • 每个文件的可回收空间 = 已分配大小 − 有效下限(有效下限取"已用页大小"与-FileTargetSizeGiB目标下限中的较大者,见Get-ShrinkEffectiveFloorMB,src/ShrinkDriver.ps1)。
  • 是否值得收缩由Test-ShrinkWorthwhile判定:可回收空间 ≥-MinReclaimGiB才标记为 Eligible(src/ShrinkDriver.ps1)。
  • 文件超过 100 个时,只按可回收空间降序列出前 100 个最值得收缩的文件,并注明省略数量。
  • 汇总只统计 Eligible 文件的可回收空间——低于阈值的文件本来就不会收缩,因此不计入总计。
  • Report模式跳过版本、权限、AUTO_SHRINK 等收缩前置检查,因为读取空间使用情况只需要公共角色。

输出末尾会提示To shrink these files, run again with -Mode Shrink.,与 Shrink 模式形成清晰的"先分析、再执行"闭环。

Shrink 模式:并行收缩的执行原理

进入Shrink模式后,脚本先做一轮pre-flight 检查(单个往返查询完成,src/ShrinkDriver.ps1):

  1. 平台检查:SERVERPROPERTY('EngineEdition')为 5(Azure SQL Database)或 8(Azure SQL Managed Instance),或ProductMajorVersion≥ 16(SQL Server 2022+),否则抛出"不支持该平台"错误;
  2. 权限检查:IS_ROLEMEMBER('db_owner')或IS_SRVROLEMEMBER('sysadmin')必须为 1;
  3. AUTO_SHRINK 检查:DATABASEPROPERTYEX(DB_NAME(), 'IsAutoShrink')为 1 时拒绝运行,提示先执行ALTER DATABASE ... SET AUTO_SHRINK OFF;
  4. 只读检查:数据库为只读时拒绝运行。

随后选取合格文件(在线、可写、ROWS 类型、可回收空间 ≥ 最小阈值),并基于共享状态(线程安全的ConcurrentDictionary会话表、事件队列、文件所有权与完成状态)启动由Runspace Pool 构成的并行 worker(src/ShrinkDriver.ps1):

  • 每个 worker 一个独立会话(SPID),通过Select-ShrinkNextFile领取"可回收空间最大且未被占用/未完成"的下一个文件(src/ShrinkDriver.ps1);
  • 每个文件按-StepGiB增量生成下一个目标大小(Get-ShrinkNextTargetMB会把目标钳制到下限与最小 1 MB——因为DBCC SHRINKFILE把目标 0 解释为"收缩到文件创建大小",会残留未回收空间,见 src/ShrinkDriver.ps1);
  • 生成的命令形如DBCC SHRINKFILE (<file_id>, <targetMB>[, NOTRUNCATE|TRUNCATEONLY]) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF|BLOCKERS), NO_INFOMSGS(New-ShrinkCommandText,src/ShrinkDriver.ps1)。

收缩循环对每个文件维护自己的尝试/结局状态机:每次 step 后重新读取文件大小,变小则继续下一增量;变大(其他会话写入了数据)则退避重试,超过-RetryCount后按结局归类;无进展但确认有可回收空间则停止并报告部分结果。两类典型 SQL 错误被专门处理:

  • MSSQL 错误 5201:没有更多可回收空间,按已收缩/已最小归类并结束该文件(src/ShrinkDriver.ps1);
  • MSSQL 错误 49537:需移动的页被数据库低水位(low watermark,常由长事务或滞后/长查询的辅助副本持有)钉住,引擎自身的重试已耗尽且水位短期内不会推进,因此结束该文件并提示"稍后重新运行收缩"(src/ShrinkDriver.ps1)。

瞬态失败的重试采用指数退避 + 全抖动:等待时间 = uniform(0 .. min(Cap, Base×2^attempt)),默认 Base 5 秒、Cap 60 秒(Get-ShrinkBackoffSeconds,src/ShrinkDriver.ps1)。连接层还叠加了 Microsoft.Data.SqlClient 的连接级重试提供器(SqlConfigurableRetryFactory的指数重试,默认 5 次尝试、4 秒增量、30 秒上限),并在其上再套一层外层重连循环(最多max(10, RetryCount)次尝试),足以挺过 Azure SQL 重启或故障转移期间的短暂离线(src/ShrinkDriver.ps1 与 src/ShrinkDriver.ps1)。重连成功后 SPID 会被刷新,状态报告继续跟踪正确的会话。

监控线程还实现卡死检测:当同一非零阻塞会话持续存在、或 CPU 与读计数在-StuckWindowSeconds内均无进展时,取消当前命令并交由 worker 重试(Update-ShrinkStuckState,src/ShrinkDriver.ps1)。

状态报告:实时观察每个收缩会话

运行期间,脚本按-StatusIntervalSeconds(默认 180 秒)输出一次状态报告,每个 worker 一行,列定义来自 README.md:

列含义
Workerworker 编号
SPID该 worker 在服务器上的会话 ID
File正在收缩的数据文件
Used / Alloc文件的已用与已分配大小
%Done当前DBCC SHRINKFILE增量步的进度(来自sys.dm_exec_requests.percent_complete)
Elapsed自该 worker 会话建立以来的时间(重连后重置)
Increment当前增量收缩步的编号
Cmd当前收缩阶段,如DbccSpaceReclaim、DbccFilesCompact(来自sys.dm_exec_requests)
Status请求执行状态(running、suspended 等)
dCPU / dReads / dWrites自上次报告以来(同一增量步内)的 CPU、读、写增量
Blocker阻塞会话(如有)
Wait当前等待类型(如有)

报告末尾给出数据库级总计:总运行时间、总已用/已分配空间,以及各结局的累计计数。README 中的示例(节选):

2026-07-13 11:30:04 [INFO] ---- status ---- 2026-07-13 11:30:04 [INFO] Worker SPID File Used (GiB) Alloc (GiB) %Done Elapsed Increment Cmd Status dCPU dReads dWrites Blocker Wait 2026-07-13 11:30:04 [INFO] 0 157 13 66.3 78.0 88.8 4h 37m 34s 12 DbccFilesCompact suspended 37,507 68,713 143,163 - PAGEIOLATCH_EX 1ms 2026-07-13 11:30:04 [INFO] 5 179 6 70.3 78.4 92.5 4h 37m 33s 12 DbccFilesCompact suspended 33,075 79,371 153,667 164 (DbccFilesCompact) LCK_M_X 0ms 2026-07-13 11:30:04 [INFO] ---- database total ---- 2026-07-13 11:30:04 [INFO] Run time : 12h 10m 24s 2026-07-13 11:30:04 [INFO] Used : 2.3 TiB 2026-07-13 11:30:04 [INFO] Allocated : 2.5 TiB 2026-07-13 11:30:04 [INFO] Shrunk : 16 2026-07-13 11:30:04 [INFO] Repacked : 0 2026-07-13 11:30:04 [INFO] Partly shrunk : 1 2026-07-13 11:30:04 [INFO] Already at minimum : 0 2026-07-13 11:30:04 [INFO] Already at target : 0 2026-07-13 11:30:04 [INFO] Grew : 0 2026-07-13 11:30:04 [INFO] Gave up : 0

实现层面,报告通过控制连接批量查询sys.dm_exec_requests,并将多文件的FILEPROPERTY('SpaceUsed')合并为一次批处理查询(Get-ShrinkFileSizes),避免高并发收缩下逐文件调用与收缩本身争用同一文件闩锁而超时(src/ShrinkDriver.ps1)。CPU/读/写增量只在"增量步编号未变"时才有意义,跨步边界会显示-,防止把新请求的归零计数器误算为负增量(Get-ShrinkDeltaWithReset)。表格单位会根据最大分配值自动选择 KiB/MiB/GiB/TiB,保证同一报告内单位一致。

结束汇总:每个文件如何收场

运行结束时的汇总报告每个文件落入哪种结局(buckets),定义见 README.md:

结局含义
Shrunk文件被缩减,达到目标大小或最小大小
Repacked使用-NoTruncate时数据页被移向文件前端;按设计分配大小不变(空间未释放)
Partly shrunk有缩减,但在达到目标/最小大小前放弃
Already at minimum已处于可能的最小大小,无可回收空间
Already at target已等于或低于目标大小
Grew结束时比开始时更大(其他会话在收缩期间写入了数据)
Gave up多次重试后大小无变化而放弃
Interrupted在产生可测量结果前被中断
Not processed本应收缩但运行在完成前结束(如从未开始,或连接丢失且无法恢复)

README 中的示例:

2026-07-13 12:31:24 [INFO] -------------------- summary -------------------- 2026-07-13 12:31:24 [INFO] Run time : 13h 11m 44s 2026-07-13 12:31:24 [INFO] Used : 2.3 TiB 2026-07-13 12:31:24 [INFO] Allocated : 2.3 TiB 2026-07-13 12:31:24 [INFO] Shrunk : 30 2026-07-13 12:31:24 [INFO] Partly shrunk : 1 2026-07-13 12:31:24 [INFO] file 35 [PartlyShrunk]: reduced from 40.0 GiB to 10.0 GiB, but the remaining unused space could not be reclaimed 2026-07-13 12:31:24 [INFO] -------------------------------------------------

汇总阶段还会做两件重要的事(src/ShrinkDriver.ps1):

  1. 对账:任何在运行结束前未到达终态(terminal state)的合格文件被记为NotProcessed,保证汇总覆盖每个合格文件,而不是暗示全部完成;
  2. 后续建议:重新检查哪些文件仍有可回收空间并给出总量提示——部分收缩或跳过往往源于瞬态条件(并发写入、阻塞),再次运行可能回收更多。

若使用了-PassThru,脚本还会向管道输出结构化结果对象(Mode、Elapsed、StoppedBy、DbUsedMB、DbAllocatedMB、Counts、逐文件Files),方便被其他脚本或 CI 消费;交互式运行默认不输出原始对象,以免刷屏(src/ShrinkDriver.ps1)。

日志与优雅停机

进度同时写入控制台并镜像到日志文件——默认是脚本旁边的带时间戳shrink-<时间>.log,也可用-LogPath指定。日志记录启动时的全部参数值、周期性的逐文件状态报告,以及重试、重连、取消等关键事件(EVENT)。日志路径在运行前会被校验(目录必须存在且可写、不能是目录,失败则在开始任何工作前快速报错,见Resolve-ShrinkLogPath,src/ShrinkDriver.ps1)。控制台着色仅作辅助强调(遵循NO_COLOR约定可关闭),日志文件始终为纯文本。

停机是两阶段优雅的(src/ShrinkDriver.ps1):

  • 第一次 Ctrl+C 或到达-MaxRuntimeMinutes:停止领取新文件,取消在飞命令,并重新测量在飞文件的真实大小以确定结局(DBCC SHRINKFILE被取消后仍保留已回收的空间,因此新测量是权威的)——通常归类为PartlyShrunk/Grew/Interrupted,而非笼统地算作失败(Get-ShrinkStopOutcome,src/ShrinkDriver.ps1);
  • 第二次 Ctrl+C:立即停止,在飞文件直接记为Interrupted(不等待重新测量),并恢复默认 Ctrl+C 处理以便必要时强制退出彻底卡死的进程。

实现上,脚本刻意不使用Console.CancelKeyPress事件处理器(PowerShell 会在无 runspace 的后台线程上触发该事件,处理器会抛错导致进程崩溃),而是把 Ctrl+C 转成普通按键在监控线程轮询。所有运行时间计算基于单调时钟(Stopwatch),避免 DST 或 NTP 校时导致时间上限提前/延后触发(src/ShrinkDriver.ps1)。

运维注意事项与安全细节

结合脚本实现,以下细节值得在实际使用中注意:

  • -AbortAfterWait BLOCKERS会终止其他事务:脚本在启动日志中显式输出 WARN 提示;它把ABORT_AFTER_WAIT = BLOCKERS交给引擎去终止阻塞会话,应仅在可控维护窗口内使用。
  • -TrustServerCertificate只是回退:Open-ShrinkSqlConnection总是先尝试完整校验服务器证书;仅当校验失败且显式开启该开关时才重试一次信任证书(连接仍加密)。对 Azure SQL 这类证书可信的目标,绝不会在未校验的情况下连接(src/ShrinkDriver.ps1)。
  • -SqlPassword必须是 SecureString:明文会被Test-ShrinkParameterSet拒绝;正确用法是$pw = Read-Host -AsSecureString 'SQL password'后传入-SqlPassword $pw。省略密码时运行时会安全提示输入,避免密码出现在命令行历史中。
  • AUTO_SHRINK 必须关闭:脚本拒绝在开启 AUTO_SHRINK 的数据库上运行,因为自动收缩会与手动收缩互相干扰。
  • 收缩是高成本操作:MinReclaimGiB的默认阈值(1 GiB)避免了为微小收益启动昂贵的收缩;StepGiB默认 20 GiB 使单步可控;WaitAtLowPriority默认开启以降低对其他查询的阻塞。

测试:用 Pester 验证行为

ShrinkDriver 附带两套 Pester 测试(见 tests/README.md):

  • 单元测试:只验证纯辅助函数(参数校验、日志路径解析、退避计算、目标大小计算、结局归类等),快速且不需要数据库;Invoke-Pester -Path .\tests\ShrinkDriver.Unit.Tests.ps1输出中引用过Tests Passed: 106级别的全绿结果;
  • 集成测试:对真实 SQL 实例创建小型临时数据库、实际运行DBCC SHRINKFILE后删除,端到端验证真实行为;默认使用 SQL Server LocalDB(Windows 认证),无实例可达时自动跳过,不适用于目标实例的用例也会跳过。
# 先安装 Pester 5+(每用户一次) Install-Module Pester -MinimumVersion 5.0 -Scope CurrentUser # 单元测试(快速,无需数据库) Invoke-Pester -Path .\tests\ShrinkDriver.Unit.Tests.ps1 # 集成测试(默认 LocalDB) Invoke-Pester -Path .\tests\ShrinkDriver.Integration.Tests.ps1 -Tag Integration # 针对其他实例(如 Azure SQL Database 逻辑服务器): $env:SHRINKDRIVER_TEST_SERVER = 'myserver.database.windows.net' $env:SHRINKDRIVER_TEST_AUTH = 'EntraID' # EntraID | Windows | SQL # SQL 认证还需设置登录名,密码在测试运行时安全提示: # $env:SHRINKDRIVER_TEST_LOGIN = 'appuser' # 自签名证书实例如需信任连接: # $env:SHRINKDRIVER_TEST_TRUSTCERT = '1' Invoke-Pester -Path .\tests\ShrinkDriver.Integration.Tests.ps1 -Tag Integration Remove-Item Env:\SHRINKDRIVER_TEST_SERVER, Env:\SHRINKDRIVER_TEST_AUTH -ErrorAction SilentlyContinue # 全部测试 / 仅快速门禁(跳过集成) Invoke-Pester -Path .\tests Invoke-Pester -Path .\tests -ExcludeTag Integration

集成测试夹具位于 tests/fixtures/ShrinkTestDb.psm1:它会按引擎自适应地准备包含多个数据文件与交错空闲空间的临时数据库(Azure SQL Database 无用户文件组,因此所有数据文件位于 PRIMARY),并复用与驱动完全一致的连接与认证逻辑(Windows / EntraID 的 Default→Interactive 回退 / SQL)。集成测试还通过-BackoffBaseSeconds 0 -BackoffCapSeconds 0让重试立即生效、用-StepMBOverride等测试参数驱动真实路径,并断言"至少一个文件回收了空间""总分配大小下降"等结果(见 tests/ShrinkDriver.Integration.Tests.ps1)。

小结

ShrinkDriver 把DBCC SHRINKFILE从"手工逐文件、高风险、难监控"升级为"并行、增量、可重试、可观测"的 PowerShell 工作流:Report模式先量化可回收空间,Shrink模式以多会话并发与步进收缩降低单次操作风险,状态报告与结局分类让每次运行都有据可查,优雅停机与自动重连让它适合在长维护窗口甚至 Azure SQL 故障转移场景下使用。仓库内的 README.md、src/ShrinkDriver.ps1、tests 与 CHANGELOG.md 是继续深入理解其实现的完整资料。

  • 示例工程
  • 数据库
  • 教程
  • 后端

【免费下载链接】sql-server-samples

Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge

项目地址:https://gitcode.com/gh_mirrors/sq/sql-server-samples
点击查看免费下载

相关推荐

上一篇:大规模科学数据存储性能瓶颈与HDF5企业级解决方案深度解析
下一篇:3分钟解锁网易云音乐新玩法:BetterNCM插件安装完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询