@pgsql

Страница 920 из 1062
Darafei
06.08.2018
15:09:44
в смысле, какая-то умная часть системы запускает, видит, что за 30 секунд не запустилось, убивает и запускает заново? :)

Yaroslav
06.08.2018
15:09:54
> Запустил, и в логах после попыток восстановления - бесконечные попытки старта. Так покажите их (эти попытки рестарта и восстановления)!

Google
Ash
06.08.2018
15:11:25
Вот такого рода события в логе: 2018-08-06 21:44:55 +07 FATAL: the database system is shutting down 2018-08-06 21:44:57 +07 LOG: database system is shut down 2018-08-06 21:56:52 +07 LOG: database system was shut down in recovery at 2018-08-06 21:44:53 +07 2018-08-06 21:56:52 +07 LOG: database system was not properly shut down; automatic recovery in progress 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:53 +07 FATAL: the database system is starting up 2018-08-06 21:56:54 +07 FATAL: the database system is starting up 2018-08-06 21:56:55 +07 LOG: redo starts at 2/29EB118 2018-08-06 21:56:55 +07 FATAL: the database system is starting up 2018-08-06 21:56:56 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:58 +07 FATAL: the database system is starting up 2018-08-06 21:56:58 +07 FATAL: the database system is starting up 2018-08-06 21:56:59 +07 FATAL: the database system is starting up

Darafei
06.08.2018
15:11:29
если есть таймаут на запуск, нужно его убрать :)

Yaroslav
06.08.2018
15:13:21
Вот такого рода события в логе: 2018-08-06 21:44:55 +07 FATAL: the database system is shutting down 2018-08-06 21:44:57 +07 LOG: database system is shut down 2018-08-06 21:56:52 +07 LOG: database system was shut down in recovery at 2018-08-06 21:44:53 +07 2018-08-06 21:56:52 +07 LOG: database system was not properly shut down; automatic recovery in progress 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:53 +07 FATAL: the database system is starting up 2018-08-06 21:56:54 +07 FATAL: the database system is starting up 2018-08-06 21:56:55 +07 LOG: redo starts at 2/29EB118 2018-08-06 21:56:55 +07 FATAL: the database system is starting up 2018-08-06 21:56:56 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:58 +07 FATAL: the database system is starting up 2018-08-06 21:56:58 +07 FATAL: the database system is starting up 2018-08-06 21:56:59 +07 FATAL: the database system is starting up
Да, 100% что-то останавливает PostgreSQL: > database system was shut down in recovery at 2018-08-06 21:44:53 +07 После чего что-то его опять пытается стартовать: > LOG: database system was not properly shut down; automatic recovery in progress Вам нужно найти, что его останавливает.

Вот такого рода события в логе: 2018-08-06 21:44:55 +07 FATAL: the database system is shutting down 2018-08-06 21:44:57 +07 LOG: database system is shut down 2018-08-06 21:56:52 +07 LOG: database system was shut down in recovery at 2018-08-06 21:44:53 +07 2018-08-06 21:56:52 +07 LOG: database system was not properly shut down; automatic recovery in progress 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:52 +07 FATAL: the database system is starting up 2018-08-06 21:56:53 +07 FATAL: the database system is starting up 2018-08-06 21:56:54 +07 FATAL: the database system is starting up 2018-08-06 21:56:55 +07 LOG: redo starts at 2/29EB118 2018-08-06 21:56:55 +07 FATAL: the database system is starting up 2018-08-06 21:56:56 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:57 +07 FATAL: the database system is starting up 2018-08-06 21:56:58 +07 FATAL: the database system is starting up 2018-08-06 21:56:58 +07 FATAL: the database system is starting up 2018-08-06 21:56:59 +07 FATAL: the database system is starting up
И отфильтруйте эти "FATAL: the database system is starting up", они вообще к делу не относятся.

Ash
06.08.2018
15:14:00
ОК, очень логично.

Yaroslav
06.08.2018
15:17:09
ОК, очень логично.
Вообще да, таймаут можно вообще убрать, т.к. в зависимости от нагрузки и настроек checkpoint, на recovery может уйти и час, например... Конечно, в этом случае лучше настройки PostgreSQL "подкрутить" к нужному Вам RTO. ;)

Yaroslav
06.08.2018
15:26:34
А что же, коллеги, кому-то интересен CTE inlining patch (который в -hackers David Fetter выкладывал)? ;) Если да, есть какие-то идеи, как это должно выглядеть на "уровне" SQL? Т.е., по умолчанию, или GUC, или типа "WITH INLINED a(a, b) AS (...)", или ещё как-то?

Darafei
06.08.2018
15:27:49
оно должно делать это само

Yaroslav
06.08.2018
15:29:50
оно должно делать это само
Ok. А изменения поведения просто документируем как incompatible change (и/или добавляем GUC), и всё?

Darafei
06.08.2018
15:30:33
а почему оно incompatible?

результат-то у запроса тот же, только план другой?

Yaroslav
06.08.2018
15:31:30
Нет, не тот же. Более того, достигнуть этого в общем случае невозможно, т.е. сразу оставьте надежду.

Google
Darafei
06.08.2018
15:31:42
почему не тот же?

Yaroslav
06.08.2018
15:32:43
почему не тот же?
http://www.postgresql-archive.org/CTE-inlining-td5958992i80.html#a5961086 Т.е. если мы хотим patch, надо быть готовым к тому, что изменения будут.

И это, кстати, ещё не всё. Например, может изменится (и, с patch-ем как он есть сейчас, меняется) поведение недетерминированных запросов.

Конкретно, в случае multi-referenced CTE.

Darafei
06.08.2018
15:34:16
это - нормально

ведь пережили изменение поведения SRF

есть в постгресе много бед с инлайнингом

Yaroslav
06.08.2018
15:35:43
это - нормально
Но это incompatible change. Т.е. если кто-то на это закладывался (и документация-то почти гаранитровала, что это должно работать), у них работать перестанет.

Darafei
06.08.2018
15:36:07
потестируют, не обновятся, перепишут

Yaroslav
06.08.2018
15:37:48
потестируют, не обновятся, перепишут
Я вот тоже за такой поход, между прочим. ;) Просто интересны другие мнения...

Darafei
06.08.2018
15:38:34
просто окажется, что много кто заложился на cte как на няшный optimization barrier

и окажется, что оптимизатор не может адекватно свернуть большинство заинлайненных запросов

Yaroslav
06.08.2018
15:40:59
просто окажется, что много кто заложился на cte как на няшный optimization barrier
Это да, но они найдут, эээ... другие способы. ;) Но то, что я описывал/показывал, куда хуже. Это не optimization barrier, это изменение результата запросов. И вот это людям может куда меньше понравиться. :(

Darafei
06.08.2018
15:42:24
это хороший вопрос - можно ли заинлайнить z(v) в том запросе?

по-моему там единственное препятствие - это завышенный кост неравенства

это не единственное такое больное место, https://carto.com/blog/inside/postgres-parallel/

Yaroslav
06.08.2018
15:43:57
по-моему там единственное препятствие - это завышенный кост неравенства
Да конечно можно. Это действительно IMMUTABLE функция, чего бы её и не inline-ить?

alex
06.08.2018
15:44:14
народ. хелп ми

Darafei
06.08.2018
15:44:25
alex
06.08.2018
15:44:26
я запутался. распутайте меня ))

Google
alex
06.08.2018
15:45:02
короч, мне нужны ответы на нубские вопросы )

Darafei
06.08.2018
15:45:08
Да конечно можно. Это действительно IMMUTABLE функция, чего бы её и не inline-ить?
вот есть отличный патч на такое https://patch-diff.githubusercontent.com/raw/CartoDB/postgres/pull/12.diff

alex
06.08.2018
15:45:25
делаю кластер кипаливед + хапрокси + посгри

Yaroslav
06.08.2018
15:45:35
ну, нельзя, потому что у неё кост выше трешхолда
Это я сделал только для того,чтобы показать проблему. Т.е. сейчас CTE подходит для управления порядком выполнения, а после — перестанет.

alex
06.08.2018
15:45:43
но при падении кипалива, посгри перезжает на слейв.

кто поможет разобрать проблему . тому конфетку ))

Terminator
06.08.2018
15:47:29
@AnastasiyaGurinovich будет жить. Поприветствуем!

Yaroslav
06.08.2018
15:47:41
ну, будет в гайде для миграции "допишите offset 0 во все ваши cte"
Ну... это не совсем одно и то же. Кроме того, некоторым очень нравится идея вообще упоминать этот hint чем меньше, тем лучше. ;)

Darafei
06.08.2018
15:47:54
да! :)

вообще, кажется, что оптимизация во втором запросе нелегальная

Yaroslav
06.08.2018
15:50:11
вообще, кажется, что оптимизация во втором запросе нелегальная
Легальная. Точнее, так — или такое легально, или patch можно выбросить, и о CTE inlining забыть. Вам как больше нравится? ;)

Darafei
06.08.2018
15:51:37
мне интересно, exception AND false сворачивается, получается, в exception?

тогда false AND exception тоже должен так же сворачиваться, ведь AND симметричен

а значит, что логика у нас состоит из true, false, null, exception и кейс с exception забыли рассмотреть

а если false AND exception => false, то после эксепшена надо посчитать другие клаузы и если они false, проигнорить эксепшен?

это, кстати, проблема в PostGIS

если ты начнёшь делать join по ST_Intersects по таблицам с двумя разными SRID, то ты получишь или не получишь exception в зависимости от того, созданы у тебя индексы по геометрии или нет

