Поделиться через


Что собой представляет реестр базы данных?

Применимо к: SQL Server 2022 (16.x) и более поздних версий База данных Azure SQLУправляемый экземпляр Azure SQL

Реестр баз данных является компонентом функции реестра. Реестр базы данных постепенно фиксирует состояние базы данных по мере ее развития с течением времени, пока в таблицах реестра происходят обновления. Он логически использует блокчейн и структуры данных в виде дерева Меркла.

Все операции, обновляющие таблицу реестра, должны выполнять некоторые дополнительные задачи для хранения исторических данных и вычисления дайджестов, захваченных в реестре базы данных. В частности, для каждой обновляемой строки необходимо сделать следующее.

  • Сохранить предыдущую версию строки в таблице журнала.
  • Назначить идентификатор транзакции и создать новый порядковый номер, сохраняя их в соответствующих системных столбцах.
  • Сериализовать содержимое строки и включить его при вычислении хэша для всех строк, обновленных данной транзакцией.

Реестр достигает этого путем расширения планов запросов языка обработки данных (DML) всех операций вставки, обновления и удаления, предназначенных для таблиц реестра. Идентификатор транзакции и вновь созданный порядковый номер задаются для новой версии строки. Затем оператор плана запроса выполняет специальное выражение, которое сериализует содержимое строки и вычисляет ее хэш, добавляя его в дерево Меркла, которое хранится на уровне транзакции и содержит хэши всех версий строк, обновленных данной транзакцией для этой таблицы реестра. Корень дерева представляет все обновления и удаления, выполненные данной транзакцией в этой таблице реестра. Если транзакция обновляет несколько таблиц, для каждой таблицы используется отдельное дерево Меркла. На рисунке ниже показан пример дерева Меркла, в котором хранятся обновленные версии строк таблицы реестра и формат, используемый для сериализации строк. Кроме сериализованного значения каждого столбца, мы включаем метаданные, касающиеся количества столбцов в строке, порядкового номера отдельных столбцов, типов данных, длин и других сведений, влияющих на интерпретацию значений.

Схема, на котором показано дерево Merkle, в котором хранятся обновленные версии таблицы реестра и формат, используемый для сериализации строк.

Чтобы регистрировать состояние базы данных, в реестр заносится запись о каждой транзакции. В нем сохраняются метаданные о транзакции, например метка времени фиксации и удостоверение пользователя, выполнившего ее. В нем также фиксируется корень дерева Меркла для строк, обновленных в каждой таблице реестра (см. выше). Эти записи затем добавляются в структуру данных, защищенную от несанкционированного доступа, чтобы обеспечить возможность последующей проверки целостности. Блок закрывается:

Когда блок закрыт, новые транзакции будут вставляться в новый блок. Затем процесс создания блока делает следующее:

  1. получает все транзакции, относящиеся к блоку closed, из очереди в памяти и системного представления каталога sys.database_ledger_transactions;
  2. вычисляет корень дерева Меркла для этих транзакций и хэш предыдущего блока;
  3. сохраняет закрытый блок в системном представлении каталога sys.database_ledger_blocks.

Так как это регулярное обновление таблицы, его устойчивость автоматически гарантируется системой. Для поддержания одной цепочки блоков эта операция выполняется в один поток. Но она также эффективна, поскольку вычисляет только хэш сведений о транзакции и выполняется асинхронно. Это не влияет на производительность транзакции.

Схема, на котором показано дерево Merkle, в котором хранятся транзакции таблицы реестра.

Дополнительные сведения о том, как в реестре обеспечивается целостность данных, см. в статьях Управление дайджестами и Проверка базы данных.

Где хранятся транзакции базы данных и блочные данные?

Данные о транзакциях и блоках физически хранятся в виде строк в двух представлениях системного каталога.

  • sys.database_ledger_transactions: содержит строку с информацией о каждой транзакции в реестре базы данных. Эта информация включает идентификатор блока, к которому относится транзакция, и порядковый номер транзакции в блоке.
  • sys.database_ledger_blocks: содержит строку для каждого блока в реестре, включая корень дерева Меркла для транзакций внутри блока и хэш-код предыдущего блока для формирования блокчейна.

Чтобы просмотреть реестр базы данных, выполните следующие инструкции T-SQL в SQL Server Management Studio или средства разработчика SQL Server.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Ниже приведен пример таблицы реестра, которая содержит четыре транзакции, составляющие один блок в блокчейне реестра базы данных.

Снимок экрана с примером таблицы реестра.

Разрешения

Для просмотра реестра базы данных требуется VIEW LEDGER CONTENT разрешение. Подробные сведения о разрешениях, связанных с таблицами реестра, см. в статье Разрешения.