Бекапы PostresSQL 15 без блокировок работы
От: wraithik Россия  
Дата: 24.10.24 15:34
Оценка:
Подскажите, есть способ делать бекапы баз остановки работы пользовтелей.
pd_dump падает на блокировках.
Нужен способ копировать базу данных в середине рабочего дня.
Re: Бекапы PostresSQL 15 без блокировок работы
От: BlackEric http://black-eric.lj.ru
Дата: 28.10.24 07:52
Оценка: +1
Здравствуйте, wraithik, Вы писали:

W>Подскажите, есть способ делать бекапы баз остановки работы пользовтелей.

W>pd_dump падает на блокировках.
W>Нужен способ копировать базу данных в середине рабочего дня.

С какими параметрами запускаете pg_dump и какая точно ошибка?
У pg_dump есть параметр --lock-wait-timeout=timeout. Пробовали его выставлять?
https://github.com/BlackEric001
Re[2]: Бекапы PostresSQL 15 без блокировок работы
От: wraithik Россия  
Дата: 28.10.24 09:11
Оценка:
Здравствуйте, BlackEric, Вы писали:

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


W>>Подскажите, есть способ делать бекапы баз остановки работы пользовтелей.

W>>pd_dump падает на блокировках.
W>>Нужен способ копировать базу данных в середине рабочего дня.

BE>С какими параметрами запускаете pg_dump и какая точно ошибка?

BE>У pg_dump есть параметр --lock-wait-timeout=timeout. Пробовали его выставлять?

По факту криво смотрел. Падало по памяти. Все поправил.
Re: Бекапы PostresSQL 15 без блокировок работы
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 28.10.24 10:03
Оценка: 6 (1) +1 -1
Здравствуйте, wraithik, Вы писали:

W>Подскажите, есть способ делать бекапы баз остановки работы пользовтелей.

А как ты это представляешь.

Вот ты начинаешь копировать данные в момент Х, а за это время пользователи вносят изменения в объеме dX.
Должен ли этот dX попасть в бекап?
1) если нет, и вам нужна консистентность на момент X, то придется заблокировать всех (делает pg_dump)
2) если да, то надо записать состояние X, заблокировав dX, а потом дозаписать dX, блокируя изменения в (X/dX). (так делает pg_basebackup)


W>pd_dump падает на блокировках.

С какой ошибкой то?

W>Нужен способ копировать базу данных в середине рабочего дня.

Репликация же и\или pg_basebackup

насколько я понимаю вы, как и большинство, пришли в постгрес с MSSQL. К сожалению, области администрирования он работает категорически не так, как MSSQL. Все ваши привычки и ментальные модели скорее всего ошибочны.

1) В MSSQL единица администрирования — база данных. Есть даже self-contained базы, которые содержат все настройки, в том числе безопасности. В Postgres — единица администрирования — сервер. Все настройки безопасности, отказоустойчивости, быстродействия выполняются на уровне сервера в PG.
2) WAL в MS SQL свой для каждой базы, в PG один для сервера. Поэтому и бекап удобный и полноценный в PG есть только на уровне сервера (pg_basebackup)
3) Контролей целостности данных в PG примерно на порядок меньше, чем в MS SQL, поэтому для каждого продуктивного сервера PG нужна реплика. Иначе вы рано иди поздно данные потеряете.

Итого: в проде PG у вас будет мастер и реплика. Если вы снимаете pg_dump с реплики, то реплкика временно останавливает накатку логов, но мастер при этом не блокируется.
Re: Бекапы PostresSQL 15 без блокировок работы
От: velkin Удмуртия https://kisa.biz
Дата: 28.10.24 10:40
Оценка: +1
Здравствуйте, wraithik, Вы писали:

W>Подскажите, есть способ делать бекапы баз остановки работы пользователей.


Я бы на твоём месте поискал по ключевым словам: зеркалирование, репликация, кластеризация, постгрес.

Причём я не изучал постгрес и точно не скажу, но там от версии к версии могут быть разные подходы и инструменты.
Re[2]: Бекапы PostresSQL 15 без блокировок работы
От: Gt_  
Дата: 28.10.24 10:50
Оценка:
G>Вот ты начинаешь копировать данные в момент Х, а за это время пользователи вносят изменения в объеме dX.
G>Должен ли этот dX попасть в бекап?
G>1) если нет, и вам нужна консистентность на момент X, то придется заблокировать всех (делает pg_dump)


да ладно. быть не может что бы так проигрывал конкурентам. PG классический версионник, в чем там может быть сложность вычитать таблицу на момент X без блокировок ? в доке тоже говориться что без локов обходиться:
pg_dump is a utility for backing up a PostgreSQL database. It makes consistent backups even if the database is being used concurrently. pg_dump does not block other users accessing the database (readers or writers).
https://www.postgresql.org/docs/current/app-pgdump.html
Re[2]: Бекапы PostresSQL 15 без блокировок работы
От: wraithik Россия  
Дата: 28.10.24 12:21
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


W>>Подскажите, есть способ делать бекапы баз остановки работы пользовтелей.

G>А как ты это представляешь.

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

G>Должен ли этот dX попасть в бекап?
G>1) если нет, и вам нужна консистентность на момент X, то придется заблокировать всех (делает pg_dump)
G>2) если да, то надо записать состояние X, заблокировав dX, а потом дозаписать dX, блокируя изменения в (X/dX). (так делает pg_basebackup)

Данные на момент запуска pg_dump, все что изменилось в процессе выгрузки — не должно попасть в выгрузку.


W>>pd_dump падает на блокировках.

G>С какой ошибкой то?

Оказалось вообще не блокировка, но будем наблюдать.

W>>Нужен способ копировать базу данных в середине рабочего дня.

G>Репликация же и\или pg_basebackup

G>насколько я понимаю вы, как и большинство, пришли в постгрес с MSSQL. К сожалению, области администрирования он работает категорически не так, как MSSQL. Все ваши привычки и ментальные модели скорее всего ошибочны.


Да, верно, в MS SQL это было очень просто.

G>1) В MSSQL единица администрирования — база данных. Есть даже self-contained базы, которые содержат все настройки, в том числе безопасности. В Postgres — единица администрирования — сервер. Все настройки безопасности, отказоустойчивости, быстродействия выполняются на уровне сервера в PG.

G>2) WAL в MS SQL свой для каждой базы, в PG один для сервера. Поэтому и бекап удобный и полноценный в PG есть только на уровне сервера (pg_basebackup)
G>3) Контролей целостности данных в PG примерно на порядок меньше, чем в MS SQL, поэтому для каждого продуктивного сервера PG нужна реплика. Иначе вы рано иди поздно данные потеряете.

G>Итого: в проде PG у вас будет мастер и реплика. Если вы снимаете pg_dump с реплики, то реплкика временно останавливает накатку логов, но мастер при этом не блокируется.


Спасибо, попробую.
pg_basebackup — весь сервер дампит, фактически создавая его копию, типа как в MS SQL дамп базы данных?
Re[3]: Бекапы PostresSQL 15 без блокировок работы
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 28.10.24 13:45
Оценка: -1
Здравствуйте, Gt_, Вы писали:


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

G>>Должен ли этот dX попасть в бекап?
G>>1) если нет, и вам нужна консистентность на момент X, то придется заблокировать всех (делает pg_dump)


Gt_>да ладно. быть не может что бы так проигрывал конкурентам. PG классический версионник, в чем там может быть сложность вычитать таблицу на момент X без блокировок ?

Да вычитать то не проблема. Проблема в том, что за время бекапа таблица не должна поменяться. А то ты скопировал первые 1000 строк, другой пользователь сфорировал из них частичные суммы дописал в конец, а пока копировал вторую тысячу первую тысячу удалил.

Gt_>в доке тоже говориться что без локов обходиться:

Gt_>pg_dump is a utility for backing up a PostgreSQL database. It makes consistent backups even if the database is being used concurrently. pg_dump does not block other users accessing the database (readers or writers).
Gt_>https://www.postgresql.org/docs/current/app-pgdump.html

