Как БД сохраняет данные?csharp-136

Основные принципы персистентности данных

БД используют комбинацию нескольких технологий для надежного сохранения данных:

  1. Журналирование (WAL - Write Ahead Log)

    • Все изменения сначала записываются в лог
    • Позволяет восстановить данные после сбоя
    -- Пример WAL записи (логический формат)
    BEGIN TRANSACTION;
    UPDATE accounts SET balance = 500 WHERE id = 1;
    COMMIT;
    
  2. Страничная организация данных

    • Данные хранятся в страницах фиксированного размера (обычно 4-16KB)
    • Каждая страница содержит:
      • Заголовок (метаданные, контрольные суммы)
      • Массив указателей на строки
      • Собственно данные

Физическое хранение на диске

  1. Файловая структура:

    • Табличные пространства (tablespaces)
    • Файлы данных (.mdf/.ndf в SQL Server, .ibd в MySQL)
    • Файлы журналов (.ldf в SQL Server, binlog в MySQL)
  2. Методы записи:

    • Прямая запись (O_DIRECT) - минуя кэш ОС
    • Буферизированная запись - через кэш файловой системы

Транзакционный механизм

ACID-гарантии обеспечиваются через:

  1. Журнал транзакций:

    // Псевдокод процесса записи
    void SaveTransaction(Transaction t) {
        WriteToWAL(t); // Сначала в журнал
        FlushWAL();    // Сброс на диск
        ApplyToPages(t); // Затем в основные данные
    }
    
  2. Контрольные точки (Checkpoints):

    • Периодическая синхронизация памяти и диска
    • Уменьшают время восстановления после сбоя

Алгоритмы управления буфером

  1. LRU (Least Recently Used) - вытеснение редко используемых страниц
  2. DoubleWrite Buffer (в InnoDB) - защита от частичных записей страниц

Особенности разных СУБД

СУБД Метод хранения Особенности
SQL Server Страничная организация (8KB pages) B-деревья + heap-структуры
PostgreSQL MVCC + TOAST (для больших полей) Write-ahead logging по умолчанию
MySQL InnoDB (кластерные индексы) Doublewrite buffer
Oracle ASM (Automatic Storage Management) Табличные пространства

Оптимизации записи

  1. Групповая запись - объединение нескольких операций в один блок
  2. Отложенная запись (lazy write) - не сразу на диск
  3. Инкрементальные бэкапы - сохранение только изменений

Восстановление после сбоя

Процесс восстановления использует:

  1. Redo-логи - повторение подтвержденных транзакций
  2. Undo-логи - откат незавершенных транзакций
-- Пример процесса восстановления (PostgreSQL)
STARTUP PROCESS:
  1. ANALYZE WAL FILES
  2. APPLY REDO (COMMITTED TX)
  3. ROLLBACK UNCOMMITTED TX
  4. BRING DB TO CONSISTENT STATE

Резюмируем:

современные БД сохраняют данные через комбинацию журналирования, страничной организации и транзакционных механизмов, обеспечивая надежность и производительность. Каждая СУБД реализует эти принципы по-своему, но все они следуют общим концепциям устойчивости к сбоям и согласованности данных.