Yaroslav
06.08.2018
15:56:52
а значит, что логика у нас состоит из true, false, null, exception и кейс с exception забыли рассмотреть
Ну да, вроде того. Но! После долгих и мучительных чтений стандарта (Andrew Gierth, Vik Fearing... ещё кто-то участвовал, забыл :( ), нам показалось, что случай с exception стандарт не считает нужным рассматривать вообще. Т.е., для запроса: SELECT 1 WHERE true OR 1/0; Оба результата — 1 и "division by zero" — соответствуют ISO SQL.

Darafei
06.08.2018
15:57:43
то есть implementation defined, и тогда меняйте ради бога

Google
Yaroslav
06.08.2018
15:58:20
Да, и это логично, иначе вообще мало что можно было бы оптимизировать.

Darafei
06.08.2018
16:01:18
тогда, кажется, единственный обещанный способ прятать эксепшены - это под case when

если не брать в расчёт plplgsql

Yaroslav
06.08.2018
16:03:31
тогда, кажется, единственный обещанный способ прятать эксепшены - это под case when
Вообще, нет. Этого ISO SQL тоже не обещает. Т.е. на expection-ы стандарту совсем пофиг. Т.е. если кто-то может оптимизировать CASE так, чтобы "доставать" до exception даже в том случае, когда его не должно быть — тоже молодец. ;) И, кстати, PostgreSQL в некоторых случаях может.

Admin
ERROR: S client not available

Yaroslav
06.08.2018
16:04:29
Прямо из документации, например: https://www.postgresql.org/docs/current/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL

Многие другие СУБД это вообще делают без зазрения совести, а уж при CTE inlining почти никто (кроме DB2) вообще не обращает внимания, что там внутри. ;)

Twelfth
06.08.2018
16:40:49
Как можно направлять select запросы на slave сервера, и остальные запросы - на мастер? Сейчас поднят кластер patroni, конфигурация хранится в etcd. И нужно сделать так чтобы при смене мастера конфигурация haproxy(или иного прокси) автоматически обновлялась.

Есть ли готовые решения для этого?

У patroni есть возможность проверки, является ли текущий сервер мастером, и есть готовые конфиги для haproxy, но haproxy не умеет различать запросы к postgres

Иван
06.08.2018
16:58:12
всем привет, может кто помочь разобраться почему в данном примере первая функция не хочет работать, а вторая нормально отрабатывает - http://sqlfiddle.com/#!17/dd0dd3/29

Twelfth
06.08.2018
17:05:52
Т.е. запросы на чтение отправлять на одни сервера, а запросы на запись - на другие

Игорь
06.08.2018
17:09:18
Т.е. запросы на чтение отправлять на одни сервера, а запросы на запись - на другие
в приложении укажи одну базу мастер, другую - реплику, базы pgbouncer

Twelfth
06.08.2018
17:10:18
Игорь
06.08.2018
17:11:43
если надо разделять запросы прозрачно для клиента, то это умеет pgpool например. Pgbouncer не умеет и он не для этого

В смысле в самом приложении?
в приложении ты пишешь, что база для записи (точнее мастер) - db_master а бд для чтения - db_replica

Yaroslav
06.08.2018
17:15:11
причем если поменять returns setof record на returns table(title text) и убрать выходные параметры то все ок
"Потому что". ;) https://www.postgresql.org/docs/10/static/plpgsql-control-structures.html Конкретно, вот это: Note that you must declare the function as returning SETOF record when there are multiple output parameters, or SETOF sometype when there is just one output parameter of type sometype, in order to create a set-returning function with output parameters. Т.е. в первом случае должно быть returns setof text.

Google
Twelfth
06.08.2018
17:23:20
если надо разделять запросы прозрачно для клиента, то это умеет pgpool например. Pgbouncer не умеет и он не для этого
Надо как раз разделить запросы прозрачно для клиента. Как это сделать с pgpool?

Игорь
06.08.2018
17:26:13
это не ко мне

Centrino
06.08.2018
20:03:00
привет есть таблица пользователь и у нее есть колонка Type. Значение True/False В зависимости от Type, надо сделать join одной или другой таблицы. Как это записать?

Centrino
06.08.2018
20:06:41
users LEFT join type1.user_id = users.id

не понимаю

Yaroslav
06.08.2018
20:10:47
не понимаю
Я имел в виду что-то вроде: SELECT * FROM users LEFT JOIN table1 ON users.type AND table1.a = users.b LEFT JOIN table2 ON NOT users.type AND table2.c = users.d;

Centrino
06.08.2018
20:11:43
спасибо, попробую

Artem
06.08.2018
21:54:47
насколько критично вот такую штуку использовать в продакшене? https://github.com/smashedtoatoms/asdf-postgres

Andrey ?
07.08.2018
03:18:05
Зачем вообще использовать менеджеры версий в продакшене?

Artem
07.08.2018
06:03:28
Зачем вообще использовать менеджеры версий в продакшене?
хороший вопрос, но вообще-то ищу альтернативу докеру, для быстрого развертывания

Fike
07.08.2018
06:12:57
А в чем с контейнерами проблема?

Darafei
07.08.2018
06:17:17
точнее, в чём проблема с докером?

Олег
07.08.2018
07:19:26
Коллеги, привет! Подскажите, почему на асинхронной реплике при селекте могу получать такую ошибку ОШИБКА: не удалось прочитать блок 0 в файле "base/16397/2255745" (прочитано байт: 0 из 8192) На мастере все ок. Ищу по определенному полю. Если искать по другому полю, то ошибку не получаю.

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