
Anatoly
19.08.2018
11:49:36
» . Снять (частичный) дамп проблемной таблицы — вот тут Вы и помучаетесь. :(
а это как?

Yaroslav
19.08.2018
11:51:58

Anatoly
19.08.2018
11:52:08
а pg_dumpall не работает для данных. зависает и все. пришлось переключиться на pg_dump
спасибо, попробуем.

Google

Yaroslav
19.08.2018
11:53:52
спасибо, попробуем.
Что Вы собираетесь пробовать? ;) Вы знаете, как снимать дампы с "битых" таблиц?

Anatoly
19.08.2018
11:56:53

Yaroslav
19.08.2018
11:59:10

Anatoly
19.08.2018
12:02:58
всегда мечтал научится читать бинарный формат постгре =)

Yaroslav
19.08.2018
12:03:33
всегда мечтал научится читать бинарный формат постгре =)
Я, например, знаю только простые способы, но в нетривиальных случаях ими много не вытащишь. :(
Но тут могут быть люди, которые этим занимаются. :)
Вам насколько важны эти данные? Если "очень", может, стоит даже к кому-нибудь обратиться?
(Впрочем, если хотите, можно попробовать простые способы, чтобы понять, сколько так можно вытащить... хотя бы будете знать, насколько всё плохо).

Anatoly
19.08.2018
12:04:59
про "важность" мы пока не знаем. нужные люди отсутствуют. мы пока просто пытаемся сделать все, что в наших силах)

Yaroslav
19.08.2018
12:08:40
про "важность" мы пока не знаем. нужные люди отсутствуют. мы пока просто пытаемся сделать все, что в наших силах)
Так у Вас эта битая база запущена? Если да, вот, например, один простой способ:
В этой базе делаете так:
CREATE FUNCTION chk(tid) RETURNS boolean LANGUAGE plpgsql
AS $f$
DECLARE r text;
BEGIN
r := (SELECT d FROM <yourtable> AS d WHERE ctid=$1);
return false;
EXCEPTION WHEN others
THEN return true;
end;
$f$;
-- Потом делаете так:
SELECT ctid, <id>
FROM <yourtable>
WHERE chk(ctid);
Если всё ещё не очень плохо (не завершится падением psql или PostgreSQL), Вы увидите, сколько/какие у Вас битые записи.

Anatoly
19.08.2018
12:12:19
спасибо, попробуем

Yaroslav
19.08.2018
12:16:16
спасибо, попробуем
Если сработает, кстати, то "нормальные" записи потом можно вытащить как-то так:
\copy (SELECT * FROM <yourtable> WHERE NOT chk(ctid)) TO 'yourtable.dat'
Если не помогает, можно ещё на zero_damaged_pages посмотреть (но тут уж Вы точно что-то потеряете).

Anatoly
19.08.2018
13:38:28
не, оба варианта не прокатили.

Yaroslav
19.08.2018
13:41:34

Google

Anatoly
19.08.2018
13:43:34
постгрес стартует в любом случае

Yaroslav
19.08.2018
13:47:05

Anatoly
19.08.2018
13:57:42
limit 2 работал. Таблица вроде небольшая. Виснет даже count(*).

Yaroslav
19.08.2018
15:08:51

Anatoly
19.08.2018
16:33:45

Yaroslav
19.08.2018
16:35:26

Anatoly
19.08.2018
16:36:45
не, ошибки при попытке сделать реиндекс были. а этот запрос к этой таблице просто висит без каки-либо признаков жизни.

Yaroslav
19.08.2018
16:39:31

Anatoly
19.08.2018
16:42:37
увы. может нам скинут дамп поглазеть)

Yaroslav
19.08.2018
16:47:40

Anatoly
19.08.2018
16:48:15
дамп файлов сохранили

Yaroslav
19.08.2018
16:54:58

Andrew
20.08.2018
06:43:57
Доброе утро. Какие есть подходы, чтобы написать вот такой запрос?
(схематично записал заготовку для пагинации)
select * from todos
where date >= CURRENT_DATE and city_id=1
order by date asc;
if not found then
select * from todos
where date < CURRENT_DATE and city_id=1
order by date desc;
end if;

Sergey
20.08.2018
06:49:25
Есть вот такая штука. https://postgrespro.ru/docs/postgrespro/10/sql-waitlsn Не знаю гасколько легко ставится в стандартный Postgres

Andrew
20.08.2018
06:51:13

Sergey
20.08.2018
06:52:08

