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

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

Ash
06.08.2018
15:10:36

Yaroslav
06.08.2018
15:11:16

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


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

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

Ash
06.08.2018
15:18:46

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

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

Darafei
06.08.2018
15:42:24
это хороший вопрос - можно ли заинлайнить z(v) в том запросе?
по-моему там единственное препятствие - это завышенный кост неравенства
это не единственное такое больное место, https://carto.com/blog/inside/postgres-parallel/

Yaroslav
06.08.2018
15:43:57

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

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

Yaroslav
06.08.2018
15:45:35

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

Darafei
06.08.2018
15:46:23

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

Yaroslav
06.08.2018
15:47:41

Darafei
06.08.2018
15:47:54
да! :)
вообще, кажется, что оптимизация во втором запросе нелегальная

Yaroslav
06.08.2018
15:50:11

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

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

Twelfth
06.08.2018
17:10:18

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

Yaroslav
06.08.2018
17:15:11

Иван
06.08.2018
17:18:09

Google

Twelfth
06.08.2018
17:23:20

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

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

Yaroslav
06.08.2018
20:06:13

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)
На мастере все ок. Ищу по определенному полю. Если искать по другому полю, то ошибку не получаю.