53 lines
5.3 KiB
Markdown
53 lines
5.3 KiB
Markdown
---
|
||
aliases:
|
||
tags:
|
||
- maturity/🌱
|
||
date: 2024-05-26
|
||
zero-link:
|
||
- "[[../../meta/zero/00 Реляционная база данных]]"
|
||
parents:
|
||
linked:
|
||
---
|
||
Журнал базы данных — это структура, в которой фиксируются все изменения, происходящие в базе данных, до их окончательного применения. Основная цель журнала — обеспечить надежность и консистентность данных. Это позволяет выполнять [[Транзакция БД|транзакции]] и [[../architecture/highload/Репликация БД|репликацию БД]].
|
||
|
||
Перед выполнением SQL-запроса база данных сначала записывает в журнал информацию о планируемых действиях, например: "Обновить значение колонки `amount` в таблице `orders` для записи с `id = 5`". После фиксации записи в журнале база данных изменяет данные в памяти, чтобы ускорить обработку операций, а затем, с некоторой задержкой, записывает их на диск в основное хранилище. Этот подход улучшает производительность за счет уменьшения количества операций записи на диск, которые являются более медленными по сравнению с изменениями в памяти. В случае сбоя системы до записи данных на диск, изменения можно восстановить из журнала. Этот алгоритм называется [[../../../../_inbox/Point In Time Recovery (PITR)|PITR]] (Point In Time Recovery).
|
||
|
||
![](Pasted%20image%2020240528081137.png)
|
||
Этот процесс обеспечивает два важных аспекта:
|
||
- **Надежность**: В случае сбоя системы данные можно восстановить из журнала до последнего зафиксированного состояния.
|
||
- **Консистентность**: Все транзакции, записанные в журнал, будут применены в базе данных в правильном порядке, что предотвращает потерю данных и сохраняет целостность системы.
|
||
|
||
**Недостатки**:
|
||
- Увеличение времени записи: каждая транзакция требует предварительной записи в журнал, что может замедлить выполнение операций.
|
||
- Потребление дискового пространства: журналы могут занимать значительное место, особенно в системах с высокой активностью.
|
||
|
||
> [!INFO]
|
||
> Журналы базы данных часто имеют циклическую структуру, где новые данные записываются поверх старых, когда журнал заполняется. Это позволяет эффективно использовать дисковое пространство и упрощает управление журналом.
|
||
|
||
Реализации в СуБД:
|
||
- [[postgresql/Write-Ahead Log|Журнал в PostgreSQL]]
|
||
- [Журналы в MySQL](mysql/Журналы%20в%20MySQL.md)
|
||
|
||
Главные вопросы, которые встают перед разработчиком любой БД:
|
||
- Как организовать журнал?
|
||
- Как его писать?
|
||
- Как писать его меньше?
|
||
- Как сделать так, чтобы это работало быстрее?
|
||
- При чем тут репликация?
|
||
|
||
Для повышения производительности рекомендуется выделять отдельные жесткие диски под журналы, чтобы у них был эксклюзивный доступ к ресурсам диска. Это менее актуально для SSD, так как у них значительно выше скорость чтения и записи, а также отсутствует проблема механического доступа, что делает их более эффективными для параллельной работы с данными.
|
||
***
|
||
## Мета информация
|
||
**Область**:: [[../../meta/zero/00 Реляционная база данных|00 Реляционная база данных]]
|
||
**Родитель**::
|
||
**Источник**::
|
||
**Автор**::
|
||
**Создана**:: [[2024-05-26]]
|
||
### Дополнительные материалы
|
||
-
|
||
### Дочерние заметки
|
||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||
- [[Write-Ahead Log]]
|
||
<!-- SerializedQuery END -->
|