@pgsql

Страница 797 из 1062
Yaroslav
10.05.2018
12:49:32
а в логах базы откуда берется такая ошибка?
Хмм... оттуда и берётся (её выдаёт PostgreSQL, а не pgbouncer, естественно). Так вы пробовали отловить?

Alexandr
10.05.2018
12:50:16
Хмм... оттуда и берётся (её выдаёт PostgreSQL, а не pgbouncer, естественно). Так вы пробовали отловить?
после того как приложение упало, перезапустилось, то он перестал выдавать такую ошибку, то бишь трудно отследить при каком условии это произошло

так в issue по ссылке выше говорилось что ошибка связана с работой приложения через pgbouncer в transaction mode

Yaroslav
10.05.2018
12:53:58
после того как приложение упало, перезапустилось, то он перестал выдавать такую ошибку, то бишь трудно отследить при каком условии это произошло
А у вас логируются только ошибки? Тогда хуже... но, тем не менее, можно попробовать отловить "SET TRANSACTION READ ONLY;" (и т.п.) в приложении сейчас (включив логирование), в надежде на то, что это обычно делает либо используемый им драйвер, либо оно само.

Google
Yaroslav
10.05.2018
12:54:19
Denis
10.05.2018
12:56:35
pgbouncer
через JetBrain-овскую IDE к базе коннектитесь? они ставят read-only на сессию по умолчанию.

Alexandr
10.05.2018
12:57:24
Так у вас всё то же, но только C++, я правильно понял?
не совсем, приложение спокойно себе работало и в какой то момент несколько транзакций завалилось с ошибкой cannot execute UPDATE in a read-only transaction и после перезапуска все вновь стало нормально

Dmitrii
10.05.2018
12:57:49
Всем привет. Такой вопрос... А реально ли постгресовому RETURNING присобачить алиас для полей?

ORM требует для маппинга (по крайней мере для простого пути)

Denis
10.05.2018
12:58:09
причем здесь jetbrains если речь идет о приложении?
при том, что они могут делить один пул в pgbouncer-е

вы спросили, кто-нибудь сталкивался. я сталкивался с вот таким, как описал.

Dmitrii
10.05.2018
12:59:06
Что тотипа RETURNING alias.id, ... ?

Alexandr
10.05.2018
12:59:07
при том, что они могут делить один пул в pgbouncer-е
ну ок, но по какой причине одна транзакция может влиять на другую транзакцию?

Denis
10.05.2018
12:59:27
read-only на сессию, а не транзакцию.

полагаю, PostgreSQL возвращает одинаковую ошибку, даже если речь не о конкртеной транзакции.

Yaroslav
10.05.2018
13:02:37
ну ок, но по какой причине одна транзакция может влиять на другую транзакцию?
А причём тут "одна на другую"? Вроде в https://github.com/pgbouncer/pgbouncer/issues/224 достаточно подробно описано, в _чём именно_ причина, почему вы думаете, что ваше приложение / драйвер не делает того же?

Google
Yaroslav
10.05.2018
13:02:59
это исключили
Т.е. как вы это исключили?

Alexandr
10.05.2018
13:11:23
Т.е. как вы это исключили?
я в коде разработчика посмотрел что он это не где не захардкодил, да и тот код работает уже пару недель без изменений и такой ошибки не было

Alexandr
10.05.2018
13:15:00
нашли косяк, чувак подключился через jetbrains в read-only режиме на порт баунсера

Darafei
10.05.2018
13:15:51
ух ты, у нас есть телепаты!

Alexandr
10.05.2018
13:16:11
всем спасибо

Yaroslav
10.05.2018
13:19:18
Что тотипа RETURNING alias.id, ... ?
Прямо из https://www.postgresql.org/docs/current/static/sql-insert.html : [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

Dmitrii
10.05.2018
13:22:00
Так тоже оказывается можно )

Скажите, правильно ли будет решить следующую задачу через рекурсивные запросы. Если коротко то нужно генерировать номера для контр-агентов. Пример номера: 70468 где 7 это как бы "глобальный" неймспейс, "04" это закодированная буква D латинского алфавита, а 68 это просто 68 свободный в базе с такими же комбинациями на букву D в неймспейсе 7. Когда Последние две цифры переваливают за 99, то вместо 7 надо выбирать 8 и смотреть сколько контр-агентов под номером 04 и брать последнийсвободный саб-айди, например 01 если это первый контр-агентв неймспейсе 8. Т.е. его конечный id будет 80401

Vladislav
10.05.2018
15:48:43
банальный инкремент? о_0

Dmitrii
10.05.2018
15:48:50
Всего таких глобальных неймспейсов может быть три: 7, 8 и 9. Если ни в одном для него места нет — то выбрасываем ошибку

Vladislav
10.05.2018
15:48:54
какие-то странные сложности

Dmitrii
10.05.2018
15:49:23
Просто инкремент нельзя, перечитай еще раз ) Все это должен делать 1 SQL запрос )

Vladislav
10.05.2018
15:49:43
я прочитал "генерить"

Dmitrii
10.05.2018
15:49:43
И уметь переключать доступные неймспейсы среди 7, 8 и 9

Vladislav
10.05.2018
15:49:59
про селекты ни слова

Dmitrii
10.05.2018
15:50:06
Да, генерить, то максимальный id в группе 7 это 72699

