Упражнение. Восстановление до точки во времени

Завершено

В этом упражнении вы узнаете, как восстановиться после распространенных ошибок с помощью восстановления на определенный момент времени (PITR). Этот процесс легко выполнить на портале или программным способом. В этом упражнении вы узнаете, как это сделать с помощью Azure CLI.

Настройка. Использование скриптов для развертывания База данных SQL Azure

В терминале справа вы увидите Azure Cloud Shell, который является способом взаимодействия с Azure с помощью браузера. Прежде чем приступить к упражнениям, выполните сценарий для создания среды — базы данных SQL Azure с базой данных AdventureWorks. В сценарии будут отображаться запросы пароля и локального IP-адреса.

Выполнение сценария займет от трех до пяти минут. Обязательно запишите пароль, уникальный идентификатор и регион, так как они не будут отображаться снова.

  1. Чтобы получить нужный IP-адрес, необходимо отключиться от всех служб VPN и запустить (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content в локальном окне PowerShell (не в этом браузере). Запишите полученный IP-адрес.

  2. Выполните следующий сценарий в Azure Cloud Shell в правой части этой страницы. При появлении запроса введите сложный пароль и общедоступный IP-адрес.

    $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. Выведите и сохраните (в текстовом файле или аналогичном месте) сведения, которые понадобятся на протяжении модуля, запустив следующий сценарий в Azure Cloud Shell. Возможно, потребуется нажать клавишу ВВОД после вставки кода, так как последняя строка не будет запускаться по умолчанию.

    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
    

    Важно!

    Не забудьте записать свой пароль, уникальный идентификатор и регион. Эти сведения понадобятся на протяжении модуля.

  4. Выполните следующий сценарий, чтобы развернуть базу данных SQL Azure и логический сервер с примером AdventureWorks. Этот сценарий также добавляет IP-адрес в качестве правила брандмауэра, включает Microsoft Defender для облака и создает учетную запись хранения для использования в предстоящих уроках.

    # 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. На локальном компьютере откройте SSMS и создайте подключение к логическому серверу. В качестве имени сервера введите имя логического сервера базы данных SQL Azure. Если вы не сохранили имя ранее, найдите его на портале Azure. Например, aw-server<unique ID.database.windows.net>.

    1. На портале Azure введите AdventureWorks в поле поиска, чтобы найти базу данных и связанный с ней логический сервер.

    2. В поле Проверка подлинности выберите Проверка подлинности SQL Server. Введите соответствующее имя и пароль администратора сервера (которые были указаны во время развертывания в предыдущем упражнении).

    3. Установите флажок "Запомнить пароль", а затем выберите Подключение.

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

    Примечание.

    В зависимости от локальной конфигурации (например, VPN), ваш IP-адрес клиента может отличаться от IP-адреса, использованного порталом Azure во время развертывания. Если это так, вы увидите сообщение: "У вашего IP-адреса клиента нет доступа к серверу. Войдите в учетную запись Azure и создайте новое правило брандмауэра, чтобы разрешить доступ". Если вы видите это сообщение, войдите, используя учетную запись, которая используется для песочницы, и добавьте правило брандмауэра для IP-адреса клиента. Эти действия можно выполнить с помощью всплывающего окна мастера в SSMS.

Выполнение восстановления до точки во времени

Прежде чем продолжить, важно понять рекомендуемую процедуру для восстановления до точки во времени:

  1. Таблица или база данных случайно удалена.
  2. Определите время, в которое необходимо вернуться; это должно быть до возникновения ошибки.
  3. Завершите процедуру восстановления до точки во времени с помощью PowerShell или портала Azure, чтобы вернуться к этому времени. При этом развертывается новая база данных и восстанавливается копия вашей базы данных. Например: AdventureWorks-copy.
  4. Убедитесь, что новая база данных (например, AdventureWorks-copy) находится в правильном состоянии (как это было до аварии).
  5. Переименуйте исходную базу данных. Например, переименуйте AdventureWorks в AdventureWorks-old.
  6. Переименуйте новую базу данных, присвоив ей имя исходной базы данных. Например, переименуйте AdventureWorks-copy в AdventureWorks.
  7. Удалите исходную базу данных. Например: AdventureWorks-old.

В этом упражнении вы выполните эти действия.

Имитация удаления данных

Сначала убедитесь, что таблица, которая будет случайно удалена, существует и содержит данные. Рассмотрим некоторые значения в SalesLT.OrderDetail.

  1. Перейдите в SSMS и проверьте или обновите подключение. Выберите файл> Подключение обозреватель объектов и нажмите кнопку "Параметры".

  2. Убедитесь, что настроено подключение к логическому серверу, но не к определенной базе данных. (Например, используйте <по умолчанию>, как показано на следующем снимке экрана.) Кроме того, убедитесь, что вкладка "Дополнительные параметры Подключение" не содержит текста.

    Screenshot that shows the default connection.

  3. Разверните папку "Базы данных", а затем щелкните правой кнопкой мыши базу данных AdventureWorks и выберите "Создать запрос". Введите следующий запрос и запустите его, выбрав "Выполнить", а затем просмотрите результаты:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Screenshot that shows the sales order detail table.

  4. Сымитируйте потерю данных, удалив таблицу в базе данных.

    В том же окне запроса запустите этот запрос, а затем выберите вкладку "Сообщения " в окне результатов и запишите время завершения:

    DROP TABLE SalesLT.SalesOrderDetail
    

    Важно!

    Сохраните время выполнения. Оно понадобится вам позже. Вот пример: Completion time: 2020-06-22T09:20:27.1859237-07:00.

  5. Наконец, прежде чем приступить к восстановлению базы данных, выполните следующий код в Azure Cloud Shell справа от этой страницы, чтобы настроить среду:

    $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
    

    Возвращаемые параметры group и sql-server должны соответствовать имени вашей группы ресурсов Microsoft Learn и вашего логического сервера базы данных SQL Azure.

Определение времени восстановления базы данных

Первым шагом является определение времени восстановления базы данных. Необходимо знать, когда была выполнена последняя правильная транзакция перед неправильной. Вы восстановите состояние перед неправильной и после последней правильной транзакции.

  1. Чтобы определить время удаления, можно найти время выполнения инструкции DROP, которое вы записали на предыдущем шаге.

    В качество альтернативного способа можно использовать журналы аудита на портале Azure. В этом упражнении вы не настраивали аудит для Log Analytics, но давайте посмотрим, что вы могли бы сделать, если бы это было возможно. Вы можете перейти к своей базе данных Azure SQL на портале Azure. В левой области в разделе "Безопасность" можно выбрать "Аудит", а затем выбрать "Просмотр журналов аудита". Выбрав Log Analytics, вы получите в редактор запросов, который позволяет запрашивать журналы с помощью язык запросов Kusto (KQL). Специалисты по SQL могут использовать этот язык запросов для простого запроса журналов.

    Затем можно выполнить следующий запрос 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
    

    Результаты должны быть похожи на следующие, но с другой датой и временем.

    Screenshot that shows Log Analytics results.

    Примечание.

    Это может занять от 5 до 10 минут, чтобы журналы отображались здесь, поэтому в целях этого упражнения мы оставили его. Вместо этого вы будете использовать время завершения, указанное на предыдущем шаге. (Необходимо преобразовать его в GMT.) В реальной ситуации вы, скорее всего, не сможете добраться до окна с временем завершения, так что аудит может быть большой помощью.

  2. В этом примере дата и время — 2020-07-24 08:06:24.386 из Log Analytics и 2020-07-24T13:06:24.386-07:00 из SSMS. Требуемый формат немного отличается. Чтобы определить правильный формат, используйте следующий пример. Кроме того, следует вычесть 0,001 с, чтобы обеспечить восстановление до возникновения ошибки:

    • Формат Log Analytics: 2020-07-24 08:06:24.386
    • Формат SSMS: 2020-07-24T13:06:24.386-07:00
    • Требуемый формат: 2020-07-24T20:06:24.385
  3. Задайте $before_error_time результирующее значение, подставив время в этом примере:

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

Восстановление базы данных и подтверждение отсутствующих данных

В этом разделе вы будете использовать az cli db restore для восстановления базы данных до момента удаления таблицы.

  1. Выполните следующий сценарий в терминале в правой части этого окна:

    # 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
    

    Восстановление займет около 5–10 минут. При выполнении восстановления Azure развертывает новую базу данных SQL Azure на логическом сервере базы данных SQL Azure. Новая база данных имеет те же параметры конфигурации, что и исходная. После развертывания базы данных SQL Azure Azure восстанавливает базу данных в новую базу данных SQL Azure.

  2. Состояние можно проверить, обновив представление баз данных в среде SSMS. Щелкните правой кнопкой мыши папку "Базы данных" и выберите "Обновить". После развертывания базы данных вы увидите, что выполняется восстановление:

    Screenshot that shows a database restoring in SSMS.

    После того как вы увидите, что выполняется восстановление, восстановление должно занять два–три минуты больше. На окончание операции указывает завершение команды. Кроме того, при запуске обновления рядом с копией базы данных больше не будет отображаться сообщение "(Выполняется восстановление...)".

    Если вы заметили, что восстановление занимает больше времени, это может быть связано со средой Microsoft Learn. Существует ограниченное количество запросов на восстановление, которые могут быть обработаны или отправлены одновременно для одной подписки. Если вы хотите узнать больше об ограничениях и связанных сведениях о PITR во время ожидания, см. статью "Восстановление базы данных из резервной копии" в База данных SQL Azure.

  3. Убедитесь, что новая база данных находится в правильном состоянии (как до происшествия). Щелкните правой кнопкой мыши логический сервер в SSMS и выберите Обновить, чтобы обновить подключение к логическому серверу базы данных SQL Azure.

  4. Щелкните правой кнопкой мыши новую базу данных, например AdventureWorks-copy, и выберите Создать запрос.

    Screenshot that shows how to create a query.

  5. Используйте этот запрос для подтверждения существования таблицы:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Вы должны получить результаты, аналогичные примеру на следующем снимке экрана. Этот результат подтверждает, что база данных восстановлена в месте, которое вы указали.

    Screenshot that shows the sales order detail table.

Перестановка баз данных и очистка

Затем вы переименуете исходную базу данных в AdventureWorks-old , чтобы позже переименовать новую базу данных, чтобы использовать исходное имя базы данных. Если приложения используют логику повторных попыток, благодаря переименованию вам не придется менять строки подключения.

Если в любой момент база данных становится недоступной (например, не удается подключиться к базам данных в SSMS при обновлении подключения), это может быть вызвано обновлением таблицы DNS. Поэтому хотя база данных и не является физически недоступной, она неразрешима. Если подождать около минуты, вы сможете возобновить нормальную работу.

  1. Используйте эту команду, чтобы изменить имя базы данных:

    az sql db rename --name "AdventureWorks" --new-name "AdventureWorks-old"
    
  2. Теперь, когда имя исходной базы данных больше не используется, можно переименовать копию базы данных, задав для нее исходное имя с помощью Azure Cloud Shell:

    az sql db rename --name "AdventureWorks-copy" --new-name "AdventureWorks"
    
  3. Старая база данных не нужна, поэтому ее можно удалить с помощью az sql db delete:

    az sql db delete --name "AdventureWorks-old" --yes
    Write-Host "Database deleted"
    
  4. Убедитесь, что старая база данных больше не существует, с помощью следующей команды:

    az sql db list -o table
    

Теперь вы узнали, как можно использовать восстановление до точки во времени в базе данных SQL Azure. Восстановление до точки во времени также доступно в Управляемом экземпляре SQL Azure — для баз данных, но не для всего экземпляра. Вы можете использовать почти те же команды, только вместо az sql db у вас будет az sql midb.