Delen via


Wat is het databaseboek?

van toepassing op: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Het grootboek van de database maakt deel uit van de grootboekfunctie. Het grootboek van de database legt stapsgewijs de status van een database vast naarmate de database zich in de loop van de tijd ontwikkelt, terwijl updates worden uitgevoerd op grootboektabellen. Het maakt logisch gebruik van een blockchain en Merkle-boomgegevensstructuren.

Alle bewerkingen die een grootboektabel bijwerken, moeten enkele extra taken uitvoeren om de historische gegevens te onderhouden en de samenvattingen te berekenen die zijn vastgelegd in het databaseboek. Voor elke bijgewerkte rij moeten we het volgende doen:

  • De eerdere versie van de rij in de geschiedenistabel behouden.
  • Wijs de transactie-id toe en genereer een nieuw volgnummer, waarbij deze in de juiste systeemkolommen worden bewaard.
  • Serialiseer de rijinhoud en neem deze op bij het berekenen van de hash voor alle rijen die door deze transactie zijn bijgewerkt.

Grootboek bereikt dat door het uitbreiden van de DML-queryplannen ( Data Manipulation Language ) van alle invoeg-, update- en verwijderbewerkingen gericht op grootboektabellen. De transactie-id en het zojuist gegenereerde volgnummer worden ingesteld voor de nieuwe versie van de rij. Vervolgens voert de operator voor het queryplan een speciale expressie uit waarmee de rijinhoud wordt geserialiseerd en de hash wordt berekend, waarbij deze wordt toegevoegd aan een Merkle-structuur die is opgeslagen op transactieniveau en de hashes bevat van alle rijversies die door deze transactie voor deze grootboektabel zijn bijgewerkt. De wortel van de boom vertegenwoordigt alle updates en verwijderingen die door deze transactie in deze grootboektabel zijn uitgevoerd. Als de transactie meerdere tabellen bijwerken, wordt voor elke tabel een afzonderlijke Merkle Tree onderhouden. In de onderstaande afbeelding ziet u een voorbeeld van een Merkle Tree waarin de bijgewerkte rijversies van een grootboektabel worden opgeslagen en de indeling die wordt gebruikt om de rijen te serialiseren. Behalve de geserialiseerde waarde van elke kolom bevatten we metagegevens met betrekking tot het aantal kolommen in de rij, het rangnummer van afzonderlijke kolommen, de gegevenstypen, lengten en andere informatie die van invloed is op de manier waarop de waarden worden geïnterpreteerd.

Diagram met een Merkle Tree waarin de bijgewerkte rijversies van een grootboektabel worden opgeslagen en de indeling die wordt gebruikt om de rijen te serialiseren

Als u de status van de database wilt vastleggen, slaat het databaseboek een vermelding op voor elke transactie. Hiermee worden metagegevens over de transactie vastgelegd, zoals de tijdstempel voor doorvoeren en de identiteit van de gebruiker die deze heeft uitgevoerd. Daarnaast wordt de wortel van de Merkle-boom vastgelegd van de rijen die in elke tabel van het grootboek zijn bijgewerkt (zie hierboven). Deze vermeldingen worden vervolgens toegevoegd aan een manipulatieveilige gegevensstructuur om de integriteit in de toekomst te kunnen verifiëren. Een blok is gesloten:

Wanneer een blok wordt gesloten, worden nieuwe transacties ingevoegd in een nieuw blok. Vervolgens het proces voor het genereren van blokken:

  1. Hiermee worden alle transacties opgehaald die deel uitmaken van het gesloten blok uit zowel de wachtrij in het geheugen als de sys.database_ledger_transactions systeemcatalogusweergave.
  2. Berekent de Merkleboomwortel van deze transacties en de hash van het vorige blok.
  3. Behoudt het gesloten blok in de sys.database_ledger_blocks systeemcatalogusweergave.

Omdat dit een reguliere tabelupdate is, garandeert het systeem automatisch de duurzaamheid. Als u de afzonderlijke keten van blokken wilt behouden, wordt deze bewerking met één thread uitgevoerd. Maar het is ook efficiënt, omdat alleen de hashes worden berekend over de transactiegegevens en asynchroon gebeurt. Dit heeft geen invloed op de transactieprestaties.

Diagram met een Merkle Tree waarin de transacties van een grootboektabel worden opgeslagen.

Zie de artikelen, Digest-beheer en databaseverificatie voor meer informatie over hoe grootboek gegevensintegriteit biedt.

Waar worden databasetransacties en blokgegevens opgeslagen?

De gegevens voor transacties en blokken worden fysiek opgeslagen als rijen in twee systeemcatalogusweergaven:

  • sys.database_ledger_transactions: Onderhoudt een rij met de informatie van elke transactie in het database-grootboek. De informatie bevat de id van het blok waartoe deze transactie behoort en het rangnummer van de transactie in het blok.
  • sys.database_ledger_blocks: Behoudt een rij voor elk blok in het grootboek, inclusief de wortel van de Merkle-boom over de transacties binnen het blok en de hash van het vorige blok om een blockchain te vormen.

Als u het database-grootboek wilt weergeven, voert u de volgende T-SQL-instructies uit in SQL Server Management Studio of SQL Server Developer Tools.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Het volgende voorbeeld van een grootboektabel bestaat uit vier transacties die één blok vormen in de blockchain van het grootboek van de database:

Schermopname van een voorbeeld van een grootboektabel.

Permissions

Voor het weergeven van het database-grootboek is de VIEW LEDGER CONTENT machtiging vereist. Zie Machtigingen voor meer informatie over machtigingen met betrekking tot grootboektabellen.