Exercício – Restaurar para um ponto no tempo

Concluído

Neste exercício, você aprenderá como é possível recuperar-se de um erro comum usando a restauração pontual. É fácil executar esse processo no portal ou de modo programático. Neste exercício, você aprenderá a fazer isso usando a 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 forma de interagir com o Azure usando um navegador. Antes de iniciar os exercícios, você precisa executar um script para criar seu ambiente: um banco de dados SQL do Azure que contém o banco de dados AdventureWorks. Haverá alguns prompts no script pedindo uma senha e o seu endereço IP local.

Esses scripts deverão levar de três a cinco minutos para serem concluídos. Anote sua senha, a ID exclusiva e a região, porque elas não serão mostradas novamente.

  1. Para obter o endereço IP necessário, desconecte-se de todos os serviços de VPN e execute (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content em uma janela local do PowerShell (não neste navegador). Observe o endereço IP resultante.

  2. Execute o seguinte script no Azure Cloud Shell no lado direito desta página. Insira uma senha complexa e um endereço IP público quando solicitado.

    $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. Gere e armazene (em um arquivo de texto ou local semelhante) as informações que serão necessárias ao longo deste módulo executando o script a seguir no Azure Cloud Shell. Você provavelmente precisará selecionar Enter depois de colar no código, pois a última linha não será executada por padrã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 senha, a ID exclusiva e a região. Você precisará dessas informações em todo o módulo.

  4. Execute o script a seguir para implantar um banco de dados SQL do Azure e um servidor lógico com o exemplo do AdventureWorks. Esse script também adiciona o seu endereço IP como uma regra de firewall, habilita o Microsoft Defender para Nuvem e cria uma conta de armazenamento para ser usada 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 SSMS e crie uma conexão com o servidor lógico. Para o nome do servidor, insira o nome do servidor lógico do Banco de Dados SQL do Azure. Se você não tiver salvado o nome anteriormente, talvez seja necessário consultar o portal do Azure para obtê-lo. Por exemplo: aw-server<ID única>.database.windows.net.

    1. Quando estiver no portal do Azure, você poderá inserir AdventureWorks na caixa de pesquisa para localizar o banco de dados e o servidor lógico associado.

    2. Na caixa Autenticação, insira Autenticação do SQL Server. Insira o logon e a senha (aquela que você forneceu durante a implantação no exercício anterior) do administrador do servidor correspondente.

    3. Marque a caixa Lembrar senha e, em seguida, selecione Conectar.

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

    Observação

    Dependendo da sua configuração local (por exemplo, VPN), o endereço IP do cliente pode ser diferente do endereço IP que o portal do Azure usou durante a implantação. Se esse for o caso, você verá uma mensagem dizendo "Seu endereço IP do 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 você receber essa mensagem, entre com a conta que você está usando para a área restrita e adicione uma regra de firewall para o endereço IP do cliente. Você pode concluir essas etapas usando o assistente de pop-up no SSMS.

Concluir PITR

Antes de prosseguir, é importante entender o processo recomendado para realizar a PITR:

  1. Uma tabela ou banco de dados é excluído por engano.
  2. Determine o momento para o qual você precisa voltar; deve ser antes de quando o erro ocorreu.
  3. Conclua a PITR por meio do PowerShell ou do portal do Azure para esse momento. Esse processo implanta um novo banco de dados e restaura uma cópia do banco de dados. Por exemplo: AdventureWorks-copy.
  4. Confirme se o novo banco de dados (por exemplo, AdventureWorks-copy) está no estado correto (como antes do acidente).
  5. Renomeie o banco de dados original. Por exemplo, renomeie AdventureWorks como AdventureWorks-old.
  6. Renomeie o novo banco de dados com o nome do banco de dados original. Por exemplo, renomeie AdventureWorks-copy como AdventureWorks.
  7. Exclua o banco de dados original. Por exemplo: AdventureWorks-old.

Neste exercício, você concluirá essas etapas.

Simular a exclusão de dados

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

  1. Acesse o SSMS e verifique/atualize a conexão. Selecione Arquivo>Conectar Pesquisador de Objetos e, em seguida, selecione o botão Opções.

  2. Verifique se a conexão que você usa se conecta ao servidor lógico, mas não a um banco de dados específico (por exemplo, use <padrão> conforme mostrado na captura de tela a seguir). Além disso, confirme se a guia de 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 consulta a seguir e execute-a selecionando Executar. Em seguida, examine os resultados:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Screenshot that shows the sales order detail table.

  4. Simule a perda de dados descartando uma tabela no banco de dados.

    Na mesma janela, execute essa consulta. Em seguida, selecione a guia Mensagens na janela Resultados e anote a hora da conclusão:

    DROP TABLE SalesLT.SalesOrderDetail
    

    Importante

    Salve o tempo de conclusão. Você precisará dela mais tarde. Este é 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 retornados devem corresponder aos nomes do grupo de recursos do Microsoft Learn e ao servidor lógico do Banco de Dados SQL do Azure.

Identifique o momento para o qual restaurar o banco de dados

A primeira etapa é descobrir o momento para o qual restaurar o banco de dados. Você precisa saber quando a última transação "válida" ocorreu antes da "inválida". Você vai restaurar antes da transação inválida, mas após a última válida.

  1. Uma forma de determinar o tempo de remoção é observar o tempo de conclusão da instrução DROP, que você anotou na etapa anterior.

    Uma nova maneira é usar 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 a tivesse configurado. Vá para o banco de dados SQL do Azure no portal do Azure. No painel esquerdo, em Segurança, você pode selecionar Auditoria e então Exibir logs de auditoria. Ao selecionar o Log Analytics, você será levado a um editor de consultas que permite consultar logs usando a KQL (Linguagem de Consulta Kusto). Os profissionais do SQL podem usar essa linguagem de consulta para consultar os logs facilmente.

    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 resultados a seguir, mas com data e hora diferentes.

    Screenshot that shows Log Analytics results.

    Observação

    Pode levar de 5 a 10 minutos para que os logs apareçam aqui, então, para os fins deste exercício, optamos por não incluí-los. Em vez disso, você usará a hora de conclusão anotada na etapa anterior. (será necessário convertê-lo para GMT). Em uma situação real, não é provável que você consiga chegar à janela com o tempo de conclusão, por isso, 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 de SSMS. O formato necessário é ligeiramente diferente. Use o exemplo a seguir para determinar o formato correto. Você também pode querer subtrair 0,001 segundo para garantir a restauração para um horário antes de o erro ocorrer:

    • Formato do Log Analytics: 2020-07-24 08:06:24.386
    • Formato de SSMS: 2020-07-24T13:06:24.386-07:00
    • Formato necessário: 2020-07-24T20:06:24.385
  3. Defina $before_error_time como o valor resultante, substituindo sua hora pela que consta neste exemplo:

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

Restaurar o banco de dados e confirmar os dados ausentes

Nesta seção, você usará az cli db restore para restaurar o banco de dados para um horário antes da exclusão da tabela.

  1. Execute o seguinte script no terminal no 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á de 5 a 10 minutos. Quando você executa uma restauração, o Azure implanta um novo banco de dados SQL do Azure no servidor lógico do banco de dados SQL do Azure. O novo banco de dados tem as mesmas opções de configuração que o original. Depois que o banco de dados SQL do Azure for implantado, o Azure irá restaurar o banco de dados no novo banco de dados SQL do Azure.

  2. Você pode verificar o status atualizando sua exibição de bancos de dados no SSMS. Clique com o botão direito do mouse na pasta Bancos de Dados e selecione Atualizar. Depois da implantação do banco de dados, você verá que a restauração está em andamento:

    Screenshot that shows a database restoring in SSMS.

    Depois de ver que a restauração está em andamento, ela deve levar mais uns 2 ou 3 minutos. Você saberá quando isso é feito porque o comando será concluído. Além disso, você não verá mais a mensagem "(Restaurando…)" ao lado do banco de dados de cópia ao iniciar uma atualização.

    Se você observar que a restauração está demorando mais do que os tempos descritos anteriormente, isso talvez seja devido ao ambiente do Microsoft Learn. Há um número limitado de solicitações de restauração que podem ser processadas/enviadas de uma só vez para uma assinatura única. Se você quiser saber mais sobre os limites e os detalhes relacionados sobre a restauração pontual enquanto aguarda, consulte Restaurar um banco de dados de um backup no Banco de Dados SQL do Azure.

  3. Agora, você confirmará que o novo banco de dados está no estado correto (como antes do acidente). Clique com o botão direito do mouse no servidor lógico no SSMS e selecione Atualizar para atualizar a conexão com o servidor lógico do Banco de Dados SQL do Azure.

  4. Clique com o botão direito do mouse no novo banco de dados (por exemplo, AdventureWorks-Copy) e, em seguida, selecione Nova Consulta.

    Screenshot that shows how to create a query.

  5. Use essa consulta para confirmar se a tabela existe:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Você deve obter resultados semelhantes aos mostrados na captura de tela a seguir. Esse resultado confirma que seu banco de dados é restaurado para o local em que você deseja que ele seja.

    Screenshot that shows the sales order detail table.

Trocar os bancos de dados e limpar

Em seguida, você renomeará o banco de dados original como AdventureWorks-old para que, posteriormente, você possa renomear o novo banco de dados para usar o nome do banco de dados original. Desde que seus aplicativos usem a lógica de repetição, essa alteração fará com que você não precise alterar nenhuma cadeia de conexão.

Se a qualquer momento seu banco de dados aparecer como não disponível (por exemplo, você não pode se conectar aos bancos de dados no SSMS se você atualiza a conexão), isso pode ser devido à ocorrência de atualizações na tabela DNS. Assim, embora o banco de dados não esteja fisicamente não disponível, ele não pode ser resolvido. Se você aguardar um minuto ou mais, deverá conseguir retomar as atividades normais.

  1. Use este comando para alterar o nome do banco de dados:

    az sql db rename --name "AdventureWorks" --new-name "AdventureWorks-old"
    
  2. Agora que o nome do banco de dados original não é mais usado, você pode renomear o banco de dados de cópia para o nome do original, novamente usando o Azure Cloud Shell:

    az sql db rename --name "AdventureWorks-copy" --new-name "AdventureWorks"
    
  3. Você não precisa do banco de dados antigo, portanto, pode excluí-lo usando az sql db delete:

    az sql db delete --name "AdventureWorks-old" --yes
    Write-Host "Database deleted"
    
  4. Você pode confirmar que o banco de dados antigo não existe mais usando este comando:

    az sql db list -o table
    

Você viu como é possível usar a PITR no Banco de Dados SQL do Azure. A PITR também está disponível na Instância Gerenciada de SQL do Azure, para bancos de dados, mas não para a instância inteira. Você pode usar quase os mesmos comandos, exceto pelo fato de que você precisa usar az sql midb, em vez de az sql db.