Udostępnij za pomocą


Co to jest rejestr bazy danych?

Dotyczy: SQL Server 2022 (16.x) i nowsze wersje usługi Azure SQL DatabaseAzure SQL Managed Instance

Rejestr bazy danych jest częścią funkcjonalności księgi rachunkowej. Rejestr bazy danych przyrostowo przechwytuje stan bazy danych w miarę rozwoju bazy danych wraz z upływem czasu, podczas gdy aktualizacje są wykonywane w tabelach rejestru. Logicznie używa struktury danych łańcucha bloków i drzewa Merkle.

Wszelkie operacje aktualizujące tabelę rejestru muszą wykonywać dodatkowe zadania, aby zachować dane historyczne i obliczyć skróty przechwycone w rejestrze bazy danych. W szczególności dla każdego zaktualizowanego wiersza musimy:

  • Utrwał wcześniejszą wersję wiersza w tabeli historii.
  • Przypisz identyfikator transakcji i wygeneruj nowy numer sekwencji, utrwalając je w odpowiednich kolumnach systemowych.
  • Serializuj zawartość wiersza i uwzględnij ją podczas obliczania skrótu dla wszystkich wierszy zaktualizowanych przez tę transakcję.

Rejestr osiąga to przez rozszerzenie planów zapytań języka manipulowania danymi (DML) wszystkich operacji wstawiania, aktualizowania i usuwania przeznaczonych dla tabel rejestru. Identyfikator transakcji i nowo wygenerowany numer sekwencji są ustawione dla nowej wersji wiersza. Następnie operator planu zapytania wykonuje specjalne wyrażenie, które serializuje zawartość wiersza i oblicza jego skrót, dołączając go do drzewa Merkle przechowywanego na poziomie transakcji i zawiera skróty wszystkich wersji wierszy zaktualizowanych przez tę transakcję dla tej tabeli rejestru. Korzeń drzewa reprezentuje wszystkie aktualizacje i usunięcia wykonane przez tę transakcję w tej tabeli księgi głównej. Jeśli transakcja aktualizuje wiele tabel, oddzielne drzewo Merkle jest obsługiwane dla każdej tabeli. Na poniższej ilustracji przedstawiono przykład drzewa Merkle przechowujące zaktualizowane wersje wierszy tabeli rejestru i format używany do serializacji wierszy. Poza serializowaną wartością każdej kolumny uwzględniamy metadane dotyczące liczby kolumn w wierszu, porządkowych poszczególnych kolumn, typów danych, długości i innych informacji, które mają wpływ na sposób interpretowania wartości.

Diagram przedstawiający drzewo Merkle przechowujące zaktualizowane wersje wierszy tabeli rejestru i format używany do serializacji wierszy

Aby przechwycić stan bazy danych, rejestr bazy danych przechowuje wpis dla każdej transakcji. Przechwytuje metadane dotyczące transakcji, takie jak sygnatura czasowa zatwierdzenia i tożsamość użytkownika, który go wykonał. Przechwytuje również korzeń drzewa Merkle dla wierszy zaktualizowanych w każdej tabeli rejestru (patrz powyżej). Te wpisy są następnie dołączane do struktury danych umożliwiających wykrycie naruszenia w celu umożliwienia weryfikacji integralności w przyszłości. Blok jest zamknięty:

Po zamknięciu bloku nowe transakcje zostaną wstawione do nowego bloku. Następnie proces generowania bloków:

  1. Pobiera wszystkie transakcje należące do bloku zamkniętego zarówno z kolejki w pamięci, jak i systemowego widoku katalogowego sys.database_ledger_transactions.
  2. Oblicza korzeń drzewa Merkle dla tych transakcji oraz skrót z poprzedniego bloku.
  3. Zachowuje zamknięty blok w widoku katalogu systemowego sys.database_ledger_blocks .

Ponieważ jest to regularna aktualizacja tabeli, system automatycznie gwarantuje trwałość. Aby zachować pojedynczy łańcuch bloków, ta operacja jest jednowątkowa. Jest to jednak również wydajne, ponieważ oblicza skróty wyłącznie na podstawie informacji o transakcji i odbywa się to asynchronicznie. Nie ma to wpływu na wydajność transakcji.

Diagram przedstawiający drzewo Merkle przechowujące transakcje tabeli rejestru.

Aby uzyskać więcej informacji na temat sposobu zapewniania integralności danych przez rejestr, zobacz artykuły Zarządzanie skrótami i Weryfikacja bazy danych.

Gdzie są przechowywane transakcje bazy danych i dane blokowe?

Dane dotyczące transakcji i bloków są fizycznie przechowywane jako wiersze w dwóch widokach wykazu systemu:

  • sys.database_ledger_transactions: utrzymuje wiersz z informacjami o każdej transakcji w rejestrze bazy danych. Informacje zawierają identyfikator bloku, do którego należy ta transakcja, oraz porządkowość transakcji w bloku.
  • pl-PL: sys.database_ledger_blocks: Utrzymuje wiersz dla każdego bloku w rejestrze, w tym korzeń drzewa Merkle nad transakcjami w bloku oraz skrót poprzedniego bloku, aby utworzyć łańcuch bloków.

Aby wyświetlić rejestr bazy danych, uruchom następujące instrukcje języka T-SQL w programie SQL Server Management Studio lub SQL Server Developer Tools.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Poniższy przykład tabeli rejestru składa się z czterech transakcji składających się na jeden blok w łańcuchu bloków rejestru bazy danych:

Zrzut ekranu przedstawiający przykładową tabelę rejestru.

Permissions

Wyświetlenie rejestru bazy danych wymaga VIEW LEDGER CONTENT uprawnienia. Aby uzyskać szczegółowe informacje na temat uprawnień związanych z tabelami rejestru, zobacz Uprawnienia.