@pgsql

Страница 191 из 1062
Петр
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)'; падает?

Петр
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
посмотри все записи, там есть та строка последняя, на которой упало?

Петр
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
неа, только на той

blkmrkt
14.12.2016
17:07:19
это на запрос select ctid, * from comments where ctid='(92816,3)':
MultiXactId 3036690260 does no longer exist — apparent wraparound

Петр
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
упало на (92814,45) теперь
получается что 92814 это имя файла, а 45 это номер страницы?

Петр
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
получается что 92814 это имя файла, а 45 это номер страницы?
то есть чтоб узнать какой оффсет задавать dd для заполнения нулями, нужно умножить 92814 на блоксайз? там с 0 или с 1 нумерация страниц?

а ок все, не буду мучать, нашел где почитать

вон сколько пейджей уже обнулил 92816 92814 92813 92812 92811 92812 92810 92809 92808 92807

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

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

\set FETCH_COUNT 1 \pset pager off select ctid,colmn1,...,columnN from comments;
и там были какие-то загадочные команды

Петр
14.12.2016
19:07:08
Можно, если пг файл не держит/модифицирует, но лучше так не делать

Это не загадочные команды, просто вытаскивает по одной, и отключает пейджер, чтобы ты после каждой страницы кнопочку не нажимал

)

Попробуй скриптом сперва выявить все битые страницы, после затрешь

blkmrkt
14.12.2016
19:13:26
Попробуй скриптом сперва выявить все битые страницы, после затрешь
да так наверное проще. а каким образом можно скипать эти битые страницы? WHERE ctid NOT IN (...)?

Петр
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
Ты сейчас какую страницу последнюю затер?

вон сколько пейджей уже обнулил 92816 92814 92813 92812 92811 92812 92810 92809 92808 92807
Проверь, все ли строки 92805 читаются, что-то подозрительно, не партачится ли там предыдущая страница

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

Прочти все строки из нее

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