如何编写按文件名顺序还原SQL Server 2019多TRN/BAK备份的PowerShell脚本
基于dbatools实现SQL Server 2019按文件名顺序还原的脚本方案
核心逻辑对齐要求
- 全程不依赖文件的创建/修改时间,完全以文件名内容为排序依据
- 解决默认字符串排序的顺序错乱问题(例如未带前导零的序号
4会被排到10之后的异常情况) - 兼容全量BAK备份+后续连续TRN日志的还原流程,适配每日定时任务的运行节奏
分步实现代码
前置环境准备
首次运行前需完成dbatools模块安装:
Install-Module dbatools -Scope CurrentUser -Force,避免定时任务触发时出现模块找不到的错误。配置脚本基础参数
# 替换为Python拉取备份文件的实际存放路径 $backupFileDir = "C:\DailyRestore\IncomingBackups" # 替换为实际的SQL Server 2019实例名 $sqlInstance = "localhost\MSSQL2019" # 替换为需要还原的目标数据库名 $targetDatabase = "TestRestoreDB"获取文件并执行自定义文件名排序
该步骤完全跳过文件系统自带的时间属性,仅通过文件名中的数字序号做自然排序,匹配你提到的..04到..12类的文件名场景:# 获取目录下所有BAK、TRN格式的备份文件 $rawFiles = Get-ChildItem -Path $backupFileDir -File | Where-Object { $_.Extension -in ".bak", ".trn" } # 自定义排序:提取文件名末尾、扩展名前的数字序号,按数值大小升序排列 $orderedBackupFiles = $rawFiles | Sort-Object -Property @{ Expression = { # 匹配扩展名前的连续数字段,转为整数用于排序 $numberMatch = [regex]::Match($_.Name, "(\d+)(?=\.(bak|trn)$)") if ($numberMatch.Success) { [int]$numberMatch.Value } else { 999999 } } }按排序后的顺序执行还原
通过dbatools参数关闭备份链的自动校验逻辑,严格按照我们手动排好的文件顺序执行操作,不参考系统记录的备份时间:$orderedBackupFiles | Restore-DbaDatabase ` -SqlInstance $sqlInstance ` -DatabaseName $targetDatabase ` -UseDestinationDefaultDirectories ` -ReplaceExisting ` -NoRecovery ` -TrustDbBackupHistory # 所有备份处理完成后,将数据库切换为可访问状态 Set-DbaDbState -SqlInstance $sqlInstance -Database $targetDatabase -Online
定时任务运行注意事项
- 运行PowerShell脚本的Windows账号,需要同时满足两个权限:对备份文件夹的读取权限、SQL Server实例上的sysadmin服务器角色
- 排序逻辑不受文件复制时间的影响:哪怕Python拉取的所有文件在目标目录的系统创建时间都是当日,排序依然严格基于文件名内容执行
- 可在排序完成后增加前置校验:确认排序后的第一个文件为.bak全量备份文件,避免备份文件拉取不全导致的还原失败
内容的提问来源于stack exchange,提问作者Java。
相关产品推荐
相关产品推荐

