172 похожих чатов

Я понимаю, что я опоздал на дискуссию про pg_dump, но

я всё же закину вопрос.

В процессе вашей дискуссии возникло ощущение, что pg_dump/pg_restore может не восстановить состояние БД.
Есть такой пример? (видел про не консистентное восстановление из-за не ACID DDL, но вопрос в том, может ли не восстановиться в принципе dump)

А ещё не напомните, какие объекты не восстанавливет pg_dump/pg_restore? Вроде бы пользователей, права доступа. Может быть что-то ещё?

17 ответов

26 просмотров

Ну так именно этот дамп и не восстанавливается (возникает ошибка и теряются данные). Или определите, что такое "не восстановиться в принципе"? А то так можно считать, что если хотя бы одна команда из дампа выполнилась, то он "в принципе восстановился". ;)

Aleksey-Stavrov Автор вопроса
Yaroslav Schekin
Ну так именно этот дамп и не восстанавливается (во...

> Или определите, что такое "не восстановиться в принципе"? К примеру, в процессе восстановления возникает ошибка, т.е. восстановление прерывается.

Aleksey Stavrov
> Или определите, что такое "не восстановиться в п...

Ээээ... по умолчанию psql / pg_restore игнорируют почти любые ошибки и продолжают до конца дампа, Вы не забыли?

Aleksey Stavrov
Мб, не знал.

Тем не менее, это так. Поэтому, как мне кажется, невосстанавливаемый дамп — это когда случаются такие ошибки, и хотя бы часть данных не загружается.

Щас поясню. Всё там работает. Речь идёт про то, что не надо делать дамп в момент перезаписи таблицы. Точнее, наоборот: если вы используете уровни изоляции repeatable read и выше и при этом увлекаетесь ALTER TABLE, есть шанс нарваться на неприятности. Например, «видеть» пустую таблицу там, где она полная. pg_dump работает именно на уровне repeatable read. А юзеров дампит pg_dumpall. Пользуйтесь любыми постгресовыми инструментами на здоровье, но аккуратно! «Некоторые команды DDL, в настоящее время это TRUNCATE и формы ALTER TABLE, перезаписывающие таблицу, не являются безопасными с точки зрения MVCC. Это значит, что после фиксации усечения или перезаписи таблица окажется пустой для всех параллельных транзакций, если они работают со снимком, полученным перед фиксацией такой команды DDL.» https://postgrespro.ru/docs/postgresql/15/mvcc-caveats

Роман Жарков
Щас поясню. Всё там работает. Речь идёт про то, чт...

Для тех кому интересно: Чуть более короткое воспроизведение: drop table if exists t; create table t (a int); insert into t values (1),(2),(3); begin; lock table t; =============== s2 begin isolation level repeatable read; select * from t; ================ s1 alter table t alter column a type bigint; commit; ================ s2 Не коммитим и пырим в «пустую» таблицу.

Aleksey-Stavrov Автор вопроса
Роман Жарков
Щас поясню. Всё там работает. Речь идёт про то, чт...

Про не транзакционность DDL я поянл. Думал есть пример, когда дамп может совсем не восстановиться. Ребята говорят, что ошибка проглатываются (а это значит, что не под транзакцией восстановление идёт, видимо).

Aleksey Stavrov
Про не транзакционность DDL я поянл. Думал есть пр...

Оно транзакционное. Но вот с этим ограничением.

Aleksey Stavrov
Про не транзакционность DDL я поянл. Думал есть пр...

Там, в примере, данные из таблицы вообще не сдампились.

Aleksey-Stavrov Автор вопроса
Роман Жарков
Оно транзакционное. Но вот с этим ограничением.

Ага, но вот как раз пример показывает, что не транзакционное DDL.

Роман Жарков
Щас поясню. Всё там работает. Речь идёт про то, чт...

> Всё там работает. Ага, аж шум стоит. Про все остальные продемонстрированные случаи Вы уже забыли, я так понимаю? ;) > Речь идёт про то, что не надо делать дамп в момент перезаписи таблицы. И если у Вас есть большие bytea, или "кривые" CHECK constraints, или криво написанные функции в них, или индексы на основании таких функций, или пользователь подложил Вам "удачный" mat.view (это вряд ли можно сделать не злонамеренно, правда), и т.д. и т.п. > Пользуйтесь любыми постгресовыми инструментами на здоровье, но аккуратно! Да-да, когда дампишь — главное не дышать. ;) Ладно, в любом случае, его непригодность в качестве средства для DR определяется не этим...

Aleksey Stavrov
Про не транзакционность DDL я поянл. Думал есть пр...

По умолчанию — без каких-либо транзакций, ошибки игнорируются (см. документацию). > Думал есть пример, когда дамп может совсем не восстановиться. Так что да, чтобы "совсем", нужно, чтобы проблема была в самом первом объекте, разве что — иначе какие-то "осколки" он в базу загрузит.

Yaroslav Schekin
> Всё там работает. Ага, аж шум стоит. Про все ос...

Вы можете дышать во время pg_dump. Можете не дышать. Можете не дышать и не дампить. Можете дышать и не дампить. Я ничего не имею против!

Aleksey Stavrov
Ага, но вот как раз пример показывает, что не тран...

Не показывает. Не путайте ACID и транзакционность.

Aleksey-Stavrov Автор вопроса
Aleksey Stavrov
ACID - это свойства транзакции, не?

Ага. Но транзакции на уровне RC или RU — всё равно транзакции.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта