Меню

Ошибка субд xx001 error invalid page in block

При нарушении целостности файловой системы сервера баз данных PostgreSQL, последний выдает “Ошибка СУБД” 1С, и часто сопровождается текстом, типа “ERROR: invalid page header in block ХХХХХ of relation base/ХХХХХ/ХХХХХ”.

Для начала надо выяснить в каких таблицах БД PostgreSQL возникает ошибка “ERROR: invalid page header in block…”. Для этого обращаемся к логам или пытаемся снять дамп базы данных, например подключившись к СУБД утилитой pgAdmin. Если возникает ошибка “Ошибка СУБД” в 1С, наверняка найдется хотя бы 1 испорченная таблица. В моем случае ошибка возникла при дампе public._inforg60691.

Для того, чтобы восстановить сломанную таблицу, выполним 3 запроса:
SET zero_damaged_pages = on;
VACUUM FULL public._inforg60691 ;
REINDEX TABLE public._inforg60691 ;

Далее пытаемся снять дамп базы данных, пока база не выгрузится без ошибок.

Следующим этапом исправления ошибки СУБД в 1С будет Тестирование и исправление базы в конфигураторе 1С. Для этого запускаем испорченную БД в конфигураторе. Через пункт Администрирование – Тестирование и исправление ИБ пробуем восстановить логическую целостность нашей базы. Обратите внимание, на галочки, выбранные на изображении.

Исправление БД в конфигураторе 1С

Хочу поделиться с вами моим первым успешным опытом восстановления полной работоспособности базы данных Postgres. С СУБД Postgres я познакомился пол года назад, до этого опыта администрирования баз данных у меня не было совсем.

Я работаю полу-DevOps инженером в крупной IT-компании. Наша компания занимается разработкой программного обеспечения для высоконагруженных сервисов, я же отвечаю за работоспособность, сопровождение и деплой. Передо мной поставили стандартную задачу: обновить приложение на одном сервере. Приложение написано на Django, во время обновления выполняются миграции (изменение структуры базы данных), и перед этим процессом мы снимаем полный дамп базы данных через стандартную программу pg_dump на всякий случай.

Во время снятия дампа возникла непредвиденная ошибка (версия Postgres – 9.5):

pg_dump: Oumping the contents of table “ws_log_smevlog” failed: PQgetResult() failed.
pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989
pg_dump: The command was: COPY public.ws_log_smevlog [...]
pg_dunp: [parallel archtver] a worker process dled unexpectedly

Ошибка «invalid page in block» говорит о проблемах на уровне файловой системы, что очень нехорошо. На различных форумах предлагали сделать FULL VACUUM с опцией zero_damaged_pages для решения данной проблемы. Что же, попрробеум…

Подготовка к восстановлению

ВНИМАНИЕ! Обязательно сделайте резервную копию Postgres перед любой попыткой восстановить базу данных. Если у вас виртуальная машина, остановите базу данных и сделайте снепшот. Если нет возможности сделать снепшот, остановите базу и скопируйте содержимое каталога Postgres (включая wal-файлы) в надёжное место. Главное в нашем деле – не сделать хуже. Прочтите это.

Поскольку в целом база у меня работала, я ограничился обычным дампом базы данных, но исключил таблицу с повреждёнными данными (опция -T, —exclude-table=TABLE в pg_dump).

Сервер был физическим, снять снепшот было невозможно. Бекап снят, двигаемся дальше.

Проверка файловой системы

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

В моём случае файловая система с базой данных была примонтирована в «/srv» и тип был ext4.

Останавливаем базу данных: systemctl stop postgresql@9.5-main.service и проверяем, что файловая система никем не используется и её можно отмонтировать с помощью команды lsof:
lsof +D /srv

Мне пришлось ещё остановить базу данных redis, так как она тоже исползовала «/srv». Далее я отмонтировал /srv (umount).

Проверка файловой системы была выполнена с помощью утилиты e2fsck с ключиком -f (Force checking even if filesystem is marked clean):

Далее с помощью утилиты dumpe2fs (sudo dumpe2fs /dev/mapper/gu2—sys-srv | grep checked) можно убедиться, что проверка действительно была произведена:

e2fsck говорит, что проблем на уровне файловой системы ext4 не найдено, а это значит, что можно продолжать попытки восстановить базу данных, а точнее вернуться к vacuum full (само собой, необходимо примонтирвоать файловую систему обратно и запустить базу данных).

Если у вас сервер физический, то обязательно проверьте состояние дисков (через smartctl -a /dev/XXX) либо RAID-контроллера, чтобы убедиться, что проблема не на аппаратном уровне. В моём случае RAID оказался «железный», поэтому я попросил местного админа проверить состояние RAID (сервер был в нескольких сотнях километров от меня). Он сказал, что ошибок нет, а это значит, что мы точно можем начать восстановление.

