Existem várias maneiras de transferir um bacpac de um Azure SQL Database para um armazenamento. Porém, você toma alguns cuidados para que a exportação seja transacionalmente consistente.
Transacionalmente Consistente
Uma coisa a não esquecer é que nos bastidores o Azure SQL Database está localizado em um SQL Server, portanto, os mesmos conceitos ainda são válidos e provavelmente soa a campainha ao ouvir estas palavras: log de transações.
Antigamente, os logs de transações eram tão importantes quanto o banco de dados; portanto, se houvesse uma falha no sistema, esses logs seriam necessários para colocar o banco de dados em um estado consistente.
Obtendo um bacpac transacionalmente consistente
Em primeiro lugar, sei que usando o Azure SQL não vemos os logs de transações com tanta frequência, mas eles ainda estão lá, acredite em mim!
Em segundo lugar, e mais importante, você nunca deve exportar um banco de dados ativo porque, para ter um arquivo consistente, você deve garantir que nenhuma atividade de gravação esteja ocorrendo durante a exportação. Provavelmente, você não conseguirá congelar a atividade de gravação, sua etapa inicial é Copiar o banco de dados
Uma cópia do banco de dados é um instantâneo do banco de dados de origem no momento da solicitação de cópia e transacionalmente consistente! Então, depois de obter o banco de dados copiado, é hora de exportar o banco de dados copiado
Hands on
Como mencionei anteriormente no post, existem várias maneiras de conseguir um bacpac, e vou mostrar 2 possibilidades
Azure Portal
Powershell
Import-Module Az
Connect-AzAccount
# Replace by your environment information
$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
# Copy database
Write-Host "Copying" $databaseName "to" $copyDatabaseName
New-AzSqlDatabaseCopy -ResourceGroupName $resourceGroupSQL -ServerName $sqlServer -DatabaseName $databaseName -CopyResourceGroupName $resourceGroupSQL -CopyServerName $sqlServer -CopyDatabaseName $copyDatabaseName
Write-Host "Copy completed"
# Export database
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
}
# Remove the copied database
Remove-AzSqlDatabase -ResourceGroupName $resourceGroupSQL -ServerName $sqlServer -DatabaseName $copyDatabaseName
Deixe um comentário