Azure · Database · SQL
Generar un bacpac de Azure SQL Database
Existen varias maneras de transferir un bacpac de Azure SQL Database hacia un almacenamiento. Sin embargo, debes tomar algunos cuidados para que la exportación sea transaccionalmente consistente.
Transaccionalmente Consistente
Una cosa a no olvidar es que, en segundo plano, Azure SQL Database está ubicado en un SQL Server, por lo tanto, los mismos conceptos siguen siendo válidos y probablemente suene la campanita al escuchar estas palabras: log de transacciones.
Antiguamente, los logs de transacciones eran tan importantes como la propia base de datos; por lo tanto, si hubiera una falla en el sistema, esos logs serían necesarios para dejar la base de datos en un estado consistente.
Obteniendo un bacpac transaccionalmente consistente
En primer lugar, sé que usando Azure SQL no vemos los logs de transacciones con tanta frecuencia, pero todavía están ahí, ¡créeme!
En segundo lugar, y lo más importante, nunca debes exportar una base de datos activa porque, para tener un archivo consistente, debes garantizar que ninguna actividad de escritura esté ocurriendo durante la exportación. Probablemente no podrás congelar la actividad de escritura, tu paso inicial es Copiar la base de datos
Una copia de la base de datos es un instantáneo de la base de datos de origen en el momento de la solicitud de copia y transaccionalmente consistente! Entonces, después de obtener la base de datos copiada, es hora de exportar la base de datos copiada
Hands on
Como mencioné anteriormente en el post, existen varias formas de obtener un bacpac, y voy a mostrar 2 posibilidades
Azure Portal
Powershell
Import-Module Az
Connect-AzAccount
# Reemplace por la información de su entorno
$resourceGroupSQL = "blog-vinicius-deschamps" #
$resourceGroupStorage = "blog-vinicius-deschamps"
$sqlServer = "blogviniciusdeschamps"
$sqlUsername = "saviniciusdeschamps"
$sqlPassword = "my$up3rP@ssW0rD!"
$securePassword = ConvertTo-SecureString -String $sqlPassword -AsPlainText -Force
$sqlCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $sqlUsername, $securePassword
$databaseName = "viniciusdeschamps-db"
$storageAccount = "blogviniciusdeschampsdia"
$containerName = "sqlexport"
# You don't need to change the next lines
$bacpacFilename = (Get-Date).ToString("yyyy-MM-dd-HH-mm") + ".bacpac"
$storageKeyType = "StorageAccessKey"
$storageKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupStorage -AccountName $storageAccount)| Where-Object {$_.KeyName -eq "key2"}
$copyDatabaseName = (Get-Date).ToString("yyyyMMddHHmmss") + "-" + $databaseName
$bacpacFilename = (Get-Date).ToString("yyyy-MM-dd") + "-" + $copyDatabaseName + ".bacpac"
$baseStorageUri = "https://" + $storageAccount + ".blob.core.windows.net"
$bacpacUri = $baseStorageUri + "/" + $containerName + "/" + $bacpacFilename
# Copiar base de datos
Write-Host "Copying" $databaseName "to" $copyDatabaseName
New-AzSqlDatabaseCopy -ResourceGroupName $resourceGroupSQL -ServerName $sqlServer -DatabaseName $databaseName -CopyResourceGroupName $resourceGroupSQL -CopyServerName $sqlServer -CopyDatabaseName $copyDatabaseName
Write-Host "Copy completed"
# Exportar base de datos
Write-Host "Exporting" $copyDatabaseName "to" $bacpacUri
$exportRequest = New-AzSqlDatabaseExport -ResourceGroupName $resourceGroupSQL -ServerName $sqlServer -DatabaseName $copyDatabaseName -StorageKeyType "StorageAccessKey" -StorageKey $storageKey.Value -StorageUri $bacpacUri -AdministratorLogin $sqlCredentials.UserName -AdministratorLoginPassword $sqlCredentials.Password
$exportRequest
$exportStatus = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
while ($exportStatus.Status -eq "InProgress")
{
Start-Sleep -s 10
$exportStatus = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
}
# Remover a base de datos copiada
Remove-AzSqlDatabase -ResourceGroupName $resourceGroupSQL -ServerName $sqlServer -DatabaseName $copyDatabaseName