Справочник DBA: базы данных изнутри

Справочник читается по порядку: от байтов страницы до аудита чужой базы. Каждая статья — один механизм, опыт, который можно повторить в контейнере за 15 минут, и цитата из кода СУБД. Знаешь SQL до JOIN и GROUP BY — начинай с раздела 1; знаешь, что такое MVCC и WAL — с раздела 4.

  1. Раздел 1

    Что делает DBA и как база лежит на диске

    1. 1.1 Администратор баз данных: что делает DBA, пять зон ответственности и пять инцидентов ≈ 14 мин
    2. 1.2 Зачем СУБД, если есть файлы: потерянная запись, обрезанный файл и четыре буквы ACID ≈ 10 мин
    3. 1.3 Каталог PGDATA в PostgreSQL: где лежит таблица, сегменты по 1 ГБ и pg_control ≈ 10 мин
    4. 1.4 Страница 8 КБ в PostgreSQL: заголовок, указатели строк и ctid ≈ 8 мин
    5. 1.5 Строка в PostgreSQL: заголовок 23 байта, infomask и выравнивание столбцов ≈ 10 мин
    6. 1.6 TOAST в PostgreSQL: большие значения, сжатие lz4 и цена правки одного ключа в jsonb ≈ 11 мин
    7. 1.7 Та же строка в InnoDB, SQLite и ClickHouse: страница 16 КБ, ячейка b-tree и колонки в файлах ≈ 9 мин
  2. Раздел 2

    Транзакции и MVCC

    начать с этого раздела →
    1. 2.1 MVCC в PostgreSQL: версии строк, снимок и HeapTupleSatisfiesMVCC ≈ 9 мин
    2. 2.2 Wraparound XID в PostgreSQL: сравнение по кольцу, relfrozenxid и остановка за 3 млн ≈ 10 мин
    3. 2.3 pg_xact и хинт-биты: почему первый SELECT после загрузки пишет на диск ≈ 8 мин
    4. 2.4 Аномалии изоляции и SSI в PostgreSQL: write skew, SIReadLock и ошибка 40001 ≈ 8 мин
    5. 2.5 MVCC в InnoDB: undo, ReadView, history list length и gap-блокировки ≈ 8 мин
    6. 2.6 Где лежат старые версии строк: PostgreSQL, InnoDB, Oracle, SQL Server и WiredTiger ≈ 8 мин
    7. 2.7 Блокировки PostgreSQL изнутри: матрица режимов, очередь ожидания и ALTER TABLE ≈ 9 мин
    8. 2.8 Дедлоки: граф ожидания, deadlock_timeout и выбор жертвы в PostgreSQL и InnoDB ≈ 9 мин
  3. Раздел 3

    WAL, буферы и надёжность записи

    начать с этого раздела →
    1. 3.1 WAL в PostgreSQL: почему COMMIT ждёт fsync журнала, а не таблицы ≈ 12 мин
    2. 3.2 Torn page в PostgreSQL: full_page_writes, doublewrite InnoDB и контрольные суммы ≈ 9 мин
    3. 3.3 Checkpoint в PostgreSQL: почему он бьёт по диску и как растянуть запись на 90 % интервала ≈ 8 мин
    4. 3.4 shared_buffers и clock sweep: счётчик 0–5, кольцевые буферы и кэш ОС ≈ 9 мин
    5. 3.5 fsync в PostgreSQL: write() не значит «записано», PANIC при ошибке и AIO ≈ 9 мин
    6. 3.6 Восстановление после kill -9 в PostgreSQL: pg_control, redo и сколько это длится ≈ 10 мин
    7. 3.7 Redo InnoDB и бинлог MySQL: двухфазный коммит и sync_binlog ≈ 10 мин
    8. 3.8 SQLite: rollback journal и WAL, один писатель, файл -shm и PRAGMA synchronous ≈ 9 мин
  4. Раздел 4

    Индексы изнутри

    начать с этого раздела →
    1. 4.1 B-tree в PostgreSQL изнутри: high key, усечение ключей, дедупликация и skip scan ≈ 10 мин
    2. 4.2 Index Only Scan и карта видимости: почему индекс ходит в таблицу и как VACUUM это чинит ≈ 8 мин
    3. 4.3 HOT-обновления и fillfactor в PostgreSQL: UPDATE без правки индексов ≈ 9 мин
    4. 4.4 Кластерный индекс InnoDB: таблица и есть индекс, вторичные ключи хранят PK, UUID дробит страницы ≈ 8 мин
    5. 4.5 GIN, GiST, BRIN и hash: что хранит каждый индекс и когда он выигрывает, измерено на 2 млн строк ≈ 10 мин
    6. 4.6 LSM-дерево: memtable, SSTable и компакция на db_bench RocksDB, уровни Cassandra ≈ 6 мин
    7. 4.7 MergeTree в ClickHouse: разреженный первичный ключ, гранулы по 8192 строки, засечки и skip-индексы ≈ 11 мин
    8. 4.8 CREATE INDEX CONCURRENTLY в PostgreSQL: два прохода, три ожидания и INVALID-индекс ≈ 8 мин
  5. Раздел 5

    Планировщик и статистика

    начать с этого раздела →
    1. 5.1 Модель стоимости планировщика PostgreSQL: откуда берутся cost= и random_page_cost ≈ 8 мин
    2. 5.2 Статистика ANALYZE в PostgreSQL: выборка, MCV, гистограмма и n_distinct ≈ 8 мин
    3. 5.3 Расширенная статистика PostgreSQL: CREATE STATISTICS и ошибка оценки в 1 000 раз ≈ 7 мин
    4. 5.4 Nested Loop, Hash Join, Merge Join и Memoize в PostgreSQL: как исполняются и где спиллят ≈ 9 мин
    5. 5.5 Порядок соединений в PostgreSQL: GEQO, join_collapse_limit, CTE и pg_hint_plan ≈ 10 мин
    6. 5.6 work_mem и спилл сортировки: quicksort, external merge и лимит на узел плана ≈ 7 мин
    7. 5.7 Параллельные запросы PostgreSQL: Gather, воркеры и частичные агрегаты ≈ 8 мин
    8. 5.8 Регрессии планов в PostgreSQL: пять custom-планов, generic plan и plan_cache_mode ≈ 8 мин
  6. Раздел 6

    VACUUM, bloat и обслуживание

    начать с этого раздела →
    1. 6.1 VACUUM изнутри: фазы, TidStore, проходы по индексам и усечение хвоста таблицы ≈ 11 мин
    2. 6.2 Настройка autovacuum в PostgreSQL 18: порог, потолок, cost_limit и insert-only ≈ 8 мин
    3. 6.3 Bloat таблицы в PostgreSQL: измерить pgstattuple и убрать без простоя pg_repack ≈ 9 мин
    4. 6.4 Что мешает VACUUM в PostgreSQL: горизонт xmin и четыре его держателя ≈ 9 мин
    5. 6.5 Заморозка в PostgreSQL: aggressive VACUUM, eager freezing и аварийный autovacuum ≈ 10 мин
    6. 6.6 Обслуживание InnoDB: purge, усечение undo, OPTIMIZE TABLE и алгоритмы online DDL ≈ 8 мин
    7. 6.7 ClickHouse: слияния part'ов, «too many parts» и мутации — почему UPDATE переписывает столбец целиком ≈ 10 мин
  7. Раздел 7

    Проектирование схемы и данных

    начать с этого раздела →
    1. 7.1 Типы данных на весах: int и bigint, numeric и float8, varchar(n), timestamptz, uuid v4 и v7 ≈ 10 мин
    2. 7.2 Первичные ключи в PostgreSQL: дырки в sequence, исчерпание int4 и перевод на bigint без простоя ≈ 11 мин
    3. 7.3 Нормализация, JSONB или materialized view: миллион событий тремя способами, цена записи и чтения ≈ 11 мин
    4. 7.4 Ограничения как инструмент DBA: NOT VALID, EXCLUDE и внешний ключ без индекса ≈ 9 мин
    5. 7.5 Партиционирование в PostgreSQL: отсечение секций, время планирования и DETACH вместо DELETE ≈ 9 мин
    6. 7.6 Миграции схемы PostgreSQL без простоя: что ALTER перепишет, очередь блокировок и expand/contract ≈ 11 мин
    7. 7.7 Моделирование под ClickHouse, MongoDB и Cassandra: порядок ORDER BY, вложенный документ против $lookup, partition key ≈ 10 мин
    8. 7.8 Мультитенантность в PostgreSQL: tenant_id и RLS, схема или база на клиента, Citus и цена каждого ≈ 9 мин
  8. Раздел 8

    Репликация и высокая доступность

    начать с этого раздела →
    1. 8.1 Потоковая репликация PostgreSQL: четыре LSN лага, слот с WAL и конфликт запроса на реплике ≈ 9 мин
    2. 8.2 Синхронная репликация PostgreSQL: уровни synchronous_commit, FIRST и ANY, коммит при потере реплики ≈ 9 мин
    3. 8.3 Логическая репликация PostgreSQL: декодирование WAL, replica identity, DDL мимо репликации и конфликт на подписчике ≈ 9 мин
    4. 8.4 Failover в Patroni: ключ лидера с TTL в etcd, 24 секунды до нового primary и pg_rewind ≈ 9 мин
    5. 8.5 Репликация MySQL: GTID, лаг по времени события и полусинхронный ack с таймаутом ≈ 10 мин
    6. 8.6 Консенсус в базах: Raft на трёх узлах etcd — кворум, term, выборы лидера и запись без большинства ≈ 10 мин
    7. 8.7 Redis: репликация и backlog, Sentinel, Cluster на 16 384 слотах и окна потери записей ≈ 10 мин
    8. 8.8 MongoDB: oplog, потерянная запись w:1 при падении primary, выборы за 10 секунд и монотонный ключ шарда ≈ 8 мин
    9. 8.9 ClickHouse: репликация через Keeper — журнал get, дедупликация блоков, insert_quorum и Distributed ≈ 8 мин
  9. Раздел 9

    Бэкапы и восстановление

    начать с этого раздела →
    1. 9.1 Стратегия бэкапов PostgreSQL: RPO и RTO в числах, дамп против физической копии и archive_timeout ≈ 11 мин
    2. 9.2 pg_dump изнутри: общий снимок, параллельный дамп по таблицам и порядок pg_restore ≈ 9 мин
    3. 9.3 Базовый бэкап, архив WAL и восстановление на момент времени: backup_label, timeline 2 и pg_combinebackup ≈ 9 мин
    4. 9.4 pgBackRest и WAL-G: инкремент по файлам и по блокам, delta restore, async archive-push, verify и expire ≈ 10 мин
    5. 9.5 Бэкапы MySQL: mysqldump, XtraBackup с хвостом redo, prepare, инкремент по LSN и CLONE INSTANCE ≈ 10 мин
    6. 9.6 Бэкапы Redis, MongoDB, ClickHouse и SQLite: COW при BGSAVE, mongodump --oplog, инкремент BACKUP и backup API ≈ 11 мин
    7. 9.7 Учения восстановления и битые страницы: pg_amcheck, выгрузка по ctid и zero_damaged_pages ≈ 9 мин
  10. Раздел 10

    Мониторинг и диагностика

    начать с этого раздела →
    1. 10.1 Что мониторить в PostgreSQL: четыре сигнала, pg_stat_* по слоям и алерт на молчание экспортёра ≈ 10 мин
    2. 10.2 Wait events PostgreSQL: что ждёт сессия, профиль ожиданий через pg_wait_sampling и сравнение с MySQL ≈ 9 мин
    3. 10.3 pg_stat_statements: нормализация, queryid, разность снимков и ловушка среднего ≈ 9 мин
    4. 10.4 EXPLAIN продвинуто: actual rows × loops, буферы родителя и детей, WAL, SERIALIZE и цена TIMING ≈ 11 мин
    5. 10.5 Хост под PostgreSQL: page tables без huge pages, cgroup OOM, iostat при checkpoint и что не видно из контейнера ≈ 11 мин
    6. 10.6 Соединения PostgreSQL и PgBouncer: цена backend и что ломает режим transaction ≈ 10 мин
    7. 10.7 Метод разбора медленного запроса в PostgreSQL: семь шагов и что дал каждый, с 0,7 до 0,2 с ≈ 12 мин
    8. 10.8 Диагностика MySQL 8.4: digest в Performance Schema, sys, slow log, EXPLAIN ANALYZE и INNODB STATUS по разделам ≈ 10 мин
    9. 10.9 Диагностика ClickHouse, Redis и MongoDB: query_log, SLOWLOG и профилировщик на одном медленном запросе в каждой ≈ 8 мин
  11. Раздел 11

    Безопасность и соответствие

    начать с этого раздела →
    1. 11.1 Аутентификация PostgreSQL: правила pg_hba.conf, SCRAM-SHA-256 и проверка, кто как вошёл ≈ 9 мин
    2. 11.2 Роли и привилегии PostgreSQL: матрица ролей сервиса, DEFAULT PRIVILEGES, предопределённые роли и SECURITY DEFINER с закреплённым search_path ≈ 7 мин
    3. 11.3 Шифрование PostgreSQL: sslmode=verify-full, ротация сертификата, диск, pgcrypto и TDE ≈ 12 мин
    4. 11.4 Аудит PostgreSQL: pgaudit по сессиям и объектам, log_line_prefix, jsonlog и размер журнала в ГБ в сутки ≈ 11 мин
    5. 11.5 Параметры запроса глазами DBA: Parse и Bind, что видно в pg_stat_statements, statement_timeout и права как ограничитель ущерба ≈ 8 мин
    6. 11.6 Персональные данные в PostgreSQL: маскирование копии, сохранение связей и удаление ≈ 9 мин
    7. 11.7 Безопасные настройки Redis и MongoDB: protected mode, ACL, bind и авторизация с проверкой ≈ 8 мин
  12. Раздел 12

    Архитектуры популярных СУБД

    начать с этого раздела →
    1. 12.1 Архитектура PostgreSQL целиком: процессы, память backend, пять стадий запроса и точки расширения ≈ 9 мин
    2. 12.2 Архитектура MySQL: сервер и InnoDB через handler, ICP на границе слоёв, INNODB STATUS как карта, словарь без .frm и бинлог над движком ≈ 10 мин
    3. 12.3 Архитектура SQLite: байткод VDBE, состояния блокировки файла, STRICT и два писателя ≈ 10 мин
    4. 12.4 Архитектура ClickHouse: блоки столбцов, конвейер процессоров, двухуровневая агрегация и кодеки сжатия ≈ 9 мин
    5. 12.5 Архитектура Redis и Valkey: цикл событий ae, кодировки listpack и hashtable, потоки I/O и лицензии ≈ 8 мин
    6. 12.6 Архитектура MongoDB: BSON, кэш и вытеснение WiredTiger, checkpoint раз в 60 с, журнал 100 мс и выбор плана ≈ 11 мин
    7. 12.7 Oracle и SQL Server для DBA из PostgreSQL: соответствия, RCSI и эскалация на 6 250 блокировках ≈ 8 мин
    8. 12.8 Распределённые SQL: диапазоны и Raft в CockroachDB, транзакция на двух ranges, TiKV, YugabyteDB, Citus и когда хватит одного PostgreSQL ≈ 11 мин
  13. Раздел 13

    Инфраструктура и облако

    начать с этого раздела →
    1. 13.1 Managed PostgreSQL или свой сервер: что закрыто ролью, что в тарифе и как считать ≈ 7 мин
    2. 13.2 PostgreSQL в Kubernetes: оператор вместо StatefulSet, failover в два шага и fsync 892 мкс на томе против 0 на tmpfs ≈ 9 мин
    3. 13.3 Диски под PostgreSQL: IOPS не равны скорости коммита — fdatasync 889 мкс на NVMe и 73 мс под полкой 100 IOPS ≈ 9 мин
    4. 13.4 Планирование ёмкости PostgreSQL: таблица истории, тренд роста и WAL, модель диска на 12 месяцев ≈ 11 мин
    5. 13.5 Обновление PostgreSQL 16 → 18: pg_upgrade --link за 2,3 с на 840 МБ, потерянная расширенная статистика и окно 0,7 с на логической репликации ≈ 10 мин
    6. 13.6 Коллации в PostgreSQL: glibc 2.28 переставила строки, индекс стал неверным без ошибки, а ICU и C ведут себя иначе ≈ 10 мин
    7. 13.7 База как код: миграции Flyway, Liquibase и Sqitch, блокировка второго запуска, дрейф схемы и конфигурации, CI за 12,5 с ≈ 10 мин
  14. Раздел 14

    Консалтинг: аудит, оптимизация, миграции

    начать с этого раздела →
    1. 14.1 Аудит PostgreSQL за три дня: роль только на чтение, снимки SQL, отчёт с влиянием и трудоёмкостью ≈ 11 мин
    2. 14.2 Двадцать параметров PostgreSQL: карта по подсистемам и pgbench до и после — 432 против 14 204 TPS ≈ 12 мин
    3. 14.3 Нагрузочное тестирование PostgreSQL честно: pgbench, прогрев, перцентили и coordinated omission ≈ 10 мин
    4. 14.4 Кейс OLTP на базе 735 МБ: восемь находок по одной — p95 с 224 до 13 мс дали два индекса, остальные семь шагов хвост не улучшили ≈ 12 мин
    5. 14.5 Аналитика на PostgreSQL или перенос в ClickHouse: 20 млн событий, пять запросов, секции, BRIN и matview ≈ 11 мин
    6. 14.6 Миграция с Oracle на PostgreSQL: ora2pg оценил схему как A-3, а 4 функции из 4 дали другой ответ ≈ 9 мин
    7. 14.7 Выбор СУБД под задачу: PostgreSQL по умолчанию, пока измерение не докажет обратное ≈ 11 мин
    8. 14.8 Работа консультантом по базам: форматы, доступы и их отзыв, план изменений и runbook с проверенными командами ≈ 10 мин