Дальше 82699

И последний это 92699

Google
Vladislav
10.05.2018
15:51:04
три сиквенса со start и end

Dmitry
10.05.2018
15:52:40
Решал подобную задачу, в итоге делал в коде приложения

Dmitrii
10.05.2018
15:52:48
И как же мне перескакивать на неймспейс 8 если для буквы Z все занято?

Vladislav
10.05.2018
15:53:14
один сиквенс отвалится

а вообще да, бред такое в бд делать

Dmitrii
10.05.2018
15:53:36
Так он валиден для других букв )

Мне надо просто атомарно

Чтобы блокировками не обкладываться

Vladislav
10.05.2018
15:54:32
не стоит всякий бред на базу перекладывать, пускай это делает аппликейшен

Dmitrii
10.05.2018
15:55:00
Какая разница где "бред" лежит?

Vladislav
10.05.2018
15:55:15
большая

Dmitry
10.05.2018
15:55:20
Мне надо просто атомарно
я использовал сиквенс и в приложении преобразовывал его значение

Denis
10.05.2018
15:55:55
а непрерывность последовательности важна? тогда сиквенсы не подходят

Dmitrii
10.05.2018
15:56:08
Да, тут оно может быть непоследовательно

Это же контрагенты

Denis
10.05.2018
15:56:36
так допускаются пропуски или нет?

Dmitrii
10.05.2018
15:56:52
В пределах 701XX не допускаются

Остальное может скакать как попадет

По сути для комбинации первых трех чисел ­ — два последних это некий сиквенс

Denis
10.05.2018
15:59:04
в общем, вы правы - это можно сделать подзапросами

Google
Dmitrii
10.05.2018
15:59:29
Без рекурсивных не обойтись? Или можно? Пока понять не могу

Именно вот этот "перескок" чтобы реализовать

Denis
10.05.2018
16:00:05
я не очень глубоко вдумывался, но не вижу предпосылок использовать рекурсивные.

перескок? ткните еще раз в него

Dmitrii
10.05.2018
16:00:53
70199 - последний id в базе для буквы A для неймспейса 7.

Добавляю еще длябуквы А. Будет поправилам — 80101

8(namespace)01(char position)01(seq)

A=01, B=02... Z=26

Vladislav
10.05.2018
16:02:22
вам проще сразу таблицу меппинга сделать наверно

Andrey
10.05.2018
16:02:25
А вот подскажите - pgbarman так и не научился сжимать base backup?

и если нет - какова формула подсчёта необходимого места на диске для его использования?

Andrey
10.05.2018
16:03:12
вводные: есть некоторое количество БД размером от 50GB до 1Tb.

хочется делать не менее 4 точек восстановления в день

ну и соотв. хранить промежуточные валы

Vladislav
10.05.2018
16:03:44
Чего на что?
входящих данных на исходящие

Andrey
10.05.2018
16:04:03
как корректно расчитать место на диске нужное под это хозяйство, а также что можно использовать чтобы сэкономить дисковое простарнство на бекап сервере?

Denis
10.05.2018
16:04:04
кажется, я бы делал так: - сгенерировал бы серию generate_series для первого куска - сджойнил бы с серией generate_series для второго куска - нашел бы минимальное значение среди существующих с таким префиксом

Dmitrii
10.05.2018
16:05:16
В смысле вот так: SELECT * FROM generate_series(1, 26) AS g(gid), generate_series(1, 99) AS t(tid) ?

Получится около 7к строк как раз. Или еще часть с неймспейсом?

Google
Denis
10.05.2018
16:08:01
наоборот, наймспейс включить, а seq не генерировать

Dmitrii
10.05.2018
16:08:51
А

Denis
10.05.2018
16:09:32
дальше: - найти минимальный свободный seq в каждом префиксе - отсеять те, где seq = 99 - найти минимальный из оставшихся результатов - увеличить в нем seq на единицу - PROFIT

Dmitrii
10.05.2018
16:10:23
Щас буду пробовать. Спасибо за подгон )

И да, клянусь, эту накоманию не я придумал!

Denis
10.05.2018
16:10:57
вообще, че-то мы перемудрили.

Dmitrii
10.05.2018
16:11:25
Мне иногда кажется каждый раз, когда что-то касается бухгалтерии — начинается какой-то ад

Denis
10.05.2018
16:12:16
если можно пропускать номера, то берем сиквенс, от его значения просто арифметически высчитываем все составляющие

я правильно понял, что ваш номер - это XYZ, где X - от 7 до 9; Y - от 01 до 26; Z - от 0 до 99?

Denis
10.05.2018
16:18:00
X = 7 + n / 2600 Y = 1 + (n % 2600) / 100 Z = n % 100

Dmitrii
10.05.2018
16:18:24
Грузовик математиков подъехал?)

Denis
10.05.2018
16:18:33
n - текущее значение сиквенса

Dmitrii
10.05.2018
16:22:03
n - текущее значение сиквенса
У вас в Z нули получаются иногда из за деления по модулю

А, my bad. Я выше тоже не так подтвердил ?

1-99

Denis
10.05.2018
16:23:41
X = 7 + n / 2574 Y = 1 + (n % 2574) / 99 Z = 1 + n % 99

Dmitrii
10.05.2018
16:24:09
n % 99 + 1

Ну да )

Страница 797 из 1062