Oefening: herstel naar een bepaald tijdstip

Voltooid

In deze oefening leert u hoe u kunt herstellen van een veelvoorkomende fout met behulp van herstel naar een bepaald tijdstip (PITR). U kunt dit proces gemakkelijk programmatisch of in de portal uitvoeren. In deze oefening leert u hoe u het kunt doen met behulp van de Azure CLI.

Installatie: Scripts gebruiken om Azure SQL Database te implementeren

In de terminal aan de rechterkant ziet u Azure Cloud Shell. Dit is een manier om met Azure te communiceren met behulp van een browser. Voordat u de oefeningen start, moet u een script uitvoeren om uw omgeving te maken: een Azure SQL Database die de AdventureWorks-database bevat. Het script bevat prompts voor een wachtwoord en uw lokale IP-adres.

Het voltooien van deze scripts duurt drie tot vijf minuten. Noteer uw wachtwoord, unieke id en regio, omdat deze niet opnieuw worden weergegeven.

  1. Als u het vereiste IP-adres wilt ophalen, moet u de verbinding met een VPN-service verbreken en (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content uitvoeren in een lokaal PowerShell-venster (niet in deze browser). Noteer het resulterende IP-adres.

  2. Voer het volgende script uit in Azure Cloud Shell aan de rechterkant van deze pagina. Voer een complex wachtwoord en een openbaar IP-adres in wanneer u hierom wordt gevraagd.

    $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. Genereer de gegevens die u nodig hebt in deze module en sla deze op (in een tekstbestand of vergelijkbare locatie) door het volgende script uit te voeren in Azure Cloud Shell. U moet waarschijnlijk Enter selecteren nadat u de code hebt geplakt, omdat de laatste regel niet standaard wordt uitgevoerd.

    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
    

    Belangrijk

    Vergeet niet uw wachtwoord, unieke id en regio te noteren. U hebt deze informatie nodig in de module.

  4. Voer het volgende script uit om een Azure SQL-database en logische server te implementeren met het AdventureWorks-voorbeeld. Met dit script voegt u ook uw IP-adres toe als firewallregel, schakelt u Microsoft Defender voor Cloud in en maakt u een opslagaccount voor gebruik in toekomstige eenheden.

    # 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. Open SSMS op uw lokale computer en maak een nieuwe verbinding met uw logische server. Voer als servernaam de naam in van de logische server van uw Azure SQL Database. Als u de naam niet eerder hebt opgeslagen, moet u mogelijk naar de Azure-portal gaan om deze te verkrijgen. Bijvoorbeeld: aw-server<unique ID.database.windows.net>.

    1. In de Azure-portal kunt u AdventureWorks invoeren in het zoekvak om uw database en de bijbehorende logische server te vinden.

    2. Voer SQL Server-verificatie in in het vak Verificatie. Voer de Aanmeldingsnaam en het Wachtwoord van de serverbeheerder in (die u tijdens de implementatie in de vorige oefening hebt opgegeven).

    3. Schakel het selectievakje Wachtwoord onthouden in en selecteer Verbinding maken.

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

    Notitie

    Afhankelijk van uw lokale configuratie (bijvoorbeeld VPN) kan het IP-adres van de client afwijken van het IP-adres dat door Azure Portal tijdens de implementatie is gebruikt. Als dat het geval is, wordt er een bericht weergegeven met de tekst 'Uw client-IP-adres heeft geen toegang tot de server. Meld u aan bij een Azure-account en maak een nieuwe firewallregel om toegang in te schakelen." Als u dit bericht krijgt, meldt u zich aan met het account dat u gebruikt voor de sandbox en voegt u een firewallregel toe voor uw client-IP-adres. U kunt deze stappen voltooien met behulp van de pop-upwizard in SSMS.

Herstel naar een bepaald tijdstip uitvoeren

Voordat u verdergaat, is het belangrijk dat u de aanbevolen procedure voor het uitvoeren van herstel naar een bepaald tijdstip begrijpt:

  1. Een tabel of database wordt per ongeluk verwijderd.
  2. Bepaal de tijd waarnaar u terug moet gaan; dit moet gebeuren voordat de fout is opgetreden.
  3. Voltooi herstel naar een bepaald tijdstip via PowerShell of Azure Portal om terug te gaan naar dit tijdstip. Met dit proces wordt een nieuwe database geïmplementeerd en wordt er een kopie van uw database hersteld. Bijvoorbeeld: AdventureWorks-copy.
  4. Controleer of de nieuwe database (bijvoorbeeld AdventureWorks-copy) de juiste status heeft (zoals vóór het ongeluk).
  5. Hernoem de oorspronkelijke database. Wijzig bijvoorbeeld de naam van AdventureWorks in AdventureWorks-old.
  6. Geef de nieuwe database de naam van de oorspronkelijke database. Wijzig bijvoorbeeld de naam van AdventureWorks-copy in AdventureWorks.
  7. Verwijder de oorspronkelijke database. Bijvoorbeeld: AdventureWorks-old.

In deze oefening voert u deze stappen uit.

Verwijderen van gegevens simuleren

Laten we eerst even controleren of de tabel die per ongeluk wordt verwijderd bestaat en gegevens bevat. Laten we eens kijken naar enkele van de waarden in SalesLT.OrderDetail.

  1. Ga naar SSMS en controleer uw verbinding of werk deze bij. Selecteer Bestand> Verbinding maken Objectverkenner en selecteer vervolgens de knop Opties.

  2. Zorg ervoor dat de verbinding die u gebruikt, verbinding maakt met de logische server, maar niet met een bepaalde database. (Gebruik bijvoorbeeld <standaard> zoals wordt weergegeven in de volgende schermopname.) Controleer ook of het tabblad Aanvullende Verbinding maken ionparameters geen tekst bevat.

    Screenshot that shows the default connection.

  3. Vouw de map Databases uit en klik met de rechtermuisknop op uw AdventureWorks-database en selecteer Nieuwe query. Voer de volgende query in en voer deze uit door Uitvoeren te selecteren en vervolgens de resultaten te bekijken:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Screenshot that shows the sales order detail table.

  4. Simuleer het verlies van gegevens door een tabel in de database te verwijderen.

    Voer in hetzelfde queryvenster deze query uit en selecteer vervolgens het tabblad Berichten in het venster Resultaten en noteer de voltooiingstijd:

    DROP TABLE SalesLT.SalesOrderDetail
    

    Belangrijk

    Bewaar de voltooiingstijd. U hebt deze later nodig. Hier is een voorbeeld: Completion time: 2020-06-22T09:20:27.1859237-07:00.

  5. Voordat u de stappen voor het herstellen van de database start, voert u de volgende code uit in Azure Cloud Shell aan de rechterkant van deze pagina om uw omgeving te configureren:

    $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
    

    De geretourneerde parameters groupen sql-server moeten overeenkomen met de naam van uw Microsoft Learn-resourcegroep en de logische server van Azure SQL Database.

De tijd bepalen waarop de database moet worden hersteld

De eerste stap is het bepalen van de tijd waarop de database moet worden hersteld. U moet weten wanneer de laatste 'goede' transactie is uitgevoerd voor de 'verkeerde'. U herstelt de database naar een tijdstip voor de verkeerde transactie maar na de laatste goede.

  1. Een manier om het tijdstip van de verwijdering te bepalen is door naar de uitvoeringstijd van de DROP-instructie te kijken, die u in de vorige stap hebt genoteerd.

    Een andere manier is om de auditlogboeken in Azure Portal te gebruiken. In deze oefening hebt u controle niet geconfigureerd voor Log Analytics, maar laten we eens kijken wat u zou kunnen doen als u dat had. U kunt naar uw Azure SQL-database gaan in Azure Portal. In het linkerdeelvenster, onder Beveiliging, kunt u Controle selecteren en vervolgens Auditlogboeken weergeven selecteren. Door vervolgens Log Analytics te selecteren, wordt u naar een queryeditor gebracht waarmee u logboeken kunt opvragen met behulp van Kusto-querytaal (KQL). SQL-professionals kunnen deze querytaal gebruiken om eenvoudig logboeken te doorzoeken.

    Vervolgens kunt u de volgende KQL-query uitvoeren:

    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
    

    De resultaten moeten er ongeveer uitzien als de volgende resultaten, maar met een andere datum en tijd.

    Screenshot that shows Log Analytics results.

    Notitie

    Het kan 5 tot 10 minuten duren voordat de logboeken hier worden weergegeven, dus voor de doeleinden van deze oefening hebben we deze weggelaten. In plaats daarvan gebruikt u de voltooiingstijd die u in de vorige stap hebt genoteerd. (U moet deze converteren naar GMT.) In een praktijksituatie is het waarschijnlijk niet mogelijk om met de voltooiingstijd naar het venster te gaan, zodat controle een uitstekende hulp kan zijn.

  2. In dit voorbeeld is 2020-07-24 08:06:24.386 de datum/tijd afkomstig van Log Analytics en 2020-07-24T13:06:24.386-07:00 van SSMS. De vereiste notatie is iets anders. Gebruik het volgende voorbeeld om de juiste indeling te bepalen. Mogelijk wilt u ook 0,001 seconden ervan aftrekken om er zeker van te zijn dat u herstelt naar het tijdstip vóór de fout:

    • Notatie van Log Analytics: 2020-07-24 08:06:24.386
    • SSMS-indeling: 2020-07-24T13:06:24.386-07:00
    • Vereiste notatie: 2020-07-24T20:06:24.385
  3. Stel $before_error_time deze waarde in op de resulterende waarde, waarbij u uw tijd vervangt door de tijd in dit voorbeeld:

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

De database herstellen en controleren op ontbrekende gegevens

In deze sectie gebruikt u az cli db restore om de database te herstellen naar een tijdstip voordat de tabel is verwijderd.

  1. Voer het volgende script uit in de terminal aan de rechterkant van dit venster:

    # 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
    

    Het herstellen duurt ongeveer 5 tot 10 minuten. Wanneer u een herstelbewerking uitvoert, implementeert Azure een nieuwe Azure SQL-database op uw logische server van Azure SQL Database. De nieuwe database heeft dezelfde configuratieopties als het origineel. Nadat de Azure SQL-database is geïmplementeerd, herstelt Azure de database naar de nieuwe Azure SQL-database.

  2. U kunt de status controleren door uw weergave van databases in SSMS te vernieuwen. Klik met de rechtermuisknop op de map Databases en selecteer Vernieuwen. Nadat de database is geïmplementeerd, ziet u dat de herstelbewerking wordt uitgevoerd:

    Screenshot that shows a database restoring in SSMS.

    Nadat u ziet dat de herstelbewerking wordt uitgevoerd, duurt het nog twee tot drie minuten voordat de herstelbewerking wordt uitgevoerd. De bewerking is voltooid als de opdracht is uitgevoerd. Als u Vernieuwen hebt gekozen, wordt er naast de kopiedatabase ook geen melding meer weergegeven dat er een herstelbewerking wordt uitgevoerd.

    Als u merkt dat de herstelbewerking langer duurt dan de eerder beschreven tijd, kan dit worden veroorzaakt door uw Microsoft Learn-omgeving. Er geldt namelijk een beperking voor het aantal herstelaanvragen dat tegelijkertijd kan worden verwerkt/verzonden per abonnement. Zie Een database herstellen vanuit een back-up in Azure SQL Database als u meer wilt weten over de limieten en gerelateerde details over pitr terwijl u wacht.

  3. U bevestigt nu dat de nieuwe database de juiste toestand heeft (zoals de database was voor het ongewild verwijderen). Klik met de rechtermuisknop op de logische server in SSMS en selecteer Vernieuwen om de verbinding met de logische server van Azure SQL Database te vernieuwen.

  4. Klik met de rechtermuisknop op de nieuwe database, bijvoorbeeld AdventureWorks-copy, en selecteer Nieuwe query.

    Screenshot that shows how to create a query.

  5. Gebruik deze query om te controleren of de tabel bestaat:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    U krijgt resultaten te zien die vergelijkbaar zijn met de resultaten die op de volgende schermopname worden weergegeven. Dit resultaat bevestigt dat uw database is hersteld naar de locatie waar u deze wilt hebben.

    Screenshot that shows the sales order detail table.

De databases hernoemen en opschonen

Vervolgens wijzigt u de naam van de oorspronkelijke database in AdventureWorks-old , zodat u later de naam van de nieuwe database kunt wijzigen om de oorspronkelijke databasenaam te gebruiken. Als uw toepassingen logica voor opnieuw proberen gebruiken, wordt deze met deze wijziging gemaakt en hoeft u geen verbindingsreeksen te wijzigen.

Als uw database op enig moment als niet beschikbaar wordt weergegeven (u kunt bijvoorbeeld geen verbinding maken met de database in SSMS als u de verbinding vernieuwt), kan dit worden veroorzaakt doordat er updates van de DNS-tabel plaatsvinden. Wanneer de database fysiek niet beschikbaar is, kan deze dus niet worden omgezet. Als u een minuutje of zo wacht, kunt u dan waarschijnlijk gewoon verder werken.

  1. Gebruik deze opdracht om de naam van de database te wijzigen:

    az sql db rename --name "AdventureWorks" --new-name "AdventureWorks-old"
    
  2. Nu de naam van de oorspronkelijke database niet meer in gebruik is, kunt u de naam van de kopie van de database wijzigen in die van het origineel. Gebruik hiervoor ook weer de Azure Cloud Shell:

    az sql db rename --name "AdventureWorks-copy" --new-name "AdventureWorks"
    
  3. U hebt de oude database niet nodig, dus kunt u deze verwijderen met behulp van az sql db delete:

    az sql db delete --name "AdventureWorks-old" --yes
    Write-Host "Database deleted"
    
  4. U kunt controleren of de oude database niet meer bestaat met behulp van de volgende opdracht:

    az sql db list -o table
    

U hebt nu gezien hoe u herstel naar een bepaald tijdstip kunt gebruiken in Azure SQL Database. Herstel naar een bepaald tijdstip is ook beschikbaar in Azure SQL Managed Instance, maar niet voor een geheel exemplaar. U kunt bijna dezelfde opdrachten gebruiken, behalve dat u az sql midb in plaats van az sql db moet gebruiken.