Size: a a a

pgsql – PostgreSQL

2020 June 11

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor
подскажите, очень долго идет dump с помощью pg_dump, в итоге на данном pid висит уже 156 блокировок в pg_locks, запрос в pg_stat_activity по данному pid
COPY public.messages (id, template_id, profile_id, local, subject, sender_email, sender_name, recipient_email, sender_ip, status, priority, client_tags, composed, swift_message_id, created_at, updated_at, app_id, oc, external_id) TO stdout;
Как найти причину данных блокировок?
Камнями не кидайте только учусь админить postgrtes
> Как найти причину данных блокировок?

Причина — почти наверняка какой-то DDL (pg_dump блокирует его полностью).
Найти можно с помощью pg_locks, pg_stat_activity и pg_blocking_pids() — погуглите готовый запрос на эту тему, их было море. ;)
И я бы Вам советовал не выполнять pg_dump параллельно с DDL — если при этом "не повезёт", можно получить не только блокировки, а и неконсистентный дамп, причём "тихо" (без ошибок).
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Сергей Голод
DELETE FROM table WHERE указать_условие_отбора_строк;
with foo as ( select id from test order by random() desc limit 3 ) delete from test where id in ( select id from foo );
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Harry Fox
Прошу прощения за глупые вопросы, а можно делать "дамп" базы очень выборочно, например:

Я хочу скопировать одну строку из таблицы, и всё что с этой строкой связано каскадом, все FK и остальные связи?
Нет, штатными средствами нельзя.
Вам нужно что-то вроде https://github.com/18F/rdbms-subsetter (ну и, опять-таки, погуглите что-то аналогичное).
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Роман Жарков
with foo as ( select id from test order by random() desc limit 3 ) delete from test where id in ( select id from foo );
вряд ли он поймёт)
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Сергей Голод
вряд ли он поймёт)
Главное, не копипастить тупо.
источник

V

Victor in pgsql – PostgreSQL
Yaroslav Schekin
> Как найти причину данных блокировок?

Причина — почти наверняка какой-то DDL (pg_dump блокирует его полностью).
Найти можно с помощью pg_locks, pg_stat_activity и pg_blocking_pids() — погуглите готовый запрос на эту тему, их было море. ;)
И я бы Вам советовал не выполнять pg_dump параллельно с DDL — если при этом "не повезёт", можно получить не только блокировки, а и неконсистентный дамп, причём "тихо" (без ошибок).
SELECT pg_blocking_pids(pid_dump);
и получаю пустую выборку {} :(
источник

V

Victooor in pgsql – PostgreSQL
Yaroslav Schekin
Сходу ничего не приходит в голову... а зачем / какая разница?
Разницы в целом нет, просто придётся писать голый скл, а если без обёртки то квери билдером фреймворка можно типа сделать. Ну я так, больше уточнил для себя, может есть способ
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor
SELECT pg_blocking_pids(pid_dump);
и получаю пустую выборку {} :(
Значит, pg_dump ничем не заблокирован (так и должно быть, т.к. это он блокирует всё перед дампом).
Это он блокирует какие-то сессии.
источник

V

Victor in pgsql – PostgreSQL
Yaroslav Schekin
Значит, pg_dump ничем не заблокирован (так и должно быть, т.к. это он блокирует всё перед дампом).
Это он блокирует какие-то сессии.
так сессии именно дампа висят в таблице блоикровок
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor
так сессии именно дампа висят в таблице блоикровок
Покажите. И почему сессии (это с -j)? Если да, Вы каждую проверили pg_blocking_pids()?
источник

V

Victor in pgsql – PostgreSQL
Yaroslav Schekin
Покажите. И почему сессии (это с -j)? Если да, Вы каждую проверили pg_blocking_pids()?
вы правы, я ошибся, сессия. Она одна. ее и проверил.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor
вы правы, я ошибся, сессия. Она одна. ее и проверил.
pg_blocking_pids не врёт. Т.е. покажите pg_locks.
источник

V

Victor in pgsql – PostgreSQL
Yaroslav Schekin
pg_blocking_pids не врёт. Т.е. покажите pg_locks.
SELECT locktype, relation::REGCLASS, virtualxid AS virtxid, transactionid AS xid, mode, granted, pg_blocking_pids(l.pid), l.pid  FROM pg_locks l
LEFT JOIN pg_stat_activity psa
   ON l.pid = psa.pid
WHERE  not  l.pid = pg_backend_pid()
order by l.pid;
источник

𝕿𝕷

𝕿𝖍𝖔𝖒𝖆𝖘 𝕰𝖉𝖜𝖆𝖗𝖉 𝕷𝖆𝖜𝖗𝖊𝖓... in pgsql – PostgreSQL
Victor
SELECT locktype, relation::REGCLASS, virtualxid AS virtxid, transactionid AS xid, mode, granted, pg_blocking_pids(l.pid), l.pid  FROM pg_locks l
LEFT JOIN pg_stat_activity psa
   ON l.pid = psa.pid
WHERE  not  l.pid = pg_backend_pid()
order by l.pid;
Отличная проверка на спам )))
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor
SELECT locktype, relation::REGCLASS, virtualxid AS virtxid, transactionid AS xid, mode, granted, pg_blocking_pids(l.pid), l.pid  FROM pg_locks l
LEFT JOIN pg_stat_activity psa
   ON l.pid = psa.pid
WHERE  not  l.pid = pg_backend_pid()
order by l.pid;
Ни одной блокировки тут (на screenshot) нет (granted = true).
источник

AJ

Arm Jedi in pgsql – PostgreSQL
пробую такой запрос:
COPY (SELECT (1) ) TO  PROGRAM   '/bin/bash /home/postgresql/test_log.sh test_arg';
Это запуск скрипта который просто в файл запишет принятые агрументы и что-то в файле ничего не записывается
источник

HF

Harry Fox in pgsql – PostgreSQL
Yaroslav Schekin
Нет, штатными средствами нельзя.
Вам нужно что-то вроде https://github.com/18F/rdbms-subsetter (ну и, опять-таки, погуглите что-то аналогичное).
Большое спасибо!
источник

V

Victor in pgsql – PostgreSQL
Yaroslav Schekin
Ни одной блокировки тут (на screenshot) нет (granted = true).
так true это значит блокировка получена ? судя по доке
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor
так true это значит блокировка получена ? судя по доке
Да. Т.е. на них смотреть не нужно.
Вам нужны WHERE NOT granted.
источник

V

Victor in pgsql – PostgreSQL
и смотреть надо только где ожидают false?
источник