使用Restore-DbaDatabase报错:Cannot index into a null array 求助
问题分析与解决
错误原因
出现Cannot index into a null array错误的核心原因是备份文件的传递顺序不符合DbaTools的备份链识别逻辑。原脚本通过Get-ChildItem同时获取全量备份和日志备份目录的文件,返回的文件顺序随机(取决于系统文件排序规则),可能导致日志文件排在全量备份之前,使得Restore-DbaDatabase无法识别有效的备份起始点,内部处理时触发空数组索引错误。
解决方案
需要手动对备份文件按备份链顺序排序:先处理最新的全量备份,再按时间升序处理全量备份之后的所有日志备份。修改后的脚本如下:
# 获取最近24小时内的最新全量备份 $fullBackups = Get-ChildItem '\\bckp01\sql_backups$\Business\FULL_COPY_ONLY' | Where-Object {$_.CreationTime -gt (Get-Date).AddDays(-1)} | Sort-Object CreationTime -Descending | Select-Object -First 1 # 仅获取全量备份之后生成的日志备份,并按时间升序排列(恢复顺序) $logBackups = Get-ChildItem '\\bckp01\sql_backups$\Business\LOG' | Where-Object {$_.CreationTime -gt $fullBackups.CreationTime} | Sort-Object CreationTime -Ascending # 按恢复顺序合并备份文件:先全量,后日志 $File = $fullBackups + $logBackups # 执行恢复操作 $File | Restore-DbaDatabase -SqlInstance Server2 -Database Business -NoRecovery -OutputScriptOnly -ReuseSourceFolderStructure -WhatIf
额外验证步骤
- 若仍报错,可先移除
-OutputScriptOnly参数,直接执行恢复测试,排除脚本生成环节的潜在问题; - 加入全量备份存在性判断,避免空值传递:
if (-not $fullBackups) { Write-Error "未找到符合条件的全量备份文件" exit }
内容的提问来源于stack exchange,提问作者user1967479
相关产品推荐
相关产品推荐

