Size: a a a

pgsql – PostgreSQL

2020 May 19

VY

Victor Yegorov in pgsql – PostgreSQL
Slvr
спасите помогите 🙂

Использую короткоживущие пользовательские сессии (облако), т.е. пользователи создаются с рандомными доступами на короткий срок, приводятся в нужный вид серией команд и отдаются приложению.

Пользователь создается так:

CREATE USER "{{name}}" WITH PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';
GRANT project_rw TO "{{name}}";
ALTER ROLE "{{name}}" SET role project_rw;
ALTER ROLE "{{name}}" SET search_path TO django, public;


Сделал SET role project_rw чтобы объекты создаваемые пользователем (к примеру из автоматических миграций базы) принадлежали роли, а не текущему юзеру, иначе их потом никто не сможет поправить в другой миграции другим пользователем.  Но этого не происходит 🙁 созданные таблицы привязались к юзернейму. Что я делаю не так?
владелец таблицы — пользователь, а не его роль в сессии. такая схема не будет работать.
если вы хотите, чтобы у таблиц (и прочих объектов) был один владелец, надо:
- создавать таблицы этим пользователем
- явно менять владельца после создания другими пользователями
Может быть возможно прикрыть это event триггером, не смотрел. Или таской в кроне…
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Konstantin Knizhnik
В принципе способна, для одностайтментовых транзакций. Другое дело - есть ли в этом большой смысл... И еасколько хорошо  по разному вести себя на "простых "и "сложных" транзакциях.
UPDATE something SET current_time = '09:45'

Повторите автоматически. Так, "в принципе". ;)
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Yaroslav Schekin
UPDATE something SET current_time = '09:45'

Повторите автоматически. Так, "в принципе". ;)
А что с этим не так?
источник

SM

Setplus Mac in pgsql – PostgreSQL
Не хочу прерывать оживлённую дискуссию, поэтому просто попрошу, как появится время, взглянуть на сообщение, которое я оставил выше. Заранее спасибо!)
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Setplus Mac
Здравствуйте! Подскажите, пожалуйста, как грамотно решить проблему планирования осуществления некоторых действий для нескольких БД в одном кластере? Просто pg_cron может работать только для одной БД, к сожалению.
обычным кроном пользуемся. правда, нужен доступ на сервр, не обязательно с базой
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Stavrov
А что с этим не так?
Т.е. когда она выполнится (после десятка повторов, к примеру) в 9:57 — это нормально? ;)
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Yaroslav Schekin
Т.е. когда она выполнится (после десятка повторов, к примеру) в 9:57 — это нормально? ;)
Не знаю, вы напишите, что конкретно вы хотите в этом поле сохранить. А то я вижу либо строку, либо время и не понятно какую логику она реализует.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Роман Жарков
Чего только выше нет! А эта декларация проверяется калькулятором  или даже листочком с ручкой. Надо только примерно прикинуть при каком значении deadlock_timeout и примерной вероятности дедлока бекенды перестанут успевать обслуживать клиентов.
А "не декларация" (то, что такие повторы — часть нормальной работы) "проверяется" чтением учебников. :)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Stavrov
Не знаю, вы напишите, что конкретно вы хотите в этом поле сохранить. А то я вижу либо строку, либо время и не понятно какую логику она реализует.
Время я имел в виду, конечно, извините. Думал, будет понятно по виду константы.
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Yaroslav Schekin
Т.е. когда она выполнится (после десятка повторов, к примеру) в 9:57 — это нормально? ;)
Если это время задаётся на бэкенде, то тут вообще ко всему прикопаться можно, потому что оно, конечно же, не будет иметь ничего общего с временем выполнения и временем, когда запрос на сервер отправили.
источник

SM

