Exercício – Restaurar para um ponto anterior no tempo

Concluído

Neste exercício, você aprenderá como se recuperar de um erro comum usando a restauração point-in-time (PITR). Este processo é fácil de realizar no portal ou de forma programática. Neste exercício, aprenderá a fazê-lo através da CLI do Azure.

Instalação: usar scripts para implantar o Banco de Dados SQL do Azure

No terminal à direita, você verá o Azure Cloud Shell, que é uma maneira de interagir com o Azure usando um navegador. Antes de iniciar os exercícios, tem de executar um script aqui para criar o seu ambiente: uma Base de Dados SQL do Azure com a base de dados AdventureWorks. No script, ser-lhe-á pedida uma palavra-passe e o endereço IP local.

A conclusão destes scripts deve demorar entre 3 e 5 minutos. Certifique-se de anotar sua senha, ID exclusivo e região, pois eles não serão mostrados novamente.

  1. Para obter o endereço IP necessário, tem de sair de qualquer serviço VPN e executar (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content numa janela do PowerShell local (não neste browser). Anote o endereço IP resultante.

  2. Execute o script seguinte no Azure Cloud Shell no lado direito desta página. Quando lhe for pedido, introduza uma palavra-passe complexa e o endereço IP público.

    $adminSqlLogin = "cloudadmin"
    $password = Read-Host "Your username is 'cloudadmin'. Please enter a password for your Azure SQL Database server that meets the password requirements"
    # Prompt for local IP address
    $ipAddress = Read-Host "Disconnect your VPN, open PowerShell on your machine and run '(Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content'. Please enter the value (include periods) next to 'Address': "
    # Get resource group and location and random string
    $resourceGroup = Get-AzResourceGroup | Where ResourceGroupName -like "<rgn>Sandbox resource group name</rgn>"
    $resourceGroupName = "<rgn>Sandbox resource group name</rgn>"
    $uniqueID = Get-Random -Minimum 100000 -Maximum 1000000
    $storageAccountName = "mslearnsa"+$uniqueID
    $location = $resourceGroup.Location
    # The logical server name has to be unique in the system
    $serverName = "aw-server$($uniqueID)"
    
  3. Escreva e guarde (num ficheiro de texto ou numa localização semelhante) as informações de que irá precisar ao longo deste módulo ao executar o seguinte script no Azure Cloud Shell. Provavelmente terá de selecionar Introduzir depois de colar o código, porque a última linha não é executada por predefinição.

    Write-Host "Please note your unique ID for future exercises in this module:"  
    Write-Host $uniqueID
    Write-Host "Your resource group name is:"
    Write-Host $resourceGroupName
    Write-Host "Your resources were deployed in the following region:"
    Write-Host $location
    Write-Host "Your server name is:"
    Write-Host $serverName
    

    Importante

    Não se esqueça de anotar a palavra-passe, o ID exclusivo e a região. Precisará dessas informações ao longo do módulo.

  4. Execute o seguinte script para implementar uma base de dados SQL do Azure e o servidor lógico com o exemplo da AdventureWorks. Esse script também adiciona seu endereço IP como uma regra de firewall, habilita o Microsoft Defender for Cloud e cria uma conta de armazenamento para uso em unidades futuras.

    # The logical server name has to be unique in the system
    $serverName = "aw-server$($uniqueID)"
    # The sample database name
    $databaseName = "AdventureWorks"
    # The storage account name has to be unique in the system
    $storageAccountName = $("sql$($uniqueID)")
    # Create a new server with a system-wide unique server name
    $server = New-AzSqlServer -ResourceGroupName $resourceGroupName `
        -ServerName $serverName `
        -Location $location `
        -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminSqlLogin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))
    # Create a server firewall rule that allows access from the specified IP range and all Azure services
    $serverFirewallRule = New-AzSqlServerFirewallRule `
        -ResourceGroupName $resourceGroupName `
        -ServerName $serverName `
        -FirewallRuleName "AllowedIPs" `
        -StartIpAddress $ipAddress -EndIpAddress $ipAddress
    $allowAzureIpsRule = New-AzSqlServerFirewallRule `
        -ResourceGroupName $resourceGroupName `
        -ServerName $serverName `
        -AllowAllAzureIPs
    # Create a database
    $database = New-AzSqlDatabase  -ResourceGroupName $resourceGroupName `
        -ServerName $serverName `
        -DatabaseName $databaseName `
        -SampleName "AdventureWorksLT" `
        -Edition "GeneralPurpose" -Vcore 2 -ComputeGeneration "Gen5"
    # Enable Azure Defender
    $azureDefender = Enable-AzSqlServerAdvancedDataSecurity `
        -ResourceGroupName $resourceGroupName `
        -ServerName $serverName
    # Create a storage account
    $storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName `
        -AccountName $storageAccountName `
        -Location $location `
        -Type "Standard_LRS"
    
  5. No computador local, abra o SQL Server Management Studio e crie uma nova ligação para o servidor lógico. Para o nome do servidor, introduza o nome do servidor lógico da Base de Dados SQL do Azure. Se não guardou o nome anteriormente, talvez tenha de consultar o portal do Azure para o obter. Por exemplo: aw-server<unique ID.database.windows.net>.

    1. Quando estiver no portal do Azure, pode introduzir AdventureWorks na caixa de pesquisa para encontrar a base de dados e o servidor lógico associado.

    2. Selecione a caixa Autenticação e introduza Autenticação do SQL Server. Introduza as informações de Início de Sessão e a Palavra-passe de Administrador do Servidor correspondentes (que introduziu durante a implementação no exercício anterior).

    3. Marque a caixa Lembrar senha e selecione Conectar.

    Screenshot that shows how to connect to SQL Database in SSMS.

    Nota

    Consoante a configuração local (por exemplo, VPN), o endereço IP de cliente poderá ser diferente do endereço IP que o portal do Azure utilizou durante a implementação. Se for o caso, verá a mensagem “O endereço IP de cliente não tem acesso ao servidor. Entre em uma conta do Azure e crie uma nova regra de firewall para habilitar o acesso." Se receber esta mensagem, inicie sessão com a conta que está a utilizar para a sandbox e adicione uma regra de firewall para o endereço IP do cliente. Pode concluir estes passos com o assistente de pop-up no SQL Server Management Studio.

PITR completo

Antes de avançar, é importante compreender o processo recomendado para fazer o restauro para um ponto anterior no tempo:

  1. Por engano, é eliminada uma tabela ou uma base de dados.
  2. Determine o tempo para o qual você precisa voltar; deve ser antes do erro acontecer.
  3. Complete o restauro para um ponto anterior no tempo através do PowerShell ou do portal do Azure para regressar a este momento. Este processo implementa uma nova base de dados e restaura uma cópia da base de dados. Por exemplo: AdventureWorks-copy.
  4. Confirme se o novo banco de dados (por exemplo, AdventureWorks-copy) está no estado correto (como estava antes do acidente).
  5. Mude o nome da base de dados original. Por exemplo, renomeie AdventureWorks para AdventureWorks-old.
  6. Mude o nome da nova base de dados para o nome da base de dados original. Por exemplo, renomeie AdventureWorks-copy para AdventureWorks.
  7. Elimine a base de dados original. Por exemplo: AdventureWorks-old.

Neste exercício, vai concluir os estes passos.

Simular a eliminação de dados

Primeiro, vamos confirmar que a tabela que vamos eliminar acidentalmente existe e contém dados. Vamos ver alguns dos valores na tabela SalesLT.OrderDetail.

  1. Aceda ao SQL Server Management Studio e verifique/atualize a ligação. Selecione File>Connect Object Explorer e, em seguida, selecione o botão Opções.

  2. Verifique se a ligação utilizada permite ligar ao servidor lógico, mas não a uma base de dados específica (Por exemplo, use <padrão> , conforme mostrado na captura de tela a seguir.) Além disso, confirme se a guia Parâmetros de Conexão Adicionais não contém nenhum texto.

    Screenshot that shows the default connection.

  3. Expanda a pasta Bancos de dados, clique com o botão direito do mouse no banco de dados AdventureWorks e selecione Nova consulta. Insira a seguinte consulta e execute-a selecionando Executar e, em seguida, revise os resultados:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Screenshot that shows the sales order detail table.

  4. Simule a perda de dados ao remover uma tabela da base de dados.

    Na mesma janela de consulta, execute esta consulta e, em seguida, selecione a guia Mensagens na janela Resultados e anote o tempo de conclusão:

    DROP TABLE SalesLT.SalesOrderDetail
    

    Importante

    Guarde a hora de conclusão. Precisará dele mais tarde. Eis um exemplo: Completion time: 2020-06-22T09:20:27.1859237-07:00.

  5. Por fim, antes de iniciar as etapas para restaurar o banco de dados, execute o seguinte código no Azure Cloud Shell no lado direito desta página para configurar seu ambiente:

    $resourceGroup = Get-AzResourceGroup | Where ResourceGroupName -like <rgn>Sandbox resource group name</rgn>
    $server = Get-AzureRmSqlServer -ResourceGroupName $resourceGroup.ResourceGroupName
    $logical_server = $server.ServerName
    $resource_group = $resourceGroup.ResourceGroupName
    
    # Specify your default resource group and Azure SQL Database logical server
    az configure --defaults group=$resource_group sql-server=$logical_server
    
    # Confirm the defaults are set
    az configure --list-defaults
    

    Os parâmetros group e sql-server devolvidos devem corresponder aos nomes do grupo de recursos do Microsoft Learn e do servidor lógico da Base de Dados SQL do Azure.

Identificar o tempo para restaurar o banco de dados

O primeiro passo é descobrir o tempo para restaurar o banco de dados. Tem de saber quando ocorreu a última transação “correta” antes da “incorreta”. Vai restaurar antes da transação incorreta, mas depois da última correta.

  1. Uma forma de determinar a hora de remoção é observar a hora de conclusão da instrução DROP, que anotou no passo anterior.

    Uma maneira alternativa é usar os logs de auditoria no portal do Azure. Neste exercício, você não configurou a auditoria para o Log Analytics, mas vamos explorar o que você poderia fazer se tivesse. Você pode ir para seu banco de dados SQL do Azure no portal do Azure. No painel esquerdo, em Segurança, pode selecionar Auditoria e, em seguida, selecionar Ver registos de auditoria. Em seguida, selecionando Log Analytics, você é levado a um editor de consultas que permite consultar logs usando Kusto Query Language (KQL). Os profissionais de SQL podem utilizar esta linguagem de consulta para consultar facilmente os registos.

    Em seguida, você pode executar a seguinte consulta KQL:

    search database_name_s == "AdventureWorks"
    | where Category == 'SQLSecurityAuditEvents' and statement_s like 'DROP'
    | project format_datetime(event_time_t, 'yyyy-MM-dd hh:mm:ss.fff'), ResourceGroup, server_instance_name_s, database_name_s,  statement_s, succeeded_s,client_ip_s, server_principal_name_s, application_name_s
    | sort by event_time_t desc
    

    Os resultados devem ser semelhantes aos seguintes, mas com uma data e hora diferentes.

    Screenshot that shows Log Analytics results.

    Nota

    Pode levar de 5 a 10 minutos para que os logs apareçam aqui, portanto, para os fins deste exercício, deixamos isso de fora. Em vez disso, você usará o tempo de conclusão anotado na etapa anterior. (Você precisa convertê-lo para GMT.) Em uma situação do mundo real, é provável que você não consiga chegar à janela com o tempo de conclusão, então a auditoria pode ser uma grande ajuda.

  2. Neste exemplo, a data/hora é 2020-07-24 08:06:24.386 do Log Analytics e 2020-07-24T13:06:24.386-07:00 do SSMS. O formato exigido é ligeiramente diferente. Utilize o exemplo seguinte para determinar o formato correto. Também poderá querer subtrair 0,001 segundos, para garantir que restaura para uma hora antes da ocorrência do erro:

    • Formato do Log Analytics: 2020-07-24 08:06:24.386
    • Formato do SSMS: 2020-07-24T13:06:24.386-07:00
    • Formato exigido: 2020-07-24T20:06:24.385
  3. Defina $before_error_time como o valor resultante, substituindo seu tempo pelo tempo neste exemplo:

    $before_error_time ="2020-07-24T20:06:24.385"
    

Restaurar a base de dados e confirmar os dados em falta

Nesta secção, vai utilizar az cli db restore para restaurar a base de dados para uma hora antes da tabela ter sido eliminada.

  1. Execute o seguinte script no terminal do lado direito desta janela:

    # Restore the database to a time before the database was deleted
    az sql db restore --dest-name "AdventureWorks-copy" --name "AdventureWorks" --time $before_error_time --verbose
    

    A restauração levará cerca de 5 a 10 minutos. Quando executa um restauro, o Azure implementa uma nova base de dados SQL do Azure no servidor lógico da Base de Dados SQL do Azure. A nova base de dados tem as mesmas opções de configuração que a original. Depois que o banco de dados SQL do Azure é implantado, o Azure restaura o banco de dados no novo banco de dados SQL do Azure.

  2. Pode verificar o estado ao atualizar a vista das bases de dados no SQL Server Management Studio. Clique com o botão direito do mouse na pasta Bancos de dados e selecione Atualizar. Após implementar a base de dados, verá que o restauro está em progresso:

    Screenshot that shows a database restoring in SSMS.

    Depois de ver que a restauração está em andamento, a restauração deve levar de dois a três minutos a mais. Saberá quando está terminado, porque o comando será concluído. Além disso, deixará de ver “(A restaurar...)”, junto da base de dados de cópia quando iniciar uma atualização.

    Se o restauro demorar mais do que o tempo descrito anteriormente, tal poderá dever-se ao ambiente do Microsoft Learn. Existe um número limitado de pedidos de restauro que podem ser processados/submetidos de uma só vez para uma subscrição individual. Se quiser saber mais sobre os limites e detalhes relacionados sobre o PITR enquanto espera, consulte Restaurar um banco de dados a partir de um backup no Banco de Dados SQL do Azure.

  3. Vai agora confirmar que a nova base de dados está no estado correto (como estava antes de o acidente ter ocorrido). Clique com o botão direito do rato no servidor lógico no SQL Server Management Studio e, em seguida, selecione Atualizar para atualizar a ligação ao servidor lógico da Base de Dados SQL do Azure.

  4. Clique com o botão direito do rato na nova base de dados (por exemplo, AdventureWorks-copy) e, em seguida, selecione Nova Consulta.

    Screenshot that shows how to create a query.

  5. Utilize esta consulta para confirmar a existência da tabela:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Deverá obter resultados semelhantes aos apresentados na captura de ecrã seguinte. Este resultado confirma que a base de dados foi restaurada para a localização desejada.

    Screenshot that shows the sales order detail table.

Trocar as bases de dados e limpar

Em seguida, você renomeará o banco de dados original para AdventureWorks-old para poder renomear posteriormente o novo banco de dados para usar o nome do banco de dados original. Desde que as aplicações utilizem a lógica de repetição, esta alteração fará com que não precise de alterar nenhuma das cadeias de ligação.

Se, em algum momento, a base de dados for apresentada como indisponível (por exemplo, não conseguir ligar-se às bases de dados no SQL Server Management Studio se atualizar a ligação), poderá dever-se a atualizações a ocorrer na tabela DNS. Assim, apesar de a base de dados não estar fisicamente indisponível, não poderá ser resolvida. Se esperar um minuto ou mais, deverá poder retomar as atividades normais.

  1. Utilize este comando para alterar o nome da base de dados:

    az sql db rename --name "AdventureWorks" --new-name "AdventureWorks-old"
    
  2. Agora que o nome original da base de dados já não está a ser utilizado, pode mudar o nome da base de dados de cópia para o nome original ao utilizar novamente o Azure Cloud Shell:

    az sql db rename --name "AdventureWorks-copy" --new-name "AdventureWorks"
    
  3. Não precisa da base de dados antiga, portanto, pode eliminá-la com az sql db delete:

    az sql db delete --name "AdventureWorks-old" --yes
    Write-Host "Database deleted"
    
  4. Pode confirmar que a base de dados antiga já não existe com este comando:

    az sql db list -o table
    

Já viu como pode utilizar o restauro para um ponto anterior no tempo na Base de Dados SQL do Azure. O restauro para um ponto anterior no tempo também está disponível no Azure SQL Managed Instance para as bases de dados, mas não para toda a instância. Pode utilizar quase os mesmos comandos; no entanto, deve utilizar az sql midb em vez de az sql db.