Scopri come esportare più basi dati contemporaneamente utilizzando SqlPackage e ottimizzare le prestazioni del trasferimento dei dati.
Negli ultimi giorni, mi sono dedicato a un caso di assistenza che richiedeva l’esportazione di più basi dati utilizzando lo strumento SqlPackage. Voglio condividere le lezioni apprese su come effettuare l’esportazione simultanea di diverse basi dati salvando i file di esportazione nella cartella F:sql e memorizzando i registri delle operazioni nella cartella F:sqllog.
Consigli per le esportazioni
Quando si esportano dati in modo simultaneo, è importante considerare alcuni suggerimenti per ottimizzare il processo:
- Abilitare il Networking Accellerato: Questo migliora notevolmente le prestazioni del trasferimento dei dati.
- Macchina Virtuale:
- Assicurarsi che la macchina sia nella stessa regione del server.
- Verificare che la macchina virtuale disponga di spazio sufficiente nella cartella
%temp%
per i file temporanei generati durante il processo. Affrontare problemi di spazio insufficiente potrebbe essere problematico. - È essenziale che la macchina abbia una capacità CPU adeguata, idealmente tra 4 e 8 CPU, a seconda del volume delle operazioni.
- Utilizzare archiviazione SSD o Premium per prestazioni migliori.
Esempio di script PowerShell
Di seguito è riportato uno script PowerShell che illustra come eseguire l’esportazione di più basi dati simultaneamente:
# Definisci il percorso del file SqlPackage.exe$SqlPackagePath = "C:\Program Files\Microsoft SQL Server\XXX\DAC\bin\SqlPackage.exe"# Definisci il server, l'utente e la password$serverName = "servername.database.windows.net"$username = "username"$password = "password"$outputFolder = "f:\sql"$logFolder = "f:\sql\logs"$databaseList = @("db1", "db2")# Crea la cartella dei log se non esisteif (-Not (Test-Path -Path $logFolder)) { New-Item -ItemType Directory -Path $logFolder}foreach ($database in $databaseList) { $outputFile = Join-Path -Path $outputFolder -ChildPath "$database.bacpac" $logFile = Join-Path -Path $logFolder -ChildPath "$database.log" $errorLogFile = Join-Path -Path $logFolder -ChildPath "$database-error.log" $args = @( "/Action:Export", "/ssn:$serverName", "/sdn:$database", "/su:$username", "/sp:$password", "/tf:$outputFile" ) # Avvia il processo in background con la ridirezione del log Write-Host "Inizio l'esportazione del database $database su $outputFile in background" Start-Job -ScriptBlock { param($exePath, $arguments, $log, $errorLog) & $exePath @arguments *>$log 2>$errorLog } -ArgumentList $SqlPackagePath, $args, $logFile, $errorLogFile}Write-Host "Processi di esportazione in background avviati per tutte le basi dati."# Attendi il completamento di tutti i processi in background$jobs = Get-Jobforeach ($job in $jobs) { Wait-Job -Job $job $jobDetails = Receive-Job -Job $job Write-Host "Job ID $($job.Id) completato con stato: $($job.State)" Remove-Job -Job $job}Write-Host "Esportazione completata per tutte le basi dati. I registri si trovano nella cartella $logFolder."
Questo script illustra come esportare più basi dati in background, reindirizzando i registri e gli errori in file separati. È fondamentale eseguire sempre una revisione e un processo di test accurati prima di implementarlo in un ambiente di produzione per garantire che soddisfi le esigenze operative e le politiche di sicurezza dell’organizzazione.
Avvertenze
Ricorda che SqlPackage esporta i dati, ma non garantisce la consistenza transazionale. Per maggiori dettagli, consulta questo articolo sulla migrazione di database usando applicazioni livello dati (BACPAC).