Vai al contenuto

Esportare Multiple Basi Dati Simultaneamente con SqlPackage

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).