Re[3]: Бекапы PostresSQL 15 без блокировок работы
От: VladiCh  
Дата: 18.11.24 06:50
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:


G>>Вот ты начинаешь копировать данные в момент Х, а за это время пользователи вносят изменения в объеме dX.

G>>Должен ли этот dX попасть в бекап?
G>>1) если нет, и вам нужна консистентность на момент X, то придется заблокировать всех (делает pg_dump)
G>>2) если да, то надо записать состояние X, заблокировав dX, а потом дозаписать dX, блокируя изменения в (X/dX). (так делает pg_basebackup)
S>Эмм,
S>1. в момент старта бэкапа
S>-- Выполнить checkpoint
S>-- Записать в WAL метку "начало бэкапа"
S>2. В момент окончания бэкапа записать в WAL метку "конец бэкапа"
S>3. Добавить к бэкапу фрагмент лога между метками "начало бэкапа" и "конец бэкапа".
S>Ни в какой момент ничего не блокируется

это все здорово но pg_dump так не делает
он элементарно стартует read-only repeatable read транзакцию
после этого все чтение внутри этой транзакции читается из снапшота созданного на момент ее старта, новые изменения ей не видны
этот снапшот можно использовать из других соединений тоже если передать его id — бэкапить в несколько потоков
никакой фрагмент лога никуда не добавляется, если кто-то что-то закоммитил за время бэкапа — в бэкап не попадает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.