Azure · Backup · Database
Obtener un bacpac de Azure SQL Database
Hay varias formas de obtener un bacpac de un Azure SQL Database hacia un almacenamiento. Sin embargo, hay que tomar precauciones para que la exportación sea transaccionalmente consistente.
Consistencia transaccional
Una cosa que no se debe olvidar es que detrás de escena el Azure SQL Database está sentado en un SQL Server, por lo tanto, los mismos conceptos siguen siendo válidos, y probablemente suene familiar escuchar estas palabras: transaction log.
En el pasado, los registros de transacciones eran tan importantes como la base de datos, así que si hay una falla del sistema, estos registros serían necesarios para llevar la base de datos a un estado consistente.
Obtener un bacpac con consistencia transaccional
En primer lugar, sé que usando Azure SQL no vemos los registros de transacciones con frecuencia, pero siguen ahí, ¡créeme!
En segundo lugar, y lo más importante nunca debes exportar una base de datos activa porque para obtener un archivo consistente, debes asegurarte de que no haya actividad de escritura durante la exportación. Lo más probable es que no puedas congelar la actividad de escritura, tu primer paso es
Copiar la base de datos
Una copia de base de datos es una instantánea de la base de datos fuente en el momento de la solicitud de copia, y ¡con consistencia transaccional! Así que, una vez que obtienes la base de datos copiada, es hora de
Exportar la base de datos copiada
Manos a la obra
Como mencioné anteriormente en la publicación, hay varias formas de obtener un bacpac, y voy a mostrar 2 posibilidades
Azure Portal
[trp_language language=”en_US”]
[/trp_language]
[trp_language language=”pt_BR”]
[/trp_language]
Powershell
[trp_language language=”en_US”]
[/trp_language]
[trp_language language=”pt_BR”]
[/trp_language]
Import-Module Az
Connect-AzAccount
# Reemplaza por la información de tu 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"
# No necesitas cambiar las siguientes líneas
$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 "Exportando" $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
}
# Eliminar la base de datos copiada
Remove-AzSqlDatabase -ResourceGroupName $resourceGroupSQL -ServerName $sqlServer -DatabaseName $copyDatabaseName
Y eso es todo
Espero que te haya gustado, y nos vemos en mi próxima publicación
Foto por chuttersnap en Unsplash