Oleg
20.08.2018
07:03:04

Andrew
20.08.2018
07:05:48

Oleg
20.08.2018
07:08:23

Google

Andrew
20.08.2018
07:09:36

Ilia
20.08.2018
07:24:58


Oleg
20.08.2018
07:25:22
там пагинация предполагается потом. Двумя с if-ом внутри запроса или на уровне сервера?
кстати да. для сортировки тоже можно сделать вспомогательное поле(поля), по которому можно провести по-разному сортировку:
select 1 as flag, datediff(ss, 'somedata' , date) as sort_field, * from
..
select 2 as flag, datediff(ss, date, 'somedata' ) as sort_field, * from
разница между порядком аргументов для datediff( это фунция tsql разница в секундах между двумя даттаймами), сделает так что для 2го куска подзапроса эта разница секунд будет расти тоже asc для обратного порядка поля date .
собственно order by sort_field asc

Andrew
20.08.2018
07:26:45
хм. Сейчас попробую
Вообщем оказалось что обычным union all все хорошо работает. Спасибо @olegmakarikhin
(
select * from todos
where date >= CURRENT_DATE and city_id=1
order by date asc
)
union all
(
select * from todos
where date < CURRENT_DATE and city_id=1
order by date desc
)

Terminator
20.08.2018
07:46:06
Игорь Ишин будет жить. Поприветствуем!

Oleg
20.08.2018
07:53:49
аааа, нужна была своеобразная сортировка, я думал фильтрация "если есть записи первого типа, тогда показывать только их, если второго - то только их но с другой сортировкой)

Tolya
20.08.2018
10:20:22
Привет! Подскажите, плиз, как wal buffers помогает при записи wal логов?
на момент выполнения commit из буффера все должно ведь перекинуться в wal segments?
или тут основная оптимизация в том, что во время транзакции все быстро пишется в оперативку, а потом одним куском сразу на диск?


Konstantin
20.08.2018
10:33:12
Лемма 1: данные на диск всё равно пишутся блоками. Если вам надо записать 1 байт, то файловой системе надо будет сначала прочитать блок с диска, потом скопировать туда ваш байт и записть блок на диск. Чтобы этого не происходило при записи в базу (или в WAL), Постгрес всегда пишет страницами.
Лемма 2: при коммите данные должны оказаться в WAL-е до того, как мы вернём ответ клиенту.
Соотвественно Постгрес буфферизует запист в WAL и пишет странички целиком. Если танзакций мало, то одна и та же страница WAL-а будет писаться на одно место несколько раз. Если же паралельных странзакцияй много, то Посгрес умеет одним write-ом записать на диск данные нескольких тарнзакций. Это позволяет резко повысить TPS-ы, потому как вообще-то среднее время записи случайной страницы на обычный HDD - порядка 10msec.
Поэтому чем больше буферов, тем больше у Посгреса возможность комбинирования записей паралельных траназакций и тем больше будет скорость. Но это если есть паралельные тарнзакции. Если вы выполняете одноклиентный pgbench, то разницы в скорости при увеличении wal buffers не будет


Denis
20.08.2018
10:33:22

Tolya
20.08.2018
10:42:30
@knizhnik спасибо!
данные нескольких транзакций он записывает, если включен commit_delay, на сколько я понимаю, т.е. по умолчанию такого не происходит

Sergey
20.08.2018
10:47:18
В WAL "параллельно" пишутся все текущие транзакции.

Tolya
20.08.2018
11:02:58
@SergeyPpro в таком случае мелкие будут прилипать к блокам большой? мелкие с мелкими все равно будут независимо скидываться? это какая-то внутренняя оптимизация pg?

Sergey
20.08.2018
11:11:22

Tolya
20.08.2018
11:13:04
Спасибо!

Anton
20.08.2018
11:34:38
А что быстрее будет: выборка и сортировка соединение с выборка и сортировка. Или сначала все соединили и потом отсортировали уже соединение? По идее оптимизатор ведь одинаково развернет это?

Darafei
20.08.2018
11:35:22
Надо смотреть, как данные в диске лежат

Anton
20.08.2018
11:36:24
А учитывается планировщиком статистика по доступу к данным еще?
Время доступа имею ввиду

Google

Anton
20.08.2018
11:39:46
И еще такой момент : есть ли какие то элементы спекулятивного выполнения запроса на основе прогнозирования в постгрес или делались ли экспериментальные исследования в этом направлении?

Yaroslav
20.08.2018
11:55:24