Попытка 1: zero_damaged_pages

Подключаемся к базе через psql аккаунтом, обладающим правами суперпользователя. Нам нужен именно суперпользователь, т.к. опцию zero_damaged_pages может менять только он. В моём случае это postgres:

psql -h 127.0.0.1 -U postgres -s [database_name]

Опция zero_damaged_pages нужна для того, чтобы проигнорировать ошибки чтения (с сайта postgrespro):

При выявлении повреждённого заголовка страницы Postgres Pro обычно сообщает об ошибке и прерывает текущую транзакцию. Если параметр zero_damaged_pages включён, вместо этого система выдаёт предупреждение, обнуляет повреждённую страницу в памяти и продолжает обработку. Это поведение разрушает данные, а именно все строки в повреждённой странице.

Включаем опцию и пробуем делать full vacuum таблицы:

VACUUM FULL VERBOSE


К сожалению, неудача.

Мы столкнулись с аналогичной ошибкой:

INFO: vacuuming "“public.ws_log_smevlog”
WARNING: invalid page in block 4123007 of relation base/16400/21396989; zeroing out page
ERROR: unexpected chunk number 573 (expected 565) for toast value 21648541 in pg_toast_106070

pg_toast – механизм хранения «длинных данных» в Postgres, если они не помещаются в одну страницу (по умолчанию 8кб).

Попытка 2: reindex

Первый совет из гугла не помог. После нескольких минут поиска я нашёл второй совет – сделать reindex повреждённой таблицы. Этот совет я встречал во многих местах, но он не внушал доверия. Сделаем reindex:

reindex table ws_log_smevlog

reindex завершился без проблем.

Однако это не помогло, VACUUM FULL аварийно завершался с аналогичной ошибкой. Поскольку я привык к неудачам, я стал искать советов в интернете дальше и наткнулся на довольно интересную статью.

Попытка 3: SELECT, LIMIT, OFFSET

В статье выше предлагали посмотреть таблицу построчно и удалить проблемные данные. Для начала необходимо было просмотреть все строки:

for ((i=0; i<"Number_of_rows_in_nodes"; i++ )); do psql -U "Username" "Database Name" -c "SELECT * FROM nodes LIMIT 1 offset $i" >/dev/null || echo $i; done

В моём случае таблица содержала 1 628 991 строк! По-хорошему необходимо было позаботиться о партициирвоании данных, но это тема для отдельного обсуждения. Была суббота, я запустил вот эту команду в tmux и пошёл спать:

