调用Invoke-DbaDbLogShipping配置日志传送报ExecuteWithResults异常如何解决
异常根因说明
第一层的ExecutionFailureException是核心错误,本质是命令执行过程中调用的T-SQL批量语句执行失败,导致返回的结果集为空;第二层的NullArray错误是连锁问题,因为$batchresult为空,调用其Tables.rows属性时触发空引用报错。
常见触发核心错误的原因如下:
- 权限不符合要求:运行PowerShell的账号对源、目标SQL实例没有sysadmin权限;PowerShell运行账号、源/目标SQL Server服务账号对备份网络路径
\\sql1\logshipping、本地备份路径均没有读写权限。 - 路径配置问题:
\\sql1\logshipping网络路径不可达、共享权限未开放;本地备份路径包含特殊字符或空格未正确解析,或者路径不存在。 - 数据库属性不满足要求:源库
Test为简单恢复模式,日志传送要求必须为完整/大容量日志恢复模式;源库已有残留的日志传送配置,目标实例已存在同名的在线Test库引发冲突。 - 实例连接异常:目标实例
localhost\MSSQLSERVER01未开启TCP/IP协议、SQL浏览器服务未启动,导致连接失败。 - 工具版本bug:你使用的dbatools 1.0.173属于老旧版本,存在已知的日志传送配置逻辑缺陷。
排查处理方案
- 确认源库恢复模式:在源SQL实例执行如下语句校验
SELECT name, recovery_model_desc FROM sys.databases WHERE name = N'Test'
如果返回SIMPLE,执行如下语句修改恢复模式:
ALTER DATABASE Test SET RECOVERY FULL WITH NO_WAIT
- 验证权限配置:确认PowerShell运行账号、源和目标SQL Server服务账号对两个备份路径都有完全控制权限,且三个账号在两个SQL实例中都属于sysadmin角色。
- 校验路径可用性:手动访问
\\sql1\logshipping确认可以正常读写文件,本地备份路径建议更换为无空格、无特殊字符的路径测试,比如C:\LogShippingBackups。 - 清理历史残留配置:手动删除源库原有日志传送配置,目标实例如果已存在
Test库,先删除或者设置为还原状态。 - 升级dbatools到最新稳定版:执行如下命令更新工具版本,修复已知bug
Update-Module dbatools -Force
- 定位具体错误点:执行命令前先开启调试模式,输出完整的报错信息:
$DebugPreference = 'Continue' Invoke-DbaDbLogShipping @params -Verbose
可以直接打印出执行失败的具体T-SQL语句,快速定位问题。
内容的提问来源于stack exchange,提问作者Cataster
相关产品推荐
相关产品推荐