Anton
20.08.2018
12:17:34
Опять-таки, что именно имеется в виду?
Я имею ввиду параллельно не занятым потоком выполнять запрос на основе прогноза и если последующий запрос предсказан верно то применять его результат сразу. Ну естественно учитывая acid
Как инструкции в процессоре

Darafei
20.08.2018
12:20:14
Нет "возможного будущего запроса"

Yaroslav
20.08.2018
12:20:58
Как инструкции в процессоре
Естественно, нет. Как Вам такое вообще в голову приходит!? ;)
И даже исследований с подобными идеями я никогда не видел.

Konstantin
20.08.2018
12:28:11
А учитывается планировщиком статистика по доступу к данным еще?
У посгресового оптимизатора есть много параметров, описывающий стоимость выполнения операции (случайный и последовательный доступ к диску, CPU, эффективный кэш,...) Все этим параметры приходится задавать ручками. Никакого объективного способа вычислить например cpu_tuple_cost нет. Было ряд исследований как можно использовть нервные сетки для оптимального подбора значений параметров под конкретную систему и запросы. Но чаще всего проколы оптимизатора связаны с неправильным предсказанием селективности. И тут тоже может помочь AI (https://pgconf.ru/2017/93634).


Anton
20.08.2018
12:44:51
Понятно дело, что оптимизированный алгоритм доступа к данным будет плохо оптимизироваться таким образом. Но когда программа написана неоптимально и дергает много раз почти один и тот же запрос в цикле - может вполне нормально сработать

Yaroslav
20.08.2018
12:50:59

Anton
20.08.2018
12:51:11
Я об этом начал думать насмотревшись запросов в 1С.
И как там это программисты умудряются использовать. Мне прям совсем жутко становится, чем больше вижу.
Если программа не меняется на прикладном уровне, то это будет конечное количество запросов с изменяемым значением переменных
И если это простой запрос, а при этом куча ядер и потоков простаивает, то можно опускать условие where и поднимать в кеш всевозможные значения результата выборки, а затем делать быстрый запрос на этих данных, проверив их непротиворечивость причинно-следственности
Что-то похожее на алгоритмы мультиклет процессоров


Maxim
20.08.2018
13:03:01
коллеги, у меня в подвале подземный стук
есть приложенька (deis-controller), которую кубернетес раз в десять секунд проверяет на вшивость
приложенька ходит к постгресу (9.4, don't ask), делает там SELECT 0 и в случае успеха говорит кубернетесу, что пока ещё жива
и всё работало довольно долго (где-то с год), но вот сегодня всё сломалось, потому что у постгреса закончились коннекты
картина примерно такая:
# SELECT query from pg_stat_activity where state = 'idle';
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
...
и вот этих ребят там max_connections - 1
вопрос: что вдруг начало мешать им умереть, и куда вообще бежать?

Google

Yaroslav
20.08.2018
13:03:31

Anton
20.08.2018
13:04:52


Yaroslav
20.08.2018
13:04:53
коллеги, у меня в подвале подземный стук
есть приложенька (deis-controller), которую кубернетес раз в десять секунд проверяет на вшивость
приложенька ходит к постгресу (9.4, don't ask), делает там SELECT 0 и в случае успеха говорит кубернетесу, что пока ещё жива
и всё работало довольно долго (где-то с год), но вот сегодня всё сломалось, потому что у постгреса закончились коннекты
картина примерно такая:
# SELECT query from pg_stat_activity where state = 'idle';
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
│ SELECT 0 $
...
и вот этих ребят там max_connections - 1
вопрос: что вдруг начало мешать им умереть, и куда вообще бежать?
Это без pooler и т.п.? Если да, то приложение само должно соединения закрывать, PostgreSQL тут ни при чём.


Maxim
20.08.2018
13:05:02
вот вся магия ливнессчека: class ReadinessCheckView(View):
"""
Simple readiness check view to determine DB connection / query.
"""
def get(self, request):
try:
import django.db
with django.db.connection.cursor() as c:
c.execute("SELECT 0")
except django.db.Error as e:
raise ServiceUnavailable("Database health check failed") from e
return HttpResponse("OK")
head = get
джанга почему-то вдруг передумала закрывать коннекты

Anton
20.08.2018
13:06:53
Я так понимаю коннект висит, пока результат не придет, а результат не приходит, потому что очередь висит
Ну то есть скорее всего перезапуск субд вернет все на место. Или оно после этого снова воспроизводится?

Maxim
20.08.2018
13:12:27