Внезапно написанное не означает что без локов. Написанное означает что ты можешь выполнить запрос на чтение или запись и он выполнится. Не уточняя что иногда может выполнится после окончания бекапа.
pg_dump такто навешивает локи на таблицы во время бекапа, а некоторых режимах просто падает если таблица поменяется за время бекапа.
Re[3]: Бекапы PostresSQL 15 без блокировок работы
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 28.10.24 13:50
Оценка:
Здравствуйте, wraithik, Вы писали:

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


G>>1) В MSSQL единица администрирования — база данных. Есть даже self-contained базы, которые содержат все настройки, в том числе безопасности. В Postgres — единица администрирования — сервер. Все настройки безопасности, отказоустойчивости, быстродействия выполняются на уровне сервера в PG.

G>>2) WAL в MS SQL свой для каждой базы, в PG один для сервера. Поэтому и бекап удобный и полноценный в PG есть только на уровне сервера (pg_basebackup)
G>>3) Контролей целостности данных в PG примерно на порядок меньше, чем в MS SQL, поэтому для каждого продуктивного сервера PG нужна реплика. Иначе вы рано иди поздно данные потеряете.

W>pg_basebackup — весь сервер дампит, фактически создавая его копию, типа как в MS SQL дамп базы данных?

Да, см п1
pg_basebackup делает просто копию всех файлов и одновемеенно тянет wal, получается копия консистентная на момент конца бекапа. Но всего сервера, так как wal общий.
pg_dump делает копию консистентную на момент начала бекапа, нужен в основном для переноса базы и\или апгрейда.

Практика показывает что для обной базы (одного набора баз, если микросервисы) лучше иметь отдельный инстанс постгри. При этом очень легко поднять несколько инстансов на одном сервере и настройками разрулить, чтобы они не падали по OOM
Re[4]: Бекапы PostresSQL 15 без блокировок работы
От: Gt_  
Дата: 28.10.24 14:49
Оценка:
Gt_>>да ладно. быть не может что бы так проигрывал конкурентам. PG классический версионник, в чем там может быть сложность вычитать таблицу на момент X без блокировок ?
G>Да вычитать то не проблема. Проблема в том, что за время бекапа таблица не должна поменяться. А то ты скопировал первые 1000 строк, другой пользователь сфорировал из них частичные суммы дописал в конец, а пока копировал вторую тысячу первую тысячу удалил.

выглядит что вы даже в общих чертах не представляете как работают версионные субд и постгре в частности.

вот тут говорится, что там обычная транзакция

pg_dump runs in a transaction-snapshot mode transaction

https://github.com/postgres/postgres/blob/master/src/bin/pg_dump/pg_dump.c
Отредактировано 28.10.2024 14:49 Gt_ . Предыдущая версия .
Re[5]: Бекапы PostresSQL 15 без блокировок работы
От: VladiCh  
Дата: 01.11.24 20:54
Оценка:
Здравствуйте, Gt_, Вы писали:


Gt_>>>да ладно. быть не может что бы так проигрывал конкурентам. PG классический версионник, в чем там может быть сложность вычитать таблицу на момент X без блокировок ?

G>>Да вычитать то не проблема. Проблема в том, что за время бекапа таблица не должна поменяться. А то ты скопировал первые 1000 строк, другой пользователь сфорировал из них частичные суммы дописал в конец, а пока копировал вторую тысячу первую тысячу удалил.

Gt_>выглядит что вы даже в общих чертах не представляете как работают версионные субд и постгре в частности.


Gt_>вот тут говорится, что там обычная транзакция


Gt_> pg_dump runs in a transaction-snapshot mode transaction


Gt_>https://github.com/postgres/postgres/blob/master/src/bin/pg_dump/pg_dump.c


более того, в постгресе можно шарить один и тот же снапшот между разными соединениями и бэкапить из многих потоков / процессов параллельно.
pg_dump так тоже умеет делать насколько я помню
Re[2]: Бекапы PostresSQL 15 без блокировок работы
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.11.24 01:21
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

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