Setplus Mac in pgsql – PostgreSQL
Victor Yegorov
обычным кроном пользуемся. правда, нужен доступ на сервр, не обязательно с базой
Спасибо! Правда, думал, что есть более элегантное решение, что-то типа pgpro_scheduler в Enterprise.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Yaroslav Schekin
А "не декларация" (то, что такие повторы — часть нормальной работы) "проверяется" чтением учебников. :)
Ярослав, не тяните свою точку зрения разработчика БД как единственную правильную, вчера с этим согласились
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Yaroslav Schekin
А "не декларация" (то, что такие повторы — часть нормальной работы) "проверяется" чтением учебников. :)
Против повторов ничего не имею. Но и дедлок - это не нормально.
Это как в новостях недавно: Суперджет штатно сел на одном двигателе. Вот, не штатно это совершенно.
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Yaroslav Schekin
Время я имел в виду, конечно, извините. Думал, будет понятно по виду константы.
Всё-таки нужен пример получше. Так не убедительно, ну либо я не понимаю.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Павел П.
Чат, общетеоретический вопрос) А как вообще правильно:
- приложение отправляет запросы к таблицам, явно указывая схему
- приложение ничего не знает о схемах, всё рулится через search_path для роли под которой приложение работает.

Второй вариант авито упоминали на конференциях, когда выкатку новых фич порционно делали.
Ну а первый вариант... просто проще для дба?)
с точки зрения безопасности схему надо указывать явно. был даже секюрити релиз, чтобы предотвратить инъекции через создание “своих” объектов в схемах, который “раньше” в search_path.
если уверены в безопасности сервера, то этим можно пользоваться умышленно как раз для смены версий функционала
источник

П

Павел П. in pgsql – PostgreSQL
Victor Yegorov
с точки зрения безопасности схему надо указывать явно. был даже секюрити релиз, чтобы предотвратить инъекции через создание “своих” объектов в схемах, который “раньше” в search_path.
если уверены в безопасности сервера, то этим можно пользоваться умышленно как раз для смены версий функционала
Точно, аспект безопасности тоже нужно отметить.. Спасибо)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Victor Yegorov
Ярослав, не тяните свою точку зрения разработчика БД как единственную правильную, вчера с этим согласились
Кто с этим согласился?! Какую ещё "точку зрения"?
Это не точка зрения — это фундаментальные основы работы с многопользовательскими СУБД — implicit rollbacks неизбежны при наличии параллельных конкурирующих за ресурсы транзакций, и что с ними делать — тоже из этих основ.
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Victor Yegorov
Ярослав, не тяните свою точку зрения разработчика БД как единственную правильную, вчера с этим согласились
Мне вот нравится точка зрения Константина, когда он сказал, что, если вероятность дедлока мала, то повтор выглядит норм.

Это точка зрения где-то по середине.
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Konstantin Knizhnik
Поиск цикла в графе делается под эксклюзивной блокировкой. Вероятность того, что оба участника дедлока решат  сделать харакири достаточно мала.
Но есть другая более реальная проблема, которую мы действительно наблюдали.
И, вспомнив про неё, я склонен согласится, что в дедлок дететоре посгреса действительно есть деффект.
Под большой нагрузкой, если много транзакций конфликтуют за один и тот же ресурс (например table extension lock), то все они засыпают на этом локе и ... таймаут в них срабатывает примерно в одно и тоже  время. И все они начинают искать дедлок, для этого пытая взять ксклюзивную блокировку. И... Всё практически  встаёт.
Мы в ПгПро испытали несколько способов решить эту проблему:
1. Пытаться преварительно проверить наличие дедлка под шаред блокировкой.
2. Если кто-то уже ищет циклы в графе, то запретить ругим бэкендам заниматься дедлок детекшином
3. Запоминать в рётрах графа блокировки время последнего прохода и не ходить повторно по ним в течении какого-то времени
Кстати, а эти способы помогли?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Stavrov
Если это время задаётся на бэкенде, то тут вообще ко всему прикопаться можно, потому что оно, конечно же, не будет иметь ничего общего с временем выполнения и временем, когда запрос на сервер отправили.
Ну и что? Суть примера в том, что передаваемые с клиента значения могут изменяться при повторении транзакции, время — самый простой пример таких значений.
Поэтому повторение "вслепую" работает не в каждом случае. А если это так — зачем его в PostgreSQL реализовывать?
источник