Was ist der Datenbankledger?

Gilt für: SQL Server 2022 (16.x) Azure SQL-DatenbankAzure SQL Managed Instance

Der Datenbankledger ist Teil des Ledgerfeatures. Der Datenbank-Ledger erfasst schrittweise den Zustand einer Datenbank, die sich im Laufe der Zeit entwickelt, während Aktualisierungen der Ledger-Tabellen stattfinden. Er verwendet logisch eine Blockchain und Hashbaum-Datenstrukturen.

Alle Vorgänge, die eine Ledgertabelle aktualisieren, müssen einige zusätzliche Aufgaben ausführen, um die historischen Daten beizubehalten und die im Datenbankledger erfassten Digests zu berechnen. Insbesondere ist für jede Zeile, die aktualisiert wird, Folgendes erforderlich:

  • Speichern Sie die frühere Version der Zeile in der Verlaufstabelle.
  • Weisen Sie die Transaktions-ID zu, generieren Sie eine neue Sequenznummer, und speichern Sie sie in den entsprechenden Systemspalten.
  • Serialisieren Sie den Zeileninhalt, und fügen Sie ihn beim Berechnen des Hashs für alle Zeilen ein, die von dieser Transaktion aktualisiert werden.

Ledger erreicht dies, indem die Abfragepläne für die Datenbearbeitungssprache (Data Manipulation Language, DML) aller Einfüge-, Aktualisierungs- und Löschvorgänge für die Ledgertabellen erweitert werden. Die Transaktions-ID und die neu generierte Sequenznummer werden für die neue Version der Zeile festgelegt. Anschließend führt der Abfrageplanoperator einen speziellen Ausdruck aus, der den Zeileninhalt serialisiert und seinen Hash berechnet; er wird an eine Merkle-Struktur angefügt, die auf Transaktionsebene gespeichert ist und die Hashes aller Zeilenversionen enthält, die von dieser Transaktion für diese Ledgertabelle aktualisiert wurden. Der Stamm der Struktur stellt alle Aktualisierungen und Löschungen dar, die von dieser Transaktion in dieser Ledgertabelle ausgeführt wurden. Wenn die Transaktion mehrere Tabellen aktualisiert, wird für jede Tabelle eine separate Merkle-Struktur verwaltet. Die folgende Abbildung zeigt ein Beispiel für eine Merkle-Struktur, die die aktualisierten Zeilenversionen einer Ledgertabelle und das Format zum Serialisieren der Zeilen speichert. Neben dem serialisierten Wert jeder Spalte werden Metadaten aufgenommen zur Anzahl der Spalten in der Zeile, dem Ordnungszeichen einzelner Spalten, den Datentypen, Längen und anderen Informationen, die sich auf die Interpretation der Werte auswirken.

Diagram that shows a Merkle Tree storing the updated row versions of a ledger table and the format used to serialize the rows

Um den Status der Datenbank zu erfassen, speichert der Datenbank-Ledger einen Eintrag für jede Transaktion. Er erfasst Metadaten zur Transaktion, z. B. den Commitzeitstempel und die Identität des Benutzers, der sie ausgeführt hat. Außerdem wird der Merkle-Strukturstamm der Zeilen erfasst, die in jeder Ledgertabelle aktualisiert wurden (siehe oben). Diese Einträge werden dann an eine manipulationssichere Datenstruktur angefügt, um die Überprüfung der Integrität in Zukunft zu ermöglichen. Ein Block wird geschlossen:

Wenn ein Block geschlossen wird, werden neue Transaktionen in einen neuen Block eingefügt. Der Blockgenerierungsprozess führt dann folgende Aktionen aus:

  1. Abrufen aller Transaktionen, die zum geschlossenen Block gehören, sowohl aus der Warteschlange im Arbeitsspeicher als auch der Systemkatalogsicht sys.database_ledger_transactions.
  2. Berechnen des Merkle-Strukturstamms für diese Transaktionen und des Hashs des vorherigen Blocks.
  3. Speichern des geschlossenen Blocks in der Systemkatalogsicht sys.database_ledger_blocks.

Da es sich hierbei um eine reguläre Tabellenaktualisierung handelt, wird die Dauerhaftigkeit automatisch vom System garantiert. Um die einzelne Kette von Blöcken zu verwalten, hat dieser Vorgang nur einen einzigen Thread. Er ist aber auch effizient, da er nur die Hashes über die Transaktionsinformationen berechnet und asynchron erfolgt. Dies verlangsamt nicht die Transaktion.

Diagram that shows a Merkle Tree storing the transactions of a ledger table.

Weitere Informationen dazu, wie Ledger Datenintegrität bietet, finden Sie unter Digestverwaltung und Datenbanküberprüfung.

Wo werden Datenbanktransaktionen gespeichert und Daten blockiert?

Die Daten zu Transaktionen und Blöcken werden physisch als Zeilen in zwei Systemkatalogsichten gespeichert:

  • sys.database_ledger_transactions: Verwaltet eine Zeile mit den Informationen jeder Transaktion im Datenbankbuch. Die Informationen umfassen die ID des Blocks, zu dem diese Transaktion gehört, und die Ordnungszahl der Transaktion innerhalb des Blocks.
  • sys.database_ledger_blocks: Verwaltet eine Zeile für jeden Block im Ledger, einschließlich des Hashbaum-Stamms über den Transaktionen innerhalb des Blocks und des Hashs des vorherigen Blocks, um eine Blockchain zu bilden.

Führen Sie zum Anzeigen des Datenbankbuchs die folgenden T-SQL-Anweisungen in SQL Server Management Studio, Azure Data Studio oder SQL Server Developer Tools aus.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Das folgende Beispiel zeigt eine Ledger-Tabelle aus vier Transaktionen, aus denen ein Block in der Blockchain des Datenbank-Ledgers besteht:

Screenshot of an example ledger table.

Berechtigungen

Zum Anzeigen des Datenbankbuchs ist die VIEW LEDGER CONTENT Berechtigung erforderlich. Weitere Informationen zu Berechtigungen im Zusammenhang mit Ledgertabellen finden Sie unter Berechtigungen.