for ((i=0; i<1628991; i++ )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog LIMIT 1 offset $i" >/dev/null || echo $i; done

К утру я решил проверить, как обстоят дела. К моему удивлению, я обнаружил, что за 20 часов было просканировано только 2% данных! Ждать 50 дней я не хотел. Очередной полный провал.

Но я не стал сдаваться. Мне стало интересно, почему же сканирование шло так долго. Из документации (опять на postgrespro) я узнал:

OFFSET указывает пропустить указанное число строк, прежде чем начать выдавать строки.
Если указано и OFFSET, и LIMIT, сначала система пропускает OFFSET строк, а затем начинает подсчитывать строки для ограничения LIMIT.

Применяя LIMIT, важно использовать также предложение ORDER BY, чтобы строки результата выдавались в определённом порядке. Иначе будут возвращаться непредсказуемые подмножества строк.

Очевидно, что вышенаписанная команда была ошибочной: во-первых, не было order by, результат мог получиться ошибочным. Во-вторых, Postgres сначала должен был просканировать и пропустить OFFSET-строк, и с возрастанием OFFSET производительность снижалась бы ещё сильнее.

Попытка 4: снять дамп в текстовом виде

Далее мне в голову пришла, казалось бы, гениальная идея: снять дамп в текстовом виде и проанализировать последнюю записанную строку.

Но для начала, ознакомимся со структурой таблицы ws_log_smevlog:

В нашем случае у нас есть столбец «id», который содержал уникальный идентификатор (счётчик) строки. План был такой:

  1. Начинаем снимать дамп в текстовом виде (в виде sql-команд)
  2. В определённый момент времени снятия дампа бы прервалось из-за ошибки, но тектовый файл всё равно сохранился бы на диске
  3. Смотрим конец текстового файла, тем самым мы находим идентификатор (id) последней строки, которая снялась успешно

Я начал снимать дамп в текстовом виде:

pg_dump -U my_user -d my_database -F p -t ws_log_smevlog -f ./my_dump.dump

Снятия дампа, как и ожидалось, прервался с той же самой ошибкой:

pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989

Далее через tail я просмотрел конец дампа (tail -5 ./my_dump.dump) обнаружил, что дамп прервался на строке с id 186 525. «Значит, проблема в строке с id 186 526, она битая, её и надо удалить!» – подумал я. Но, сделав запрос в базу данных:
«select * from ws_log_smevlog where id=186529» обнаружилось, что с этой строкой всё нормально… Строки с индексами 186 530 — 186 540 тоже работали без проблем. Очередная «гениальная идея» провалилась. Позже я понял, почему так произошло: при удаленииизменении данных из таблицы они не удаляются физически, а помечаются как «мёртвые кортежи», далее приходит autovacuum и помечает эти строки удалёнными и разрешает использовать эти строки повторно. Для понимания, если данные в таблице меняются и включён autovacuum, то они не хранятся последовательно.

Попытка 5: SELECT, FROM, WHERE id=

Неудачи делают нас сильнее. Не стоит никогда сдаваться, нужно идти до конца и верить в себя и свои возможности. Поэтому я решил попробовать ешё один вариант: просто просмотреть все записи в базе данных по одному. Зная структуру моей таблицы (см. выше), у нас есть поле id, которое является уникальным (первичным ключом). В таблице у нас 1 628 991 строк и id идут по порядку, а это значит, что мы можем просто перербрать их по одному:

for ((i=1; i<1628991; i=$((i+1)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done

Если кто не понимает, команда работает следующим образом: просматривает построчно таблицу и отправляет stdout в /dev/null, но если команда SELECT проваливается, то выводится текст ошибки (stderr отправляется в консоль) и выводится строка, содержащая ошибку (благодаря ||, которая означает, что у select возникли проблемы (код возврата команды не 0)).

Мне повезло, у меня были созданы индексы по полю id:

А это значит, что нахождение строки с нужным id не должен занимать много времени. В теории должно сработать. Что же, запускаем команду в tmux и идём спать.

К утру я обнаружил, что просмотрено около 90 000 записей, что составляет чуть более 5%. Отличный результат, если сравнивать с предыдущим способом (2%)! Но ждать 20 дней не хотелось…

Попытка 6: SELECT, FROM, WHERE id >= and id <

У заказчика под БД был выделен отличный сервер: двухпроцессорный Intel Xeon E5-2697 v2, в нашем расположении было целых 48 потоков! Нагрузка на сервере была средняя, мы без особых проблем могли забрать около 20-ти потоков. Оперативной памяти тоже было достаточно: аж 384 гигабайт!

Поэтому команду нужно было распараллелить:

for ((i=1; i<1628991; i=$((i+1)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done

Тут можно было написать красивый и элегантный скрипт, но я выбрал наиболее быстрый способ распараллеливания: разбить диапазон 0-1628991 вручную на интервалы по 100 000 записей и запустить отдельно 16 команд вида:

for ((i=N; i<M; i=$((i+1)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done

Но это не всё. По идее, подключение к базе данных тоже отнимает какое-то время и системные ресурсы. Подключать 1 628 991 было не очень разумно, согласитесь. Поэтому давайте при одном подключении извлекать 1000 строк вместо одной. В итоге команда преобразилоась в это:

for ((i=N; i<M; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done

Открываем 16 окон в сессии tmux и запускаем команды:

1) for ((i=0; i<100000; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
2) for ((i=100000; i<200000; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
…
15) for ((i=1400000; i<1500000; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
16) for ((i=1500000; i<1628991; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done

Через день я получил первые результаты! А именно (значения XXX и ZZZ уже не сохранились):

ERROR:  missing chunk number 0 for toast value 37837571 in pg_toast_106070
829000
ERROR:  missing chunk number 0 for toast value XXX in pg_toast_106070
829000
ERROR:  missing chunk number 0 for toast value ZZZ in pg_toast_106070
146000

Это значит, что у нас три строки содержат ошибку. id первой и второй проблемной записи находились между 829 000 и 830 000, id третьей – между 146 000 и 147 000. Далее нам предстояло просто найти точное значение id проблемных записей. Для этого просматриваем наш диапазон с проблемными записями с шагом 1 и идентифицируем id:

for ((i=829000; i<830000; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
829417
ERROR:  unexpected chunk number 2 (expected 0) for toast value 37837843 in pg_toast_106070
829449
for ((i=146000; i<147000; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
829417
ERROR:  unexpected chunk number ZZZ (expected 0) for toast value XXX in pg_toast_106070
146911

Счастливый финал

Мы нашли проблемные строки. Заходим в базу через psql и пробуем их удалить:

my_database=# delete from ws_log_smevlog where id=829417;
DELETE 1
my_database=# delete from ws_log_smevlog where id=829449;
DELETE 1
my_database=# delete from ws_log_smevlog where id=146911;
DELETE 1

К моему удивлению, записи удалились без каких-либо проблем даже без опции zero_damaged_pages.

Затем я подключился к базе, сделал VACUUM FULL (думаю делать было необязательно), и, наконец, успешно снял бекап с помощью pg_dump. Дамп снялся без каких либо ошибок! Проблему удалось решить таким вот тупейшим способом. Радости не было предела, после стольких неудач удалось найти решение!

Благодарности и заключение

Вот такой получился мой первый опыт восстановления реальной базы данных Postgres. Этот опыт я запомню надолго.

Ну и напоследок, хотел бы сказать спасибо компании PostgresPro за переведённую документацию на русский язык и за полностью бесплатные online-курсы, которые очень сильно помогли во время анализа проблемы.

This error has just started popping when I run queries against TABLE_A …….

ERROR: XX001: invalid page in block 38 of relation pg_tblspc/16402/PG_14_202107181/16404/125828

If I try a very simple query against the same table for example SELECT * FROM TABLE_A I get a similar error….

ERROR:  invalid memory alloc request size 18446744073709551613 
SQL state: XX000

Or another similar query select count(*) from TABLE_A gives me….

ERROR:  could not access status of transaction 917520
DETAIL:  Could not open file "pg_xact/0000": No such file or directory.
SQL state: 58P01

Based on this thread I tried this fix….

SET zero_damaged_pages = on;
VACUUM full TABLE_A;
REINDEX TABLE TABLE_A;

The 2nd command, VACUUM full TABLE_A produced another related error….

ERROR:  found xmax 16384 from before relfrozenxid 379279265 
SQL state: XX001

I think all these problems boil down to a simple case of file corruption at the OS level. I do have the ability to drop and re-create this table, but before I start I’d like to know if there’s a quicker/simpler solution, and if there’s any way of stopping this from happening again.


27 февраля 2019 г. 10:16

Django и Python



2461

На VDS одного из проектов который я поддерживаю и который крутится на моем хостере по умолчанию (firstvds) недавно произошел сбой.

Сбои на VDS сами по себе явления необычные, а тут прям все «колом встало». 

В результате разбора ситуации оказалось что сбойнула файловая система.

Файловую систему оживил но уперся в другую проблему. Postgres отказался запускаться и писал что-то типа:

Эту проблему решил довольно быстро командой:

root$ pg_resetxlog DATADIR

И перезапуском postgresql.

Но в результате получил сбои при работе с базой проекта, обусловленные «битыми» индексами в одной из таблиц базы.

Выражалось это при любых попытках манипуляций с базой, ошибками вида:

ERROR: invalid page header in block XXXXX of relation base/XXXXX/XXXXX

При попытке сделать резервную копию базы получил ошибку вида:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: invalid page header in block XXXXX of relation base/XXXXX/XXXXX
pg_dump: The command was: COPY public.samaged_table (column1, column2, column3, ...) TO stdout;

Решение данной проблемы нагуглил не сразу и уже готовился к сносу данных и восстановлению из резервных копий. 

Но случайно набрел на рекомендации от lxadm.com в следующем виде:

database=# SET zero_damaged_pages = on;
SET
database=# VACUUM FULL damaged_table;
WARNING: invalid page header in block 13748 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13749 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13757 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13758 of relation base/16995/67484; zeroing out page
(...)
WARNING: index "damaged_table_site_id" contains 14697831 row versions, but table contains 14709258 row versions
HINT: Rebuild the index with REINDEX.
WARNING: invalid page header in block 13762 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13816 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13817 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13818 of relation base/16995/67484; zeroing out page
(...)
WARNING: index "damaged_table_site_id" contains 14697498 row versions, but table contains 14709258 row versions
HINT: Rebuild the index with REINDEX.
VACUUM

database=# REINDEX TABLE damaged_table;

Все сработало и индексы в моём случае восстановились без потерь данных.


Description


Андрей Германов



2008-03-22 22:16:53 MSK

При выгрузке базы данных стандартными средствами 1С вылетает ошибка:

SQL State: XX001
Native: 7
Message: ERROR:  invalid page header in block 19641 of relation "sc2256"

Файл выгрузки не создается.

Содержимое лога Postgre SQL после этой ошибки:

LOG:  система была отключена: 2008-03-22 19:32:39 MSK
LOG:  контрольная точка: 8/C8617E00
LOG:  redo-запись: 8/C8617E00; undo-запись: 0/0; отключение: TRUE
LOG:  next transaction ID: 0/579962; next OID: 72130
LOG:  next MultiXactId: 1; next MultiXactOffset: 0
LOG:  система готова к использованию
WARNING:  nonstandard use of \ in a string literal на символе 75
ПОДСКАЗКА:  Use the escape string syntax for backslashes, e.g., E'\'.
WARNING:  nonstandard use of \ in a string literal на символе 110
ПОДСКАЗКА:  Use the escape string syntax for backslashes, e.g., E'\'.
ERROR:  статус транзакции 1900544 не доступен
ПОДРОБНОСТИ:  Could not open file "pg_clog/0001": Нет такого файла или каталога.
КОМАНДА:  FETCH FIRST IN dyn_cur_2997_028147D8
ERROR:  current transaction is aborted, commands ignored until end of transaction block
КОМАНДА:  CLOSE dyn_cur_2997_028147D8
ERROR:  current transaction is aborted, commands ignored until end of transaction block
КОМАНДА:  DECLARE dyn_cur_2997_028147D8 CURSOR WITH HOLD FOR SELECT * FROM SC2256 WHERE SP2259>='  C2   ECR   ' AND SUBSTR (SP2259, 1, 13)='  C2   ECR   ' ORDER BY SP2259, ROW_ID
ERROR:  current transaction is aborted, commands ignored until end of transaction block
КОМАНДА:  CLOSE dyn_cur_2997_026AB098
ERROR:  курсор "dyn_cur_2997_028147d8" не существует
КОМАНДА:  CLOSE dyn_cur_2997_028147D8
WARNING:  nonstandard use of \ in a string literal на символе 75
ПОДСКАЗКА:  Use the escape string syntax for backslashes, e.g., E'\'.
WARNING:  nonstandard use of \ in a string literal на символе 110
ПОДСКАЗКА:  Use the escape string syntax for backslashes, e.g., E'\'.
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  CLOSE dyn_cur_3007_0205DA98;DECLARE dyn_cur_3007_0205DA98 CURSOR WITH HOLD FOR SELECT * FROM _1SJOURN WHERE IDJOURNAL=409 AND DATE_TIME_IDDOC>=E'20080322     0     0   ' AND DATE_TIME_IDDOC<=E'20080322FHML6O     0   ' ORDER BY IDJOURNAL, DATE_TIME_IDDOC;MOVE LAST IN dyn_cur_3007_0205DA98;MOVE BACKWARD 0 IN dyn_cur_3007_0205DA98;
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH RELATIVE 0 IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH FIRST IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  CLOSE dyn_cur_3007_0205DA98;DECLARE dyn_cur_3007_0205DA98 CURSOR WITH HOLD FOR SELECT * FROM _1SJOURN WHERE IDJOURNAL=409 AND DATE_TIME_IDDOC>=E'20080322     0     0   ' AND DATE_TIME_IDDOC<=E'20080322FHML6O     0   ' ORDER BY IDJOURNAL, DATE_TIME_IDDOC;MOVE FORWARD 1 IN dyn_cur_3007_0205DA98;
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH RELATIVE 0 IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH FIRST IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  CLOSE dyn_cur_3007_0205DA98;DECLARE dyn_cur_3007_0205DA98 CURSOR WITH HOLD FOR SELECT * FROM _1SJOURN WHERE IDJOURNAL=409 AND DATE_TIME_IDDOC>=E'20080322     0     0   ' AND DATE_TIME_IDDOC<=E'20080322FHML6O     0   ' ORDER BY IDJOURNAL, DATE_TIME_IDDOC;MOVE FORWARD 1 IN dyn_cur_3007_0205DA98;
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH RELATIVE 0 IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH FIRST IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  CLOSE dyn_cur_3007_0205DA98;DECLARE dyn_cur_3007_0205DA98 CURSOR WITH HOLD FOR SELECT * FROM _1SJOURN WHERE IDJOURNAL=409 AND DATE_TIME_IDDOC>=E'20080322     0     0   ' AND DATE_TIME_IDDOC<=E'20080322FHML6O     0   ' ORDER BY IDJOURNAL, DATE_TIME_IDDOC;MOVE FORWARD 1 IN dyn_cur_3007_0205DA98;
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH RELATIVE 0 IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  CLOSE dyn_cur_3007_0205DA98;DECLARE dyn_cur_3007_0205DA98 CURSOR WITH HOLD FOR SELECT * FROM _1SJOURN WHERE IDJOURNAL=409 AND DATE_TIME_IDDOC>=E'20080322     0     0   ' AND DATE_TIME_IDDOC<=E'20080322FHML6O     0   ' ORDER BY IDJOURNAL, DATE_TIME_IDDOC;MOVE LAST IN dyn_cur_3007_0205DA98;MOVE BACKWARD -1 IN dyn_cur_3007_0205DA98;
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  FETCH RELATIVE 0 IN dyn_cur_3007_0205DA98
ERROR:  курсор "dyn_cur_3007_0205da98" не существует
КОМАНДА:  CLOSE dyn_cur_3007_0205DA98
ERROR:  invalid page header in block 3283 of relation "idd_sc2256"
КОМАНДА:  DECLARE dyn_cur_3018_020E3B08 CURSOR WITH HOLD FOR SELECT SC13.DESCR, RG99.SP4070, SC33.DESCR, SC33.PARENTID, RG99.SP101, SC31.DESCR, RG99.SP100, RG99.SP2269, 0, 0, RG99.SP2574, 0, 0, RG99.SP164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RG99.SP2270, SC3143.PARENTEXT, RG99.SP2847, SC2256.SP2259, 0, '     0   ', ' ', ' ', RG99.SP2269, RG99.SP2574, RG99.SP164 FROM RG99 LEFT OUTER JOIN SC13 ON RG99.SP4070=SC13.ID LEFT OUTER JOIN SC33 ON RG99.SP101=SC33.ID LEFT OUTER JOIN SC31 ON RG99.SP100=SC31.ID LEFT OUTER JOIN SC2256 ON RG99.SP2270=SC2256.ID LEFT OUTER JOIN SC3143 ON SC2256.SP3184=SC3143.ID WHERE PERIOD='20061201' AND (((RG99.SP4070='     1   ')))
ERROR:  курсор "dyn_cur_3018_020e3b08" не существует
КОМАНДА:  CLOSE dyn_cur_3018_020E3B08
ERROR:  invalid page header in block 3283 of relation "idd_sc2256"
КОМАНДА:  DECLARE dyn_cur_3389_02693210 CURSOR WITH HOLD FOR SELECT SC13.DESCR, RG99.SP4070, SC33.DESCR, SC33.PARENTID, RG99.SP101, SC31.DESCR, RG99.SP100, RG99.SP2269, 0, 0, RG99.SP2574, 0, 0, RG99.SP164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RG99.SP2270, SC3143.PARENTEXT, RG99.SP2847, SC2256.SP2259, 0, '     0   ', ' ', ' ', RG99.SP2269, RG99.SP2574, RG99.SP164 FROM RG99 LEFT OUTER JOIN SC13 ON RG99.SP4070=SC13.ID LEFT OUTER JOIN SC33 ON RG99.SP101=SC33.ID LEFT OUTER JOIN SC31 ON RG99.SP100=SC31.ID LEFT OUTER JOIN SC2256 ON RG99.SP2270=SC2256.ID LEFT OUTER JOIN SC3143 ON SC2256.SP3184=SC3143.ID WHERE PERIOD='20061201' AND (((RG99.SP4070='     1   ')))
ERROR:  курсор "dyn_cur_3389_02693210" не существует
КОМАНДА:  CLOSE dyn_cur_3389_02693210
NOTICE:  CREATE TABLE / PRIMARY KEY создаст подразумеваемый индекс "rgtemp0_pkey" для таблицы "rgtemp0"
NOTICE:  CREATE TABLE / PRIMARY KEY создаст подразумеваемый индекс "rgtemp0_pkey" для таблицы "rgtemp0"
NOTICE:  CREATE TABLE / PRIMARY KEY создаст подразумеваемый индекс "rgtemp0_pkey" для таблицы "rgtemp0"
ERROR:  invalid page header in block 19641 of relation "sc2256"
КОМАНДА:  DECLARE dyn_cur_3857_01C9A9B0 CURSOR WITH HOLD FOR SELECT * FROM SC2256 ORDER BY DESCR, ROW_ID
ERROR:  invalid page header in block 19641 of relation "sc2256"
КОМАНДА:  DECLARE dyn_cur_3885_01B765A8 CURSOR WITH HOLD FOR SELECT * FROM SC2256 ORDER BY DESCR, ROW_ID
ERROR:  invalid page header in block 19641 of relation "sc2256"
КОМАНДА:  DECLARE dyn_cur_4003_01CA4B28 SCROLL CURSOR WITH HOLD FOR SELECT * FROM SC2256 ORDER BY DESCR, ROW_ID
ERROR:  invalid page header in block 19641 of relation "sc2256"
КОМАНДА:  DECLARE dyn_cur_4042_01CA4B28 SCROLL CURSOR WITH HOLD FOR SELECT * FROM SC2256 ORDER BY DESCR, ROW_ID

Подобная ошибка возникает и при загрузке базы стандартными средствами 1С, а также при работе с базой: при формировании некоторых отчетов и при проведении некоторых документов (особенно при формировании отчетов за большой промежуток времени: за год или полтора года).


Comment 1


Андрей Германов



2008-03-23 19:18:18 MSK

Проблема "решилась" добавлением строки

zero_damaged_pages = true 

в файл postgresql.conf.

Не знаю пока, чего мне будет стоить добавление этого параметра, так что не считаю это решением проблемы. Но возможно это наведет на какие-то мысли по решению проблемы.

После этого загрузка и выгрузка происходит без ошибок, правда значительно дольше. База объемом в 2.2 GB загружается 5 часов, а выгружается более 9. В MS SQL все эти процедуры выполняются в течение часа.


Comment 3


Шильников Андрей



2008-10-21 15:19:29 MSD

Какие итоги? Может есть смысл использовать новую сборку и версию СУБД 8,2,4 или 8,2,9?


Comment 4


Андрей Германов



2008-10-21 16:04:20 MSD

(In reply to comment #3)
> Какие итоги? Может есть смысл использовать
> новую сборку и версию СУБД 8,2,4 или 8,2,9?
> 

В данный момент базы загружаются и выгружаются корректно с версией 8.2.4 .


Comment 5


Шильников Андрей



2008-10-21 16:09:52 MSD

(In reply to comment #4)
> (In reply to comment #3)
> > Какие итоги? Может есть смысл использовать
> > новую сборку и версию СУБД 8,2,4 или 8,2,9?
> > 
> 
> В данный момент базы загружаются и
> выгружаются корректно с версией 8.2.4 .

Отлично, багу закрываю. Ждите скоро релиза ;)

   John83

25.11.22 — 17:57

УТ 11.4  8.3.15.1534

Изначально крутится на postgreSQL.

Вечером делал обновление (буквально текст общего модуля поменял) и в этот момент сеанс оборвался. Запустил по новой и сразу сказал, что сеанс был прерван, обновить? Ответил да.

Обновился, но появилась ошибка типа

Ошибка СУБД: error: invalid page in block NNNNNNN of relatton base/NNNNN).

Так же крашится при открытии пользователя в конфигураторе.

Прогнал ТиИ — безрезультатно, выгрузил в файл, чекдбфл — так же.

Есть архив за пару дней до инцидента, там нет таких проблем.

Вижу пока вариант переносить новые документы в более старую работающую базу.

Или еще наткнулся на шаманство по типу

https://habr.com/ru/post/477248/

Может есть варианты по-проще?

   John83

1 — 25.11.22 — 18:06

win 64

   ДедМорроз

2 — 25.11.22 — 18:09

У вас есть побмтая база данных в postgres.

Что-то пытаться нужно делать с ней,а также понять,что произошло.

Вылетел сеанс — это не причина,а следствие.

   Trimax

3 — 25.11.22 — 18:22

(0) Была аналогичная ситуёвина.

Выгрузил в дт. Развернул на файловой. Заработала. Выгрузил в дт из файловой. Снес базу в постгрес. Создал заново. Загрузил файловый дт-шник. Все заработало.

ПыСы. Вычистил все кэши изначально.

   Trimax

4 — 25.11.22 — 18:27

+ (3) Наперед смотри проблемы с файловой системой и далее на проблемы с железом (жесткие диски)

   Hmster

5 — 25.11.22 — 20:10

(1) говорят таблицу с конфигом можно из бэкапа взять — если только модули менялись

   ДедМорроз

6 — 25.11.22 — 20:25

А диск,случаем,не ssd ?

   John83

7 — 25.11.22 — 22:21

(6) М.2 ssd самсунг

то ли 960 или 860

   Guk

8 — 25.11.22 — 22:23

никогда не понимал, а что движет людьми, которые разворачивают рабочую базу на постриг?…

   Тындр

9 — 25.11.22 — 23:16

(8) Я когда-то так сделал. Клиент не хотел лицензий мелко-мягких. Но косяки возникли практически сразу же, и пришлось ставить тот же MS SQL Express, благо все было в рамках ограничений

   vovastar

10 — 25.11.22 — 23:20

(8) https://habr.com/ru/company/vk/blog/248845/ а тут наоборот, ставят постгри на уровень выше.

   Тындр

11 — 25.11.22 — 23:31

(10) Это прекрасно. Но в отличии от ВК, в 1С наиболее проработали и протестировали (освоили короче) вариант с MS SQL. А простые 1С-ники, в отличии от программистов ВК, могут только попытаться зарегистрировать ошибку в 1С.

ВК делает для себя, 1С — для всех.

Для 1с важно, чтобы было к кому обратиться (кроме себя) в случае возникновения ошибок с СУБД (так было, как минимум, до 2022 — сейчас я не уверен).

В общем, неоднозначно все. Я постгри лет пять уже даже не пытался использовать.

Но, тут появились новые веяния, и уход от буржуйских технологий может быть востребован и окупаться.

   МимохожийОднако

12 — 26.11.22 — 00:55

До сих пор не понял каким образом делался архив до манипуляций с базой. При нормальном архиве, как я понимаю, ветки бы не было

   John83

13 — 26.11.22 — 12:56

(12) архив в dt

перед самим обновлением, не делался

   lubitelxml

14 — 26.11.22 — 15:05

(13) Люди делятся на два вида: те, кто не делает бэкапы, и те, кто уже делает. (С) не мое

   lubitelxml

15 — 26.11.22 — 15:05

ИМХО постгря зло

   John83

16 — 26.11.22 — 15:24

(14) т.е. ты даже перед каждым обновлением (пусть даже модуль поменял), делаешь архив?

   GANR

17 — 26.11.22 — 15:37

   GANR

18 — 26.11.22 — 15:38

(8) постгрес бесплатный, на лицензиях экономия

   Krendel

19 — 26.11.22 — 17:10

(8) а с этим когда то были проблемы? Такая же работа как с мсом или ораклом

   Garykom

20 — 26.11.22 — 17:11

(19) Надо признать что PostgreSQL под Windows это легкий изврат в т.ч. с 1С

Вот под Linux оно супер

   Guk

21 — 26.11.22 — 18:38

(19) на виндовых серверах, судя по веткам на мисте, это всегда проблема…

   dmpl

22 — 28.11.22 — 07:14

(16) Именно. При этом надо периодически проверять разворачиваемость бэкапов 😉

   Bigbro

23 — 28.11.22 — 07:18

(14) и тех кто проверяет работоспособность бэкапов ))))

   Seriy_Volk

24 — 28.11.22 — 07:38

(0) настроить технологический журнал и глянуть, на запросе к какой таблице падает платформа. Далее в зависимости, что за таблица является проблемной — починить запросом/заменить корректной из бэкапа и т.п.

   John83

25 — 05.12.22 — 23:08

(17) полезная ссылочка, спасибо!

при вакууме ругается на такую таблицу _inforg20355_2, но ее в структуре БД не вижу, есть только _inforg20355 (регистр сведений).

Это как?

   timurhv

26 — 05.12.22 — 23:09

(25) Это индексы

  

John83

27 — 05.12.22 — 23:10

(26) реиндексировать?

Мы настроили базу данных postgresql 11 в системе. Около 8 столов. Через несколько дней мы сталкиваемся с этой проблемой

ERROR: invalid page in block 9698 of relation base/16385/16560 SQL state: XX001

Согласно моим исследованиям, мы должны установить set zero_damaged_pages=on;, чтобы решить эту проблему. Мы установили и выполнили несколько запросов на выборку, которые отлично работают. Тогда мы решили сделать резервную копию этой базы данных через pg_dump. Это задание не было успешно завершено, но были скопированы все записи.

Теперь, в новой системе, мы импортировали резервную копию, мы узнали, что схема базы данных не скопирована здесь должным образом, из-за чего произошло дублирование данных. Мы повторили это с другой базой данных, которая была в порядке. Все работает нормально, включая восстановление.

Наконец, я пришел к выводу, что из-за ошибки в блоке страницы резервная копия базы данных не была должным образом скопирована. Есть ли такая опция, как set zero_damaged_pages=on; в pg_dump, чтобы игнорировать страницу с ошибкой, но завершить возврат или любое другое решение.

1 ответ

Это не способ «исправить» поврежденные данные, это просто способ сохранить то, что осталось.

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

  1. найти имя таблицы из описания ошибки — например, в pg_dump: The command was: COPY foo.some_table (col1, col2, col3) TO stdout; это foo.some_table

  2. запустите psql от имени pgadmin в базе данных, которую вы пытались сбросить (скажем, my_cool_db):

    $ sudo su - postgres
    psql my_cool_db
    
  3. «исправить» битые страницы:

    my_cool_db=# SET zero_damaged_pages = on;
    SET
    my_cool_db=# VACUUM FULL foo.some_table;
    WARNING:  invalid page in block 54809 of relation base/48461770/48462009; zeroing out page
    WARNING:  invalid page in block 54810 of relation base/48461770/48462009; zeroing out page
    ...
    VACUUM
    my_cool_db=# REINDEX TABLE foo.some_table;
    
  4. выйти из psql и выйти из pgadmin

  5. сбросьте свою базу данных (или повторите для других сломанных таблиц)

Источник. /а>


4

Jan Spurny
19 Апр 2022 в 17:40

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка субд xx001 error could not read block
  • Ошибка субд xx000 error variable not found in subplan target list