Che cos'è il libro mastro del database?

Si applica a: SQL Server 2022 (16.x) Database Azure SQLIstanza gestita di SQL di Azure

Il libro mastro del database fa parte della funzionalità libro mastro. Il libro mastro del database acquisisce in modo incrementale lo stato di un database man mano che il database evolve nel corso del tempo, mentre gli aggiornamenti vengono eseguiti nelle tabelle del libro mastro. Usa logicamente una blockchain e Strutture dei dati ad albero di Merkle.

Tutte le operazioni che aggiornano una tabella del libro mastro devono eseguire alcune attività aggiuntive per gestire i dati storici e calcolare i riepiloghi acquisiti nel libro mastro del database. In particolare, per ogni riga aggiornata, è necessario:

  • Salvare in modo permanente la versione precedente della riga nella tabella di cronologia.
  • Assegnare l'ID transazione e generare un nuovo numero di sequenza, salvandoli nelle colonne di sistema appropriate.
  • Serializzare il contenuto della riga e includerlo durante il calcolo dell'hash per tutte le righe aggiornate da questa transazione.

Il libro mastro ottiene questo risultato estendendo i piani di query Data Manipulation Language (DML) di tutte le operazioni di inserimento, aggiornamento ed eliminazione delle operazioni destinate alle tabelle del libro mastro. L'ID transazione e il numero di sequenza appena generato vengono impostati per la nuova versione della riga. L'operatore del piano di query esegue quindi un'espressione speciale che serializza il contenuto della riga e ne calcola l'hash, accodandolo a un albero di Merkle archiviato a livello di transazione e che contiene gli hash di tutte le versioni di riga aggiornate da questa transazione per questa tabella del libro mastro. La radice dell'albero rappresenta tutti gli aggiornamenti e le eliminazioni eseguite da questa transazione in questa tabella del libro mastro. Se la transazione aggiorna più tabelle, viene mantenuto un albero di Merkle separato per ogni tabella. La figura seguente mostra un esempio di albero di Merkle che archivia le versioni di riga aggiornate di una tabella del libro mastro e il formato usato per serializzare le righe. Oltre al valore serializzato di ogni colonna, sono inclusi i metadati relativi al numero di colonne nella riga, all'ordinale delle singole colonne, ai tipi di dati, alle lunghezze e ad altre informazioni che influiscono sulla modalità di interpretazione dei valori.

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

Per acquisire lo stato del database, il libro mastro del database archivia un'immissione per ogni transazione. Acquisisce i metadati relativi alla transazione, ad esempio data e ora di commit e l'identità dell'utente che lo ha eseguito. Acquisisce anche la radice dell'albero di Merkle delle righe aggiornate in ogni tabella del libro mastro (vedere sopra). Queste voci vengono quindi accodate a una struttura dei dati con prova di manomissione per consentire la verifica dell'integrità in futuro. Un blocco viene chiuso:

Quando un blocco viene chiuso, le nuove transazioni vengono inserite in un nuovo blocco. Il processo di generazione dei blocchi, quindi:

  1. Recupera tutte le transazioni che appartengono al blocco chiuso sia dalla coda in memoria che dalla vista del catalogo di sistema sys.database_ledger_transactions.
  2. Calcola la radice dell'albero di Merkle su queste transazioni e l'hash del blocco precedente.
  3. Salva il blocco chiuso nella vista del catalogo di sistema sys.database_ledger_blocks.

Poiché si tratta di un normale aggiornamento della tabella, il sistema garantisce automaticamente la durabilità. Per mantenere la singola catena di blocchi, questa operazione è a single threading. Ma è anche efficiente, perché calcola gli hash solo sulle informazioni delle transazioni e si verifica in modo asincrono. Non influisce sulle prestazioni delle transazioni.

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

Per ulteriori informazioni su come il libro mastro fornisce l'integrità dei dati, vedere gli articoli Gestione del riepilogo e Verifica del database.

Dove vengono archiviati i dati delle transazioni del database e in blocchi?

I dati per transazioni e blocchi vengono archiviati fisicamente come righe in due viste del catalogo di sistema:

  • sys.database_ledger_transactions: mantiene una riga con le informazioni di ogni transazione nel libro mastro del database. Le informazioni includono l'ID del blocco a cui appartiene la transazione e l'ordinale della transazione all'interno del blocco.
  • sys.database_ledger_blocks: mantiene una riga per ogni blocco nel libro mastro, inclusa la radice dell'albero di Merkle sulle transazioni all'interno del blocco e l'hash del blocco precedente per formare una blockchain.

Per visualizzare il libro mastro del database, eseguire le istruzioni T-SQL seguenti in SQL Server Management Studio, Azure Data Studio o SQL Server Developer Tools.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

L'esempio seguente di una tabella del libro mastro è costituito da quattro transazioni che costituiscono un blocco nella blockchain del libro mastro del database:

Screenshot of an example ledger table.

Autorizzazioni

La visualizzazione del libro mastro del database richiede l'autorizzazione VIEW LEDGER CONTENT. Per conoscere i dettagli sulle autorizzazioni relative alle tabelle del libro mastro, vedere Autorizzazioni.