С помощью некоторых онлайн-ресурсов я скомпилировал сценарий PowerShell, который:
Код работает нормально, если я разобью его и запустил индивидуально. Однако, когда я их объединяю, он работает до восстановления и просто останавливается. Ниже приведен код. Любая помощь в определении того, почему я могу выбрать сценарий восстановления, запустить только его, и он работает, но не когда он запускается в целом, будет полезен.
Обновление 1: я создал упрощенную версию кода, которая все еще не работает, но имеет только соединение с использованием WINSCP, завершение процесса SSMS и восстановление. Для меня процесс уничтожения - это просто визуальная очередь, чтобы увидеть, как он выполняется.
Обновление 2: я обнаружил, что если поместить сценарий восстановления в session.open, он будет работать нормально. Однако мне неудобно оставлять сеанс открытым, поскольку sql его восстанавливает, это кажется ... не знаю, как это сказать, но неправильно.
$localPath = "C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\Backup\"
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "url.com"
UserName = "username"
Password = "password"
SshHostKeyFingerprint = "ssh stuff"
}
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
exit 0
catch
{
Write-Host "Error: $($_.Exception.Message)"
exit 1
}
#restore database
$Program = Get-Process SSMS -erroraction SilentlyContinue
if ($Program)
{
$Program.closeMainWindow()
Sleep 5
If (!$Program.hasexited)
{
$program | stop-process -force
}
}
remove-variable Program
$FileNam = Get-ChildItem -path $localpath
Restore-SqlDatabase -ServerInstance "machine\instance" -Database "Test" -BackupFile $FileName -ReplaceDatabase
Сколько файлов в $path
при вызове $FileName = Get-ChildItem -path $path
?
Убейте ssms в качестве меры предосторожности на случай, если кто-то окажется в нем. Скрипт запускается в 7 утра после того, как сервер отключается, просто перебор. В папке всего 1 файл. Я использую get-childitem, поскольку имя меняется изо дня в день.
«работает до восстановления и просто останавливается». Возможно, он восстанавливается - войдите в SQL Server и используйте sp_who2
для проверки активности на SQL Server.
Привет, Ник, спасибо за информацию. Проверил, и он не показал, что скрипт PowerShell запущен. Я также подтвердил, что он не восстанавливается, потому что изменения, сделанные до запуска скрипта, не были возвращены (я изменил несколько значений на NULL для проверки).
Ответ решен / найден. Перемещение восстановления в раздел «попробовать» разрешило его, даже если оно было удалено после удаления соединения. Скорее всего, это связано с выходом 0. Другое решение - полностью удалить коды try / catch и exit.
Зачем ты убиваешь SSMS так? При восстановлении базы данных в этом нет необходимости.