Log Sequence Number
Log Sequence Number (LSN, номер последовательности журнала) — это монотонно возрастающий уникальный идентификатор, присваиваемый каждой записи в журнале транзакций (transaction log) системы управления базами данных (СУБД). LSN используется для обеспечения атомарности, согласованности, изоляции и долговечности (ACID) транзакций, а также для восстановления базы данных после сбоев.
Назначение
Основная функция LSN — упорядочивание операций записи в журнал транзакций. Каждая операция модификации данных (вставка, обновление, удаление) фиксируется в журнале с присвоением LSN. Это позволяет СУБД точно определить хронологию изменений, что критически важно для:
- Отката транзакций (rollback): при необходимости отменить изменения, СУБД использует LSN для поиска и отмены всех записей, относящихся к конкретной транзакции.
- Восстановления после сбоя (crash recovery): при запуске после аварийного завершения, СУБД анализирует журнал от последней контрольной точки (checkpoint) до конца, используя LSN для определения, какие изменения были зафиксированы, а какие нет.
- Репликации и резервного копирования: LSN служит маркером для синхронизации данных между серверами (например, в PostgreSQL — через WAL (Write-Ahead Log) и LSN).
- Управления контрольными точками (checkpoints): СУБД периодически создаёт контрольные точки, фиксируя LSN, до которого все изменения гарантированно записаны на диск. Это ускоряет восстановление.
Структура и формат
Формат LSN зависит от конкретной СУБД, но общий принцип — это 64-битное или 128-битное целое число, которое монотонно возрастает. В большинстве реляционных СУБД (например, PostgreSQL, SQL Server, Oracle) LSN представлен в виде пары чисел:
- Номер журнала (log file number): указывает на физический файл журнала, в котором находится запись.
- Смещение (offset): позиция записи внутри файла.
Пример в PostgreSQL: 0/16B3748 — где первая часть (0) — номер файла WAL, вторая (16B3748) — смещение в байтах.
В Microsoft SQL Server LSN также имеет три компонента: (VLF Sequence Number, Log Block Number, Slot Number), где VLF (Virtual Log File) — виртуальный файл журнала.
Принцип работы
- Генерация LSN: При каждом изменении данных СУБД создаёт новую запись в журнале и присваивает ей следующий по порядку LSN. LSN строго возрастает в пределах одной базы данных.
- Запись в журнал: Запись содержит LSN, идентификатор транзакции, тип операции (INSERT, UPDATE, DELETE), а также данные до и после изменения (для возможности отката).
- Фиксация транзакции: При COMMIT транзакции СУБД записывает в журнал запись с LSN, подтверждающую фиксацию. Только после этого изменения считаются долговечными.
- Использование при восстановлении:
- REDO: СУБД применяет все записи с LSN, большим, чем LSN последней контрольной точки, для восстановления данных до последнего зафиксированного состояния.
- UNDO: СУБД отменяет изменения транзакций, которые не были зафиксированы (их LSN не имеют соответствующей записи COMMIT).
Примеры в различных СУБД
PostgreSQL
В PostgreSQL LSN называется WAL position и используется в механизме Write-Ahead Log (WAL). LSN представлен в формате X/Y, где X — 32-битный номер файла WAL, Y — 32-битное смещение. LSN можно получить с помощью функций pg_current_wal_lsn() или pg_last_wal_replay_lsn(). LSN используется для:
- Определения точки восстановления (recovery target).
- Настройки репликации (например, в
pg_stat_replication). - Управления архивацией WAL.
Microsoft SQL Server
В SQL Server LSN называется Log Sequence Number и имеет формат (VLF Sequence Number, Log Block Number, Slot Number). LSN используется для:
- Восстановления базы данных (RESTORE ... WITH STOPAT, STOPBEFOREMARK).
- Определения точек восстановления (log backup chain).
- Анализа активности с помощью функции
fn_dblog().
Oracle Database
В Oracle LSN называется System Change Number (SCN). SCN — это 64-битное число, которое генерируется глобально в кластере. SCN используется для:
- Управления многоверсионностью (MVCC).
- Восстановления после сбоя (instance recovery).
- Репликации (Data Guard, GoldenGate).
Связь с контрольными точками
Контрольная точка (checkpoint) — это событие, при котором СУБД записывает все изменённые страницы данных из буферного кэша на диск и фиксирует в журнале LSN, до которого все изменения гарантированно сохранены. При восстановлении СУБД начинает анализ журнала с LSN последней контрольной точки, что сокращает время восстановления.
Ограничения и особенности
- Монотонность: LSN должен строго возрастать, чтобы обеспечить однозначную хронологию. Нарушение монотонности (например, при повреждении журнала) может привести к невозможности восстановления.
- Размер: В большинстве СУБД LSN — 64-битное число, что теоретически позволяет обработать до 2^64 записей. Однако на практике лимит может быть ниже из-за ограничений файловой системы.
- Управление журналом: Журналы транзакций имеют ограниченный размер и циклически перезаписываются. LSN позволяет определить, какие записи ещё нужны для восстановления, а какие можно удалить (например, после резервного копирования).
Критика и альтернативы
- Сложность реализации: Поддержка LSN требует точной синхронизации между буферным кэшем, журналом и диском.
- Производительность: Генерация и запись LSN могут создавать накладные расходы, особенно при высоких нагрузках.
- Альтернативы: В некоторых NoSQL-системах (например, Cassandra) используются другие механизмы упорядочивания (например, временные метки), но они менее надёжны для восстановления.
Источники
- PostgreSQL Documentation: Write-Ahead Log (WAL) and LSN.
- Microsoft SQL Server Documentation: Log Sequence Number (LSN) and Transaction Log Architecture.
- Oracle Database Concepts: System Change Number (SCN).
- Elmasri, R., Navathe, S. B. «Fundamentals of Database Systems» (7th ed.), Chapter 17: Recovery.
- Gray, J., Reuter, A. «Transaction Processing: Concepts and Techniques».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →