我有一个SQL数据库,我想在与备份服务器不同的服务器上每晚恢复该数据库。我试图通过任务调度器在特定时间启动powershell脚本来实现这一点。我有一个powershell脚本,将恢复MS SQL数据库:
$SharedFolder = "C:Backups"
$RelocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("Database_dat", "C:DatabaseXXYYZZ.mdf")
$RelocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("Database_log", "C:DatabaseXXYYZZ.ldf")
Restore-SqlDatabase -ServerInstance "XXYYZZTEST" -Database "newXXYYZZ" -BackupFile "$($SharedFolder)tuesday_backup.bak" -RelocateFile @($RelocateData,$RelocateLog) -ReplaceDatabase
不幸的是,我第一次在Powershell ISE中运行这个脚本时,我收到了这个红色错误:
New-Object: Cannot find type>[Microsoft.SqlServer.Management.Smo。:验证包含此类型的程序集是否已加载。
分别对应$RelocateData和$RelocateLog。然后脚本失败,显示以下红色错误:
Restore-SqlDatabase: Object reference not set to a instance of Object .
如果我再次运行脚本而不关闭Powershell ISE,它在每次后续运行中都运行良好。只要我关闭Powershell ISE并再次打开它,第一次运行时就会返回错误,然后一切正常。我对powershell的了解有限,这妨碍了我寻找解决这些汇编错误的方法。
当从任务调度程序启动时,它根本没有成功运行,但所有任务调度程序操作都成功完成。我已经尝试运行任务作为不同的管理用户,最高优先级,改变文件夹中的开始。似乎没有什么帮助,我怀疑这是上面描述的关于程序集的问题。
任何想法/建议吗?有没有更好的方法来完成我正在尝试的事情?
增加Import-Module -Name SqlServer一行,用于加载powershell模块。脚本现在看起来像这样:
Import-Module -Name SqlServer
$SharedFolder = "C:Backups"
$RelocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("Database_dat", "C:DatabaseXXYYZZ.mdf")
$RelocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("Database_log", "C:DatabaseXXYYZZ.ldf")
Restore-SqlDatabase -ServerInstance "XXYYZZTEST" -Database "newXXYYZZ" -BackupFile "$($SharedFolder)tuesday_backup.bak" -RelocateFile @($RelocateData,$RelocateLog) -ReplaceDatabase
脚本现在可以在powershell和任务调度程序中无错误运行。