G>Должен ли этот dX попасть в бекап?
G>1) если нет, и вам нужна консистентность на момент X, то придется заблокировать всех (делает pg_dump)
G>2) если да, то надо записать состояние X, заблокировав dX, а потом дозаписать dX, блокируя изменения в (X/dX). (так делает pg_basebackup)
Эмм,
1. в момент старта бэкапа
-- Выполнить checkpoint
-- Записать в WAL метку "начало бэкапа"
2. В момент окончания бэкапа записать в WAL метку "конец бэкапа"
3. Добавить к бэкапу фрагмент лога между метками "начало бэкапа" и "конец бэкапа".
Ни в какой момент ничего не блокируется
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
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 — бэкапить в несколько потоков
никакой фрагмент лога никуда не добавляется, если кто-то что-то закоммитил за время бэкапа — в бэкап не попадает
Re[4]: Бекапы PostresSQL 15 без блокировок работы
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.11.24 08:03
Оценка:
Здравствуйте, VladiCh, Вы писали:
VC>это все здорово но pg_dump так не делает
VC>он элементарно стартует read-only repeatable read транзакцию
VC>после этого все чтение внутри этой транзакции читается из снапшота созданного на момент ее старта, новые изменения ей не видны
VC>этот снапшот можно использовать из других соединений тоже если передать его id — бэкапить в несколько потоков
VC>никакой фрагмент лога никуда не добавляется, если кто-то что-то закоммитил за время бэкапа — в бэкап не попадает
Но этот способ, как мы знаем из ТС, падает на блокировках.
Я всего лишь объяснял, как сделать бэкап, не падая на блокировках, и не жертвуя консистентостью бэкапа. Способ вполне себе дедовский. Описан, например, в Гарсиа-Молина раздел 17.5.2, стр. 872.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Бекапы PostresSQL 15 без блокировок работы
От: Gt_  
Дата: 18.11.24 08:34
Оценка: 80 (1)
S>Но этот способ, как мы знаем из ТС, падает на блокировках.

вам же объяснили, что нет там блокировок. ТС еще в октябре отписался — падало по памяти на самом деле.
https://rsdn.org/forum/db/8841632.1
Автор: wraithik
Дата: 28.10 12:11
Отредактировано 18.11.2024 8:35 Gt_ . Предыдущая версия .
Re[5]: Бекапы PostresSQL 15 без блокировок работы
От: VladiCh  
Дата: 25.11.24 01:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

VC>>это все здорово но pg_dump так не делает
VC>>он элементарно стартует read-only repeatable read транзакцию
VC>>после этого все чтение внутри этой транзакции читается из снапшота созданного на момент ее старта, новые изменения ей не видны
VC>>этот снапшот можно использовать из других соединений тоже если передать его id — бэкапить в несколько потоков
VC>>никакой фрагмент лога никуда не добавляется, если кто-то что-то закоммитил за время бэкапа — в бэкап не попадает
S>Но этот способ, как мы знаем из ТС, падает на блокировках.
S>Я всего лишь объяснял, как сделать бэкап, не падая на блокировках, и не жертвуя консистентостью бэкапа. Способ вполне себе дедовский. Описан, например, в Гарсиа-Молина раздел 17.5.2, стр. 872.

ничего там не падает на блокировках, ваш ТС чего-то напутал
Re: Бекапы PostresSQL 15 без блокировок работы
От: BlackEric http://black-eric.lj.ru
Дата: 11.12.24 16:55
Оценка:
Здравствуйте, wraithik, Вы писали:

W>Подскажите, есть способ делать бекапы баз остановки работы пользовтелей.

W>pd_dump падает на блокировках.
W>Нужен способ копировать базу данных в середине рабочего дня.

pg_probackup — управление резервным копированием и восстановлением кластеров баз данных Postgres Pro. Есть еще такая штука, сам не пробовал правда.
https://github.com/BlackEric001
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.