Обзор: это сценарий PowerShell, созданный для автоматизации резервного копирования базы данных SQL, которое должно выполняться параллельно, насколько это возможно.
Это прекрасно работает.
$ServerInstanceSource = ".\INSTANCE01"
$ServerInstanceDestination = ".\INSTANCE02"
$UserName = 'user'
$PassWord = 'pass'
$GetDBs = Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Username $UserName -Password $Password -Database tempdb -Query "SELECT name FROM sys.databases WHERE database_id > 4 AND recovery_model_desc != 'SIMPLE'"
$Date = (Get-Date -Format 'yyyyMMddhhmmss')
$BackupSourceDirectory = 'F:\DB-BACKUP\SQLBACKUP\Manual Logshipping Restoration\'
$BackupDestinationDirectory = 'D:\BACKUPS\'
Get-Job | Remove-Job -Force
Write-Output "Creating FULL backup. . ."
ForEach($db in $GetDBs.name){
$FileName = "FULL-$db-$Date.bak"
$FullBackupPath = Join-Path -Path $BackupSourceDirectory -ChildPath $FileName
$BackupFullScript = "BACKUP DATABASE $db TO DISK = N'$FullBackupPath' WITH NOFORMAT, NOINIT, NAME = N'$db-FULL Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10"
$SQLBackupFull = "Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Username $UserName -Password $Password -Database tempdb -Query `"$BackupFullScript`" -QueryTimeout 21600;" # 5 hours
[scriptblock]$cmdblock1 = [ScriptBlock]::Create($SQLBackupFull)
Start-Job $cmdblock1
}
Get-Job | Wait-Job
Get-Job | Receive-Job
Однако, когда я преобразовал код для принятия учетных данных вместо жестко запрограммированных, я получаю ошибки:
$ServerInstanceSource = ".\INSTANCE01"
$ServerInstanceDestination = ".\INSTANCE02"
$Cred = Get-Credential
$GetDBs = Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Credential $Cred -Database tempdb -Query "SELECT name FROM sys.databases WHERE database_id > 4 AND recovery_model_desc != 'SIMPLE' -- Dynamic; Input specific databases only, if necessary."
$Date = (Get-Date -Format 'yyyyMMddhhmmss')
$BackupSourceDirectory = 'C:\Users\edgar.bayron\Music\Edgar\Trash Can\DB-BACKUP\SQLBACKUP\LAX-DBMON\' # "F:\DB-BACKUP\SQLBACKUP\Manual Logshipping Restoration\"
$BackupDestinationDirectory = 'C:\Users\edgar.bayron\Music\Edgar\Trash Can\DB-BACKUP\SQLBACKUP\DAL-INDBS01\' # "D:\BACKUPS\"
Get-Job | Remove-Job -Force
Write-Output "Creating FULL backup. . ."
ForEach($db in $GetDBs.name){
$FileName = "FULL-$db-$Date.bak"
$FullBackupPath = Join-Path -Path $BackupSourceDirectory -ChildPath $FileName
$BackupFullScript = "BACKUP DATABASE $db TO DISK = N'$FullBackupPath' WITH NOFORMAT, NOINIT, NAME = N'$db-FULL Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10"
$SQLBackupFull = "Invoke-Sqlcmd -ServerInstance $ServerInstanceSource -Credential $Cred -Database tempdb -Query `"$BackupFullScript`" -QueryTimeout 21600;" # 5 hours
[scriptblock]$cmdblock1 = [ScriptBlock]::Create($SQLBackupFull)
Start-Job $cmdblock1
}
Get-Job | Wait-Job
Get-Job | Receive-Job
Ошибка:
Wait-Job : The Wait-Job cmdlet cannot finish working, because one or more jobs are blocked waiting for user interaction. Process interactive job
output by using the Receive-Job cmdlet, and then try again.
Я пытаюсь применить то, что было рекомендовано здесь, но я не могу полностью применить его, поскольку в примере у него только один параметр, а у меня их несколько. Если я пытаюсь применить его, он ищет другие переменные.
Я пытался использовать {PARAM($ServerInstanceSource, $cred, $BackupFullScript)
, но он прерывает SQL-запрос внутри $BackupFullScript
.
Может ли кто-нибудь помочь мне в этом?
Get-Credential
запрашивает учетные данные, не так ли? Вы смотрели Примеры Get-Credential, чтобы увидеть, как создаватьPSCredential
объекты без запроса? - person AlwaysLearning   schedule 09.07.2021