linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-19-1-crash-recovery

lesson ── postgres-labs ── ~24 мин ── 5 шагов

Найди redo point и посмотри, что проиграло бы восстановление

Настоящий сбой в учебной песочнице не устроить, но всю машинерию восстановления можно потрогать на работающем сервере. Восстановление начинается с redo point - позиции журнала, записанной последней контрольной точкой. Сейчас ты найдёшь redo point, увидишь, как CHECKPOINT подтягивает его к текущей позиции, и через pg_walinspect посмотришь ровно те записи, которые crash recovery проиграл бы. Работай в основном во вкладке psql-a.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    psql-a: прочитай redo point

    sql
    SELECT redo_lsn, checkpoint_lsn FROM pg_control_checkpoint();

    redo_lsn - место в журнале, с которого crash recovery начал бы проигрывание. Всё до него уже надёжно в файлах данных.

    ✓ redo point найден — отсюда стартовало бы восстановление.

  2. 02

    psql-a: нагенерируй журнал после контрольной точки

    sql
    CREATE TABLE recov_demo (tag text);
    INSERT INTO recov_demo
      SELECT 'committed' FROM generate_series(1, 500);
    SELECT pg_current_wal_lsn() > (SELECT redo_lsn FROM pg_control_checkpoint())
      AS lsn_ahead_of_redo;

    Текущая позиция ушла вперёд от redo point. Промежуток между ними - и есть то, что восстановление пришлось бы доиграть.

    ✓ Между redo point и текущим LSN накопилась работа для redo.

  3. 03

    psql-a: контрольная точка подтягивает redo point

    sql
    CHECKPOINT;
    SELECT pg_current_wal_lsn() - redo_lsn AS gap_bytes
    FROM pg_control_checkpoint();

    Контрольная точка записала грязные буферы и сдвинула redo point к текущей позиции. Предскажи: промежуток gap_bytes станет большим или маленьким?

    подсказка

    После контрольной точки восстанавливать почти нечего — redo point близко к текущему LSN.

    ✓ redo point подтянулся к текущей позиции — восстановление стало бы коротким.

  4. 04

    psql-a: посмотри записи, которые проиграло бы восстановление

    sql
    UPDATE recov_demo SET tag = 'changed' WHERE ctid IN
      (SELECT ctid FROM recov_demo LIMIT 100);
    SELECT count(*) AS records_to_replay
    FROM pg_get_wal_records_info(
      (SELECT redo_lsn FROM pg_control_checkpoint()),
      pg_current_wal_lsn());

    Это ровно те журнальные записи, которые redo накатил бы от redo point до конца журнала, случись сбой прямо сейчас.

    ✓ Ты увидел содержимое будущего redo своими глазами.

  5. 05

    psql-a: открой незакоммиченную транзакцию

    Теперь покажем, почему redo не «оживляет» незакоммиченное. Во вкладке psql-a вставь строку, но не коммить:

    sql
    BEGIN;
    INSERT INTO recov_demo VALUES ('ghost');
    -- COMMIT не делаем!

    Redo при восстановлении накатил бы эту строку физически - но её транзакция не отмечена в clog как зафиксированная, поэтому по правилам видимости её не видно. Проверим из соседней сессии.

    ✓ Из psql-b «призрака» не видно — незакоммиченное фактически откачено.

Что ты узнал

Восстановление стартует с redo point из pg_control_checkpoint(). Контрольная точка подтягивает redo point к текущей позиции, сокращая будущее восстановление. pg_walinspect показывает записи, которые проиграл бы redo. Незакоммиченные транзакции невидимы через clog.

команды

  • SELECT redo_lsn FROM pg_control_checkpoint();позиция старта восстановления
  • SELECT count(*) FROM pg_get_wal_records_info(redo_lsn, pg_current_wal_lsn());что проиграл бы redo
  • CHECKPOINT;подтянуть redo point вперёд

концепции

  • · redo point — позиция, с которой crash recovery начинает проигрывание
  • · контрольная точка сокращает будущее восстановление, двигая redo point
  • · незакоммиченные изменения redo накатывает физически, но clog держит их невидимыми

← предыдущая

Понаблюдай за WAL и поймай всплеск FPI после CHECKPOINT

следующая →

Разбери журнал по записям через pg_walinspect

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки