Dela via


Vad är databasregistret?

gäller för: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Databasregistret är en del av transaktionsregisterfunktionen. Databasregistret avbildar inkrementellt tillståndet för en databas när databasen utvecklas över tid, medan uppdateringar sker i transaktionsregistertabeller. Den använder logiskt en blockkedja och Merkle-träddatastrukturer.

Alla åtgärder som uppdaterar en transaktionsregistertabell måste utföra ytterligare uppgifter för att underhålla historiska data och beräkna sammandrag som samlas in i databasregistret. Mer specifikt måste vi för varje rad som uppdateras:

  • Spara den tidigare versionen av raden i historiktabellen.
  • Tilldela transaktions-ID:t och generera ett nytt sekvensnummer som bevarar dem i lämpliga systemkolumner.
  • Serialisera radinnehållet och inkludera det när du beräknar hashen för alla rader som uppdateras av den här transaktionen.

Ledger uppnår detta genom att utöka DML-frågeplanerna ( Data Manipulation Language ) för alla infognings-, uppdaterings- och borttagningsåtgärder som riktar sig till transaktionsregistertabeller. Transaktions-ID:t och det nyligen genererade sekvensnumret anges för den nya versionen av raden. Sedan kör frågeplansoperatorn ett specialuttryck som serialiserar radinnehållet och beräknar dess hash, och lägger till det i ett Merkle-träd som lagras på transaktionsnivå och innehåller hashvärden för alla radversioner som uppdateras av den här transaktionen för den här transaktionstabellen. Roten i trädet representerar alla uppdateringar och borttagningar som utfördes av denna transaktion i detta register. Om transaktionen uppdaterar flera tabeller underhålls ett separat Merkle-träd för varje tabell. Bilden nedan visar ett exempel på ett Merkle-träd som lagrar de uppdaterade radversionerna av en transaktionsregistertabell och det format som används för att serialisera raderna. Förutom det serialiserade värdet för varje kolumn inkluderar vi metadata om antalet kolumner i raden, ordningstalet för enskilda kolumner, datatyper, längder och annan information som påverkar hur värdena tolkas.

Diagram som visar ett Merkle-träd som lagrar de uppdaterade radversionerna av en transaktionsregistertabell och det format som används för att serialisera raderna

För att samla in databasens tillstånd lagrar databasregistret en post för varje transaktion. Den samlar in metadata om transaktionen, till exempel tidsstämpeln för incheckning och identiteten för den användare som körde den. Den samlar också in Merkle-trädroten för raderna som uppdateras i varje transaktionsregistertabell (se ovan). Dessa poster läggs sedan till i en manipuleringssäker datastruktur för att möjliggöra verifiering av integritet i framtiden. Ett block är stängt:

När ett block stängs infogas nya transaktioner i ett nytt block. Blockgenereringsprocessen därefter:

  1. Hämtar alla transaktioner som tillhör det stängda blocket från både minnesintern kö och sys.database_ledger_transactions systemkatalogvy.
  2. Beräknar Merkle-trädroten över dessa transaktioner och hashen för föregående block.
  3. Bevarar det stängda blocket i systemkatalogvyn sys.database_ledger_blocks.

Eftersom det här är en vanlig tabelluppdatering garanterar systemet automatiskt dess hållbarhet. För att upprätthålla en enda kedja av block är denna operation enkeltrådad. Men det är också effektivt eftersom det bara beräknar hashvärden över transaktionsinformationen och sker asynkront. Det påverkar inte transaktionsprestandan.

Diagram som visar ett Merkle-träd som lagrar transaktionerna i en transaktionsregistertabell.

Mer information om hur transaktionsregistret ger dataintegritet finns i artiklarna, Sammanfattad hantering och Databasverifiering.

Var lagras transaktioner i databasen och blockdata?

Data för transaktioner och block lagras fysiskt som rader i två systemkatalogvyer:

  • sys.database_ledger_transactions: Underhåller en rad med information om varje transaktion i databasregistret. Informationen innehåller ID:t för blocket där den här transaktionen tillhör och ordningstalet för transaktionen i blocket.
  • sys.database_ledger_blocks: Underhåller en rad för varje block i transaktionsregistret, inklusive roten i Merkle-trädet över transaktionerna i blocket och hashen för föregående block för att bilda en blockkedja.

Om du vill visa databasregistret kör du följande T-SQL-instruktioner i SQL Server Management Studio eller SQL Server Developer Tools.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Följande exempel på en transaktionsregistertabell består av fyra transaktioner som utgjorde ett block i blockkedjan för databasregistret:

Skärmbild av en exempeltabell för transaktionsregistret.

Permissions

För att kunna visa databasregistret krävs behörigheten VIEW LEDGER CONTENT . Mer information om behörigheter som rör transaktionsregistertabeller finns i Behörigheter.