Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к: SQL Server 2022 (16.x) и более поздних версий
База данных Azure SQL
Управляемый экземпляр Azure SQL
Реестр баз данных является компонентом функции реестра. Реестр базы данных постепенно фиксирует состояние базы данных по мере ее развития с течением времени, пока в таблицах реестра происходят обновления. Он логически использует блокчейн и структуры данных в виде дерева Меркла.
Все операции, обновляющие таблицу реестра, должны выполнять некоторые дополнительные задачи для хранения исторических данных и вычисления дайджестов, захваченных в реестре базы данных. В частности, для каждой обновляемой строки необходимо сделать следующее.
- Сохранить предыдущую версию строки в таблице журнала.
- Назначить идентификатор транзакции и создать новый порядковый номер, сохраняя их в соответствующих системных столбцах.
- Сериализовать содержимое строки и включить его при вычислении хэша для всех строк, обновленных данной транзакцией.
Реестр достигает этого путем расширения планов запросов языка обработки данных (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 или средства разработчика SQL Server.
SELECT * FROM sys.database_ledger_transactions;
GO
SELECT * FROM sys.database_ledger_blocks;
GO
Ниже приведен пример таблицы реестра, которая содержит четыре транзакции, составляющие один блок в блокчейне реестра базы данных.
Разрешения
Для просмотра реестра базы данных требуется VIEW LEDGER CONTENT разрешение. Подробные сведения о разрешениях, связанных с таблицами реестра, см. в статье Разрешения.