sql >> Database teknologi >  >> RDS >> Sqlserver

Accelereret databasegendannelse i SQL Server 2019

En oversigt over traditionel genopretning

Som med alle relationelle databasesystemer garanterer SQL Server holdbarheden af ​​data ved at implementere nedbrudsgendannelse. Holdbarhed i akronymet ACID, som refererer til karakteristika for transaktioner i relationelle databaser betyder, at vi kan være sikre på, at hvis databasen pludselig svigter, er vores data sikre.

SQL Server implementerer denne funktion ved hjælp af transaktionsloggen. Ændringer foretaget af alle datamanipulationsoperationer i SQL Server fanges i transaktionsloggen, før de anvendes på datafiler (gennem checkpoint-processen), hvis det er nødvendigt at rulle tilbage eller rulle fremad.

Den trefasede nedbrudsgendannelsesproces i SQL Server er som følger:

  • Analyse – SQL Server læser transaktionsloggen fra det seneste kontrolpunkt til slutningen af ​​transaktionsloggen

  • Gentag – SQL Server afspiller loggen fra den ældste ikke-forpligtede transaktion til slutningen af ​​loggen

  • Fortryd – SQL Server læser loggen fra slutningen af ​​loggen til den ældste ikke-forpligtede transaktion og nulstiller alle transaktioner, der var aktive under nedbruddet

Erfarne DBA'er ville på et eller andet tidspunkt i deres karriere have haft den nedslående oplevelse at vente hjælpeløst på, at crash recovery blev fuldført på en meget stor database. Transaktion ROLLBACK bruger en lignende mekanisme som crash recovery-processen. Microsoft har forbedret gendannelsesprocessen betydeligt i SQL Server 2019.

Accelereret databasegendannelse

Accelereret databasegendannelse er en ny funktion baseret på versionering, der markant øger gendannelseshastigheden i tilfælde af en ROLLBACK eller gendannelse fra et nedbrud.

I SQL Server 2019 ændrer tre nye mekanismer i SQL Server-motoren måden, hvorpå gendannelse håndteres, og reducerer effektivt den tid, der kræves til at udføre en rollback/rollforward.

  • Persistent Version Store (PVS) – Indfanger rækkeversioner i den pågældende database. Persistent Version Store kan defineres i en separat filgruppe af ydeevne- eller størrelsesårsager

  • Logisk tilbagevenden – Bruger rækkeversionerne, der er gemt i PVS, til at udføre tilbagerulning, når en tilbagerulning påkaldes for en bestemt transaktion, eller når fortrydelsesfasen for gendannelse af nedbrud påkaldes.

  • sLog – Dette står muligvis for sekundær log . Det er en log-stream i hukommelsen, der bruges til at fange operationer, der ikke kan versioneres. Når ADR er aktiveret i databasen, genopbygges sLog'et altid under analysefasen af ​​crash recovery. Under gentag fase, bruges sLog snarere end selve transaktionsloggen, hvilket gør processen hurtigere, da den sidder i hukommelsen og indeholder færre transaktioner. Den traditionelle gendannelsesproces håndterer transaktioner fra det sidste kontrolpunkt. sLog'et bruges også under fortryd fase.

  • Renere – Fjerner unødvendige rækkeversioner fra PVS. Microsoft tilbyder også en lagret procedure til manuelt at gennemtvinge en oprydning af unødvendige rækkeversioner.

-- LISTING 1: INVOKE THE BACKGROUND CLEANER

USE TSQLV4_ADR
GO
EXECUTE sys.sp_persistent_version_cleanup;

USE master
GO
EXECUTE master.sys.sp_persistent_version_cleanup 'TSQLV4_ADR';

Accelereret databasegendannelse er som standard slået FRA

Det faktum, at ADR er slået fra i SQL Server 2019 som standard, kan virke overraskende for nogle DBA'er, da det ser ud til at være så fantastisk en funktion. ADR bruger versionsstyring i den brugerdatabase, hvor den er aktiveret. Dette kan påvirke databasestørrelsen betydeligt. Derudover skal du muligvis planlægge databasevæksten samt den mulige placering af PVS for at sikre god ydeevne, hvis ADR er aktiveret. Så det giver mening bevidst at aktivere denne funktionalitet.

Eksperimentet:forberedende fase

Vi satte et eksperiment op for at udforske den nye funktion og se virkningen af ​​ADR på størrelsen af ​​transaktionsloggen samt på hastigheden af ​​TILBAGE. I vores eksperiment opretter vi to identiske databaser ved hjælp af et enkelt backupsæt, og så aktiverer vi kun ADR på én af disse databaser. Liste 2 viser de forberedende stadier til opgaven.

[expand title =”Kode”]

-- LISTING 2: PREPARE THE DATABASES AND CONFIGURE ADR

-- 2a. Backup a sample database and restore as two identical databases

BACKUP DATABASE TSQLV4 TO DISK='TSQLV4.BAK' WITH COMPRESSION;

-- Restore Database TSQLV4_NOADR (ADR will not be enabled)
RESTORE DATABASE TSQLV4_NOADR FROM DISK='TSQLV4.BAK' WITH 
MOVE 'TSQLV4' TO 'C:\MSSQL\DATA\TSQLV4_NOADR.MDF',
MOVE 'TSQLV4_log' TO 'E:\MSSQL\LOG\TSQLV4_NOADR_LOG.LDF';

-- Restore Database TSQLV4_ADR (ADR will be enabled)
RESTORE DATABASE TSQLV4_ADR FROM DISK='TSQLV4.BAK' WITH 
MOVE 'TSQLV4' TO 'C:\MSSQL\DATA\TSQLV4_ADR.MDF',
MOVE 'TSQLV4_log' TO 'E:\MSSQL\LOG\TSQLV4_ADR_LOG.LDF';

-- 2b. Enable ADR in TSQLV4_ADR
USE [master]
GO

-- First create a separate filegroup and add a file to the filegroup
ALTER DATABASE [TSQLV4_ADR] ADD FILEGROUP [ADR_FG];
ALTER DATABASE [TSQLV4_ADR] ADD FILE ( NAME = N'TSQLV4_ADR01', FILENAME = N'C:\MSSQL\Data\TSQLV4_ADR01.ndf' , 
SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [ADR_FG]
GO

-- Enable ADR
ALTER DATABASE TSQLV4_ADR SET ACCELERATED_DATABASE_RECOVERY = ON (PERSISTENT_VERSION_STORE_FILEGROUP = ADR_FG);
GO

-- 2c. Check if all ADR is enabled as planned
SELECT name
, compatibility_level
, snapshot_isolation_state_desc
, recovery_model_desc
, target_recovery_time_in_seconds
, is_accelerated_database_recovery_on FROM SYS.DATABASES
WHERE name LIKE 'TSQLV4_%';


-- 2d. Check sizes of all files in the databases
SELECT DB_NAME(database_id) AS database_name
, name AS file_name
, physical_name
, (size * 8)/1024 AS [size (MB)]
, type_desc
FROM SYS.master_files
WHERE DB_NAME(database_id) LIKE 'TSQLV4_%';


-- 2e. Check size of log used

CREATE TABLE ##LogSpaceUsage (database_name VARCHAR(50)
, database_id INT, total_log_size_in_bytes BIGINT
, used_log_space_in_bytes BIGINT
, used_log_space_in_percent BIGINT
, log_space_in_bytes_since_last_backup BIGINT)

INSERT INTO ##LogSpaceUsage
EXEC sp_MSforeachdb @command1='
IF ''?'' LIKE ("TSQLV4_%")
SELECT DB_NAME(database_id), * FROM ?.SYS.dm_db_log_space_usage;'

SELECT * FROM ##LogSpaceUsage;

DROP TABLE ##LogSpaceUsage;

[/udvid]

Fig. 1 viser outputtet af SQL-sætningen i liste 2 afsnit 2c. Vi fangede også størrelsen af ​​databasefilerne og brugen af ​​transaktionslogfilen. (se fig. 3).

Fig. 1 Bekræft, at ADR er konfigureret

Fig. 2 Gennemgå databasedatafilstørrelser

Fig. 3 Tjek størrelsen på log, der bruges til begge databaser

Eksperimentet:Udførelsesfasen

Når vi har fanget de detaljer, vi skal bruge for at fortsætte, udfører vi SQL-koden fra lister 3 og 4 i trin. De to lister er ækvivalente, men vi udfører dem på to identiske databaser separat. Først laver vi en INSERT (Listing 3, 3a), derefter udfører vi en DELETE (Listing 3, 3b), som vi efterfølgende ruller tilbage. Bemærk, at vi i både INSERT og DELETE har indkapslet operationerne i transaktioner. Bemærk også, at INSERT udføres 50 gange. På hvert trin af udførelsen, dvs. mellem 3a, 3b og 3c, fanger vi brugen af ​​transaktionsloggen ved hjælp af koden i Listing 2,2e. Dette er det samme for sektionerne 4a, 4b og 4c.

-- LISTING 3: EXECUTE DML IN TSQLV4_NOADR DATABASE

-- 3a. Execute INSERT Statement in TSQLV4_NOADR Database

USE TSQLV4_NOADR
GO

BEGIN TRAN
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT * INTO [Sales].[OrderDetails_noadr] FROM [Sales].[OrderDetails];
GO
INSERT INTO [Sales].[OrderDetails_noadr] 
SELECT * FROM [Sales].[OrderDetails];
GO 50

COMMIT;

-- 3b. Execute DELETE in TSQLV4_NOADR Database

USE TSQLV4_NOADR
GO

BEGIN TRAN
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
DELETE FROM [Sales].[OrderDetails_noadr]
GO

-- 3c. Perform Rollback and Capture Time
ROLLBACK;

Fig. 4 og 5 viser os, at SELECT INTO-operationen tog 6 millisekunder mere i TSQLV4_ADR-databasen, hvor vi aktiverede Accelerated Database Recovery. Vi ser også i fig. 6, at vi har større brug af transaktionslog i TSQLV4_ADR-databasen. Jeg var især overrasket over dette, så jeg gentog eksperimentet flere gange for at sikre, at jeg fik dette resultat konsekvent.

Fig. 4 Indsæt eksekveringstid for TSQLV4_NOADR

Fig. 5 Indsæt eksekveringstid for TSQLV4_ADR

Fig. 6 Transaktionslogbrug efter indsættelser

-- LISTING 4: EXECUTE DML IN TSQLV4_ADR DATABASE

-- 4a. Execute INSERT Statement in TSQLV4_ADR Database

USE TSQLV4_ADR
GO

BEGIN TRAN
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT * INTO [Sales].[OrderDetails_adr] FROM [Sales].[OrderDetails];
GO
INSERT INTO [Sales].[OrderDetails_adr] 
SELECT * FROM [Sales].[OrderDetails];
GO 50

COMMIT;


-- 4b. Execute DELETE in TSQLV4_ADR Database

USE TSQLV4_ADR
GO

BEGIN TRAN
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
DELETE FROM [Sales].[OrderDetails_adr]
GO

-- 4c. Perform Rollback and Capture Time
ROLLBACK;

Fig. 7 og 8 viser os, at DELETE-operationen tog betydeligt længere tid at blive gennemført i TSQLV4_ADR-databasen, hvor vi aktiverede Accelerated Database Recovery, selvom det samme antal rækker blev slettet i begge databaser. Denne gang har vi dog større brug af transaktionslog i TSQLV4_NOADR-databasen.

Fig. 7 Slet eksekveringstid for TSQLV4_NOADR

Fig. 8 Slet eksekveringstid for TSQLV4_ADR

Fig. 9 Transaktionslogbrug efter sletninger

Nu var det ved at blive tydeligt, at DML-operationer tager længere tid i databaser med ADR aktiveret. Dette forklarer til dels, hvorfor funktionen er slået fra i første omgang. Når man tænker dybt over det, giver det mening, da SQL Server skal gemme rækkeversionerne i PVS, mens en indsættelses-, opdaterings- eller sletningsoperation kører. Uanset hvor lang tid DML'en tager, finder vi ud af, at udstedelse af en ROLLBACK med ADR slået TIL tager mindre end 1 millisekund (se fig. 10 – 13). I nogle tilfælde kan den hurtige tilbagerulning kompensere for selve DML'ens overhead, men ikke i alle tilfælde!

Fig. 10 eksekveringstid for ROLLBACK (efter SLETT) på TSQLV4_NOADR

Fig. 11 Udførelsestid for ROLLBACK (Efter SLETT) på TSQLV4_ADR

Fig. 12 Udførelsestid for ROLLBACK (Efter INSERT) på TSQLV4_NOADR

Fig. 13 Udførelsestid for ROLLBACK (Efter SLETT) på TSQLV4_ADR

Konklusion

Accelereret databasegendannelse er en af ​​de fantastiske funktioner, der er udgivet i SQL Server 2019. Men som med alle ekstremt gode ting i livet, skal nogen betale for det. ADR kan have en negativ effekt på ydeevnen i visse scenarier, så det er vigtigt at evaluere dit scenarie omhyggeligt, før du implementerer ADR i din produktionsdatabase. Microsoft anbefaler specifikt Accelerated Database Recovery til databaser, der understøtter arbejdsbelastninger med meget langvarige transaktioner, overdreven vækst af transaktionslogfiler eller hyppige udfald relateret til en langvarig genopretning.

Referencer

  1. Accelereret databasegendannelse

  2. Hvordan fungerer accelereret databasegendannelse?

  3. Accelereret databasegendannelse


  1. Sådan kører du Opatch i ikke-interaktiv form

  2. Sådan viser du de forældede funktioner i en SQL Server-instans ved hjælp af T-SQL

  3. Sådan finder du waitevent History of the Oracle session

  4. Jeg har glemt adgangskoden, jeg indtastede under postgres-installationen