, ,

Gerar um bacpac Azure SQL Database

Avatar de Vinicius

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
Avatar de Vinicius

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *