使用Restore-DbaDatabase恢复数据库时提示无备份文件的问题
问题场景
通过以下PowerShell命令获取到了存在的备份文件:
$backupFiles = Get-ChildItem -Path $BackupPath -Filter "*$tstamp*.bak" -Recurse | Sort-Object -Property CreationTime | Select-Object
$backupFiles输出显示存在目标bak文件:
Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/8/2022 10:36 PM 130576384 WP04034XXXXX_WebStrat_20220908223605_full.bak
但执行恢复命令时:
$backupFiles | Restore-DbaDatabase -SqlInstance $primaryReplica -useDestinationDefaultDirectories -WithReplace
出现警告导致恢复失败:
WARNING: [16:12:02][Restore-DbaDatabase] No backups passed through.
This could mean the SQL instance cannot see the referenced files, the file's headers could not be read or some other issue
使用的Restore-DbaDatabase版本为0.9.188。
可能原因及解决方法
对象属性未正确传递
0.9.188版本的Restore-DbaDatabase对FileInfo对象的解析存在局限,直接传递Get-ChildItem返回的对象可能无法被识别为有效备份路径。需要明确传递文件的完整路径:# 方法1:直接传递FullName属性 $backupFiles.FullName | Restore-DbaDatabase -SqlInstance $primaryReplica -useDestinationDefaultDirectories -WithReplace # 方法2:修改获取文件的命令,直接返回路径字符串 $backupFiles = Get-ChildItem -Path $BackupPath -Filter "*$tstamp*.bak" -Recurse | Sort-Object CreationTime | Select-Object -ExpandProperty FullNameSQL Server服务账户无文件访问权限
本地用户能看到备份文件,但SQL Server服务账户(运行SQL实例的账户,如NT SERVICE\MSSQLSERVER)可能没有$BackupPath路径的读取权限:- 若为本地目录:检查目录的NTFS权限,确保SQL服务账户拥有读取权限;
- 若为网络共享:确保SQL服务账户能访问共享路径,且共享权限和NTFS权限均配置正确。
备份文件损坏或无法读取
备份文件存在但可能损坏,或SQL Server无法读取其头部信息。可通过以下方式验证:# 使用dbatools命令测试备份有效性 Test-DbaBackup -SqlInstance $primaryReplica -Path $backupFiles.FullName或在SSMS中执行SQL命令:
RESTORE HEADERONLY FROM DISK = '备份文件的完整路径'若命令返回错误,说明文件损坏或格式不被当前SQL实例支持。
旧版本dbatools的bug
0.9.188是较旧的dbatools版本,存在已知的参数解析或对象处理bug。建议升级到最新稳定版dbatools,新版本对备份恢复的逻辑做了大量优化。
内容的提问来源于stack exchange,提问作者Leo Torres

