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

AzureBackupbacpacSQL Database
Obtener un bacpac de Azure SQL Database — Vinicius Deschamps