Что собой представляет реестр базы данных?
Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure
Реестр баз данных является компонентом функции реестра. Реестр базы данных постепенно фиксирует состояние базы данных по мере ее развития с течением времени, пока в таблицах реестра происходят обновления. Он логически использует блокчейн и структуры данных в виде дерева Меркла.
Все операции, обновляющие таблицу реестра, должны выполнять некоторые дополнительные задачи для хранения исторических данных и вычисления дайджестов, захваченных в реестре базы данных. В частности, для каждой обновляемой строки необходимо сделать следующее.
- Сохранить предыдущую версию строки в таблице журнала.
- Назначить идентификатор транзакции и создать новый порядковый номер, сохраняя их в соответствующих системных столбцах.
- Сериализовать содержимое строки и включить его при вычислении хэша для всех строк, обновленных данной транзакцией.
Реестр достигает этого путем расширения планов запросов языка обработки данных (DML) всех операций вставки, обновления и удаления, предназначенных для таблиц реестра. Идентификатор транзакции и вновь созданный порядковый номер задаются для новой версии строки. Затем оператор плана запроса выполняет специальное выражение, которое сериализует содержимое строки и вычисляет ее хэш, добавляя его в дерево Меркла, которое хранится на уровне транзакции и содержит хэши всех версий строк, обновленных данной транзакцией для этой таблицы реестра. Корень дерева представляет все обновления и удаления, выполненные данной транзакцией в этой таблице реестра. Если транзакция обновляет несколько таблиц, для каждой таблицы используется отдельное дерево Меркла. На рисунке ниже показан пример дерева Меркла, в котором хранятся обновленные версии строк таблицы реестра и формат, используемый для сериализации строк. Кроме сериализованного значения каждого столбца, мы включаем метаданные, касающиеся количества столбцов в строке, порядкового номера отдельных столбцов, типов данных, длин и других сведений, влияющих на интерпретацию значений.
Чтобы регистрировать состояние базы данных, в реестр заносится запись о каждой транзакции. В нем сохраняются метаданные о транзакции, например метка времени фиксации и удостоверение пользователя, выполнившего ее. В нем также фиксируется корень дерева Меркла для строк, обновленных в каждой таблице реестра (см. выше). Эти записи затем добавляются в структуру данных, защищенную от несанкционированного доступа, чтобы обеспечить возможность последующей проверки целостности. Блок закрывается:
- примерно каждые 30 секунд при настройке базы данных для автоматического сохранения дайджеста базы данных;
- когда пользователь вручную создает дайджесты базы данных путем выполнения хранимой процедуры sys.sp_generate_database_ledger_digest;
- если он содержит 100 тысяч транзакций.
Когда блок закрыт, новые транзакции будут вставляться в новый блок. Затем процесс создания блока делает следующее:
- получает все транзакции, относящиеся к блоку closed, из очереди в памяти и системного представления каталога sys.database_ledger_transactions;
- вычисляет корень дерева Меркла для этих транзакций и хэш предыдущего блока;
- сохраняет закрытый блок в системном представлении каталога sys.database_ledger_blocks.
Так как это регулярное обновление таблицы, его устойчивость автоматически гарантируется системой. Для поддержания одной цепочки блоков эта операция выполняется в один поток. Но она также эффективна, поскольку вычисляет только хэш сведений о транзакции и выполняется асинхронно. Это не влияет на производительность транзакции.
Дополнительные сведения о том, как в реестре обеспечивается целостность данных, см. в статьях Управление дайджестами и Проверка базы данных.
Где хранятся транзакции базы данных и блочные данные?
Данные о транзакциях и блоках физически хранятся в виде строк в двух представлениях системного каталога.
- sys.database_ledger_transactions: содержит строку с информацией о каждой транзакции в реестре базы данных. Эта информация включает идентификатор блока, к которому относится транзакция, и порядковый номер транзакции в блоке.
- sys.database_ledger_blocks: содержит строку для каждого блока в реестре, включая корень дерева Меркла для транзакций внутри блока и хэш-код предыдущего блока для формирования блокчейна.
Чтобы просмотреть реестр базы данных, выполните следующие инструкции T-SQL в SQL Server Management Studio, Azure Data Studio или средства разработчика SQL Server.
SELECT * FROM sys.database_ledger_transactions;
GO
SELECT * FROM sys.database_ledger_blocks;
GO
Ниже приведен пример таблицы реестра, которая содержит четыре транзакции, составляющие один блок в блокчейне реестра базы данных.
Разрешения
Для просмотра реестра базы данных требуется VIEW LEDGER CONTENT
разрешение. Подробные сведения о разрешениях, связанных с таблицами реестра, см. в статье Разрешения.