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
AzureAzure SQLAzure SQL DatabasebacpacSQL Database
Generar un bacpac de Azure SQL Database — Vinicius Deschamps