
Петр
14.12.2016
16:54:52
SELECT ctid, column1...,columnN from comments where ctid='(92815,25)';
SELECT ctid, column1...,columnN from comments where ctid='(92815,26)';
падает?

blkmrkt
14.12.2016
16:55:39

Петр
14.12.2016
16:56:16
тогда проверим что эта страница в первом

Google

Петр
14.12.2016
16:56:40
dd if=/var/lib/postgresql/9.5/main/base/16385/16443 bs=8192 skip=92815 count=1 | hexdump -C | less

Stanislav
14.12.2016
16:57:02

Петр
14.12.2016
16:57:03
посмотри все записи, там есть та строка последняя, на которой упало?

blkmrkt
14.12.2016
16:59:02

Петр
14.12.2016
16:59:12
Да
Что то похожее

blkmrkt
14.12.2016
17:00:11
а когда крашнулся мой запрос, в psql вывалилась последняя неполная строчка с битыми данными, или предыдущая?
ctid был тот, на котором квери по ctid крашнулась

Петр
14.12.2016
17:01:33
Ты ту страницу и смотришь, последняя строка, которая тебе выдалась в той странице

blkmrkt
14.12.2016
17:02:00
да, оно

Петр
14.12.2016
17:02:11
Клево

blkmrkt
14.12.2016
17:02:20
интересно то как

Петр
14.12.2016
17:02:23
Давай затирать ее

Google

blkmrkt
14.12.2016
17:02:29
с dd просто?

Петр
14.12.2016
17:03:07
ну да, пг выключи, сделай копию этого файла /var/lib/postgresql/9.5/main/base/16385/16443 (на всякий случай)
dd if=/dev/zero of=/var/lib/postgresql/9.5/main/base/16385/16443 bs=8192 seek=92815 count=1 conv=notrunc

blkmrkt
14.12.2016
17:04:47
done. запускать сервер?

Петр
14.12.2016
17:04:59
да
и попробуй заново прошерстить тем же макаром, на чем упадет, на другой странице должен

blkmrkt
14.12.2016
17:05:45
ok

Петр
14.12.2016
17:05:58
а стой
погоди

blkmrkt
14.12.2016
17:06:01
a

Петр
14.12.2016
17:06:21
это на запрос select ctid, * from comments where ctid='(92816,3)':
у тебя же и на следующей странице тоже падало?

blkmrkt
14.12.2016
17:06:57
неа, только на той

Петр
14.12.2016
17:07:17

blkmrkt
14.12.2016
17:07:19

Петр
14.12.2016
17:07:27
на следующей тоже падало

blkmrkt
14.12.2016
17:07:35
да точно

Петр
14.12.2016
17:07:40
давай, ее тоже затри
не забудь пг выключить
dd if=/dev/zero of=/var/lib/postgresql/9.5/main/base/16385/16443 bs=8192 seek=92816 count=1 conv=notrunc
а потом шерсти по новой, по идее 92815 92816 страницы должно пролетать

Google

blkmrkt
14.12.2016
17:08:28
ok done

Петр
14.12.2016
17:08:57
а покажи
dd if=/var/lib/postgresql/9.5/main/base/16385/16443 bs=8192 skip=92816 count=1 | hexdump -C | less
да, норм
должно их пролетать
вот таким макаром попробуй вычистить
не знаю, на сколько активно пользовалась эта таблица, может получится вручную зачистить все страницы

blkmrkt
14.12.2016
17:10:49
кстати тот первый файл который затирали, он выглядел обрезанным - текст комментария обрывался впритык к концу файла

Петр
14.12.2016
17:11:19
не понял

blkmrkt
14.12.2016
17:11:22
оно похоже зависло во время VACUUM FULL;

Петр
14.12.2016
17:11:29
ты имеешь ввиду страницу или файл?

blkmrkt
14.12.2016
17:12:02

Петр
14.12.2016
17:12:10
ну это страница, а не файл)

blkmrkt
14.12.2016
17:12:26
ох точно. страницы по 8192 байта?

Петр
14.12.2016
17:12:45
да

blkmrkt
14.12.2016
17:13:01
аа, мы не весь файл обнулили получается, ок

Петр
14.12.2016
17:13:40
конечно, тебе данные не нужны чтоли?))
только битую страницу затерли
по идее
ладно, давай пошерсти еще раз таблицу
можешь начать с ctid (92815,1)

blkmrkt
14.12.2016
17:13:56
а точно не существует утилиты для автоматизации этого безобразия?

Петр
14.12.2016
17:14:09
я такого не знаю
напиши, упало после страницы 92816 или до

blkmrkt
14.12.2016
17:15:00
ok

Google

blkmrkt
14.12.2016
17:15:21
упало на (92814,45) теперь

Петр
14.12.2016
17:15:56
как так?

blkmrkt
14.12.2016
17:16:06
эээ не знаю

Петр
14.12.2016
17:16:15
до этого же у тебя на 92815 падало
ошибка какая?

blkmrkt
14.12.2016
17:16:35
то же самое, timestamp out of range

Петр
14.12.2016
17:17:20
select ctid, * from comments where ctid='(92816,3)'
вот это падает?

blkmrkt
14.12.2016
17:17:44

Петр
14.12.2016
17:17:55
ну значит зачищено, до этого падало)

Admin
ERROR: S client not available

Петр
14.12.2016
17:18:13
в общем чисти таким макаром дальше
я откланиваюсь на этом

blkmrkt
14.12.2016
17:18:31

Петр
14.12.2016
17:19:52
нет, тут имени файла нет, это страница
имя файла у тебя 16443
смотрели же

blkmrkt
14.12.2016
17:20:25
а точно
а в доках не написано что там после запятой

Петр
14.12.2016
17:21:08
не написано?
странно, это строки должно быть

blkmrkt
14.12.2016
17:21:21
https://www.postgresql.org/docs/9.5/static/ddl-system-columns.html вот тут описание колонок

Петр
14.12.2016
17:21:27
надо перечитать

Google

blkmrkt
14.12.2016
17:22:24
а ок все, не буду мучать, нашел где почитать
вон сколько пейджей уже обнулил
92816
92814
92813
92812
92811
92812
92810
92809
92808
92807

Петр
14.12.2016
19:06:06
Напиши скрипт

blkmrkt
14.12.2016
19:06:21
хочу написать утилиту для этого, но хочу сперва узнать: почему нужно постгрес перезапускать? можно без перезапуска обойтись?

Петр
14.12.2016
19:07:08
Можно, если пг файл не держит/модифицирует, но лучше так не делать
Это не загадочные команды, просто вытаскивает по одной, и отключает пейджер, чтобы ты после каждой страницы кнопочку не нажимал
)
Попробуй скриптом сперва выявить все битые страницы, после затрешь

blkmrkt
14.12.2016
19:13:26

Петр
14.12.2016
19:13:55
Например

blkmrkt
14.12.2016
19:14:22
или может как-то узнать ctid min и max, и уже в рендже дергать записи

Петр
14.12.2016
19:14:26
Но тебе нужно выявить битые сначала
Да можешь по диапазонам проверять по 10000 например, как удобнее, так и делай

blkmrkt
14.12.2016
19:18:18
А тогда все понятно. Странно что в so/dba никто не ответил, вроде нормальное решение
Правда совсем неочевидно если не знаком с устройством движка

Петр
14.12.2016
19:26:12
Ты сейчас какую страницу последнюю затер?

blkmrkt
14.12.2016
19:29:38

Петр
14.12.2016
19:30:06
Проверь 92804 страницу
Прочти все строки из нее