SQL Server 2008 non utilizza il percorso del dispositivo di backup quando si esegue lo script di PowerShell dal prompt
-
20-12-2019 - |
Domanda
Ho fatto uno script che esegue il backup di tutti i database del mio server remoto.Quando eseguo lo script dall'interfaccia ISE PowerShell, il percorso che determinerò nel dispositivo di backup funziona bene, ma quando lo eseguo dal prompt, il percorso I impostato viene ignorato e il backup viene effettuato sulla directory di backup predefinita di SQL Server.Perché è così, e come posso aggiustarlo? Di seguito è riportato il mio script:
$DestSqlTpb = "E:\BackupBD\SQL-TPB-01\";
$PastaRede = "\\sql-tpb1-01\BackupBD\SQL-TPB-01\";
Write-Output ("Started DELETE at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
$ComandoDeleteRede = $PastaRede + "*"
remove-item $ComandoDeleteRede
$ComandoSqlTpbLocal = $DestSqlTpb + "*"
remove-item $ComandoSqlTpbLocal
Write-Output ("Finished DELETE at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ConnectionInfo');
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Management.Sdk.Sfc');
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO');
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended');
$Server = "SQL-TPB1-01\SQL2008"; # SQL Server Instance.
$srv = new-object ("Microsoft.SqlServer.Management.Smo.Server") $Server
Write-Output ("Started SQL-TPB1-01 at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
$dbs = $srv.Databases
foreach ($db in $dbs)
{
if (($db.Name -ne "tempdb") -and (!$db.IsDatabaseSnapshot)) #We don't want to backup the tempdb database
{
$timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;
$backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");
$backup.Action = "Database";
$backup.Database = $db.Name;
$backup.Devices.AddDevice($Dest + $db.Name + "_full_" + $timestamp + ".bak", "File");
$backup.BackupSetDescription = "Full backup of " + $db.Name + " " + $timestamp;
$backup.Incremental = 0;
$backup.CompressionOption = 1;
# Starting full backup process.
$backup.SqlBackup($srv);
# For db with recovery mode <> simple: Log backup.
If ($db.RecoveryModel -ne 3)
{
$timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;
$backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");
$backup.Action = "Log";
$backup.Database = $db.Name;
$backup.Devices.AddDevice($Dest + $db.Name + "_log_" + $timestamp + ".trn", "File");
$backup.BackupSetDescription = "Log backup of " + $db.Name + " " + $timestamp;
#Specify that the log must be truncated after the backup is complete.
$backup.LogTruncation = "Truncate";
# Starting log backup process
$backup.SqlBackup($srv);
};
};
};
Write-Output ("Finished SQL-TPB1-01 at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
Write-Output ("Started COPY at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
copy-item $ComandoDeleteRede $DestSqlTpb
Write-Output ("Finished COPY at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
.
Quando sono appena eseguito da ISE, va bene, ma se salvo il file PS1 ed eseguiti dal prompt, il percorso nel dispositivo viene ignorato.TKS
Soluzione
Scommetto che il problema è con questa linea:
$backup.Devices.AddDevice($Dest + $db.Name + "_full_" + $timestamp + ".bak", "File");
.
Si sta utilizzando la variabile $ DEST, che non è definita ovunque nel tuo script.Scommetto che hai la variabile $ DEST impostata sul percorso che desideri nella sessione ISE, motivo per cui è il lavoro lì.
Ma in una nuova finestra console, $ DEST è NULL, quindi SQL utilizza il percorso predefinito.