Хочу поделиться с вами моим первым успешным опытом восстановления полной работоспособности базы данных 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», который содержал уникальный идентификатор (счётчик) строки. План был такой:
- Начинаем снимать дамп в текстовом виде (в виде sql-команд)
- В определённый момент времени снятия дампа бы прервалось из-за ошибки, но тектовый файл всё равно сохранился бы на диске
- Смотрим конец текстового файла, тем самым мы находим идентификатор (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-курсы, которые очень сильно помогли во время анализа проблемы.
I’m trying to backup up an entire postgres database and restore it properly, however I am seeing a list of errors when trying to restore the backup.
I am using pg_dump to create a backup sql file. (I have a .pgpass file for password)
sudo -u postgres pg_dump -d db-w > backup.sql
When I try to restore the database with:
sudo -u postgres psql db < backup.sql
I get a list of errors like:
ERROR: duplicate key value violates unique constraint
ERROR: multiple primary keys for table
ERROR: relation <relation> already exists
ERROR: trigger <trigger> for relation <relation> already exist
I haven’t made any changes to the database. I simply performed a backup and restore the backup right after.
What am I doing wrong?
asked Dec 7, 2016 at 19:55
![]()
1
your restoring on an existing database, if you want and sure to replace database with the backup you can use option —clean and —create
-c, —clean
Clean (drop) database objects before recreating them. (This might
generate some harmless error messages, if any objects were not
present in the destination database.)-C, —create
Create the database before restoring into it. If —clean is also
specified, drop and recreate the target database before connecting
to it.
answered Dec 7, 2016 at 21:47
2
I’m trying to backup up an entire postgres database and restore it properly, however I am seeing a list of errors when trying to restore the backup.
I am using pg_dump to create a backup sql file. (I have a .pgpass file for password)
sudo -u postgres pg_dump -d db-w > backup.sql
When I try to restore the database with:
sudo -u postgres psql db < backup.sql
I get a list of errors like:
ERROR: duplicate key value violates unique constraint
ERROR: multiple primary keys for table
ERROR: relation <relation> already exists
ERROR: trigger <trigger> for relation <relation> already exist
I haven’t made any changes to the database. I simply performed a backup and restore the backup right after.
What am I doing wrong?
asked Dec 7, 2016 at 19:55
![]()
1
your restoring on an existing database, if you want and sure to replace database with the backup you can use option —clean and —create
-c, —clean
Clean (drop) database objects before recreating them. (This might
generate some harmless error messages, if any objects were not
present in the destination database.)-C, —create
Create the database before restoring into it. If —clean is also
specified, drop and recreate the target database before connecting
to it.
answered Dec 7, 2016 at 21:47
2
I’m taking an intro to SQL course and I can’t get my very first database loaded. I have a file dvdrental.tar, I create a new database dvdrental > right click > Restore > Select File > Pick «Data» under Restore options, and I get the error below.
I’m on Mac OSX and the pgAmin instance is being loaded in Chrome if that helps. I’ve tried deleting and re-adding the database twice and I still get the same error. I also tried reinstalling pgAdmin and fully reinstalling postgresql including removing the user account. I just tried doing it on a fresh install in a Windows environment and I get the exact same error.
I’ve also completely rebooted the computer several times since then. I also just verified that other tar files and a sql file aren’t working.


Here’s the full error, I have no idea what any of it means, as I’m brand new to SQL and just setting it up:
/Library/PostgreSQL/10/bin/pg_restore --host "localhost" --port "5432" --username "postgres" --no-password --dbname "dvdrental" --section=data --verbose "/Users/chasehippen/Downloads/Postgresql/dvdrental.tar"
pg_restore: connecting to database for restore
pg_restore: implied data-only restore
pg_restore: processing data for table "public.actor"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2610; 0 16430 TABLE DATA actor postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "actor" does not exist
Command was: COPY actor (actor_id, first_name, last_name, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET actor_actor_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2643; 0 0 SEQUENCE SET actor_actor_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "actor_actor_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('actor_actor_id_seq', 200, true);
^
Command was: SELECT pg_catalog.setval('actor_actor_id_seq', 200, true);
pg_restore: processing data for table "public.address"
pg_restore: [archiver (db)] Error from TOC entry 2618; 0 16471 TABLE DATA address postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "address" does not exist
Command was: COPY address (address_id, address, address2, district, city_id, postal_code, phone, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET address_address_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2644; 0 0 SEQUENCE SET address_address_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "address_address_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('address_address_id_seq', 605, true...
^
Command was: SELECT pg_catalog.setval('address_address_id_seq', 605, true);
pg_restore: processing data for table "public.category"
pg_restore: [archiver (db)] Error from TOC entry 2612; 0 16437 TABLE DATA category postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "category" does not exist
Command was: COPY category (category_id, name, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET category_category_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2645; 0 0 SEQUENCE SET category_category_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "category_category_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('category_category_id_seq', 16, tru...
^
Command was: SELECT pg_catalog.setval('category_category_id_seq', 16, true);
pg_restore: processing data for table "public.city"
pg_restore: [archiver (db)] Error from TOC entry 2620; 0 16478 TABLE DATA city postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "city" does not exist
Command was: COPY city (city_id, city, country_id, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET city_city_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2646; 0 0 SEQUENCE SET city_city_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "city_city_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('city_city_id_seq', 600, true);
^
Command was: SELECT pg_catalog.setval('city_city_id_seq', 600, true);
pg_restore: processing data for table "public.country"
pg_restore: [archiver (db)] Error from TOC entry 2622; 0 16485 TABLE DATA country postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "country" does not exist
Command was: COPY country (country_id, country, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET country_country_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2647; 0 0 SEQUENCE SET country_country_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "country_country_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('country_country_id_seq', 109, true...
^
Command was: SELECT pg_catalog.setval('country_country_id_seq', 109, true);
pg_restore: processing data for table "public.customer"
pg_restore: [archiver (db)] Error from TOC entry 2608; 0 16419 TABLE DATA customer postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "customer" does not exist
Command was: COPY customer (customer_id, store_id, first_name, last_name, email, address_id, activebool, create_date, last_update, active) FROM stdin;
pg_restore: executing SEQUENCE SET customer_customer_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2648; 0 0 SEQUENCE SET customer_customer_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "customer_customer_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('customer_customer_id_seq', 599, tr...
^
Command was: SELECT pg_catalog.setval('customer_customer_id_seq', 599, true);
pg_restore: processing data for table "public.film"
pg_restore: [archiver (db)] Error from TOC entry 2614; 0 16444 TABLE DATA film postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "film" does not exist
Command was: COPY film (film_id, title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, last_update, special_features, fulltext) FROM stdin;
pg_restore: processing data for table "public.film_actor"
pg_restore: [archiver (db)] Error from TOC entry 2615; 0 16456 TABLE DATA film_actor postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "film_actor" does not exist
Command was: COPY film_actor (actor_id, film_id, last_update) FROM stdin;
pg_restore: processing data for table "public.film_category"
pg_restore: [archiver (db)] Error from TOC entry 2616; 0 16460 TABLE DATA film_category postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "film_category" does not exist
Command was: COPY film_category (film_id, category_id, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET film_film_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2649; 0 0 SEQUENCE SET film_film_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "film_film_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('film_film_id_seq', 1000, true);
^
Command was: SELECT pg_catalog.setval('film_film_id_seq', 1000, true);
pg_restore: processing data for table "public.inventory"
pg_restore: [archiver (db)] Error from TOC entry 2624; 0 16502 TABLE DATA inventory postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "inventory" does not exist
Command was: COPY inventory (inventory_id, film_id, store_id, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET inventory_inventory_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2650; 0 0 SEQUENCE SET inventory_inventory_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "inventory_inventory_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('inventory_inventory_id_seq', 4581,...
^
Command was: SELECT pg_catalog.setval('inventory_inventory_id_seq', 4581, true);
pg_restore: processing data for table "public.language"
pg_restore: [archiver (db)] Error from TOC entry 2626; 0 16509 TABLE DATA language postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "language" does not exist
Command was: COPY language (language_id, name, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET language_language_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2651; 0 0 SEQUENCE SET language_language_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "language_language_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('language_language_id_seq', 6, true...
^
Command was: SELECT pg_catalog.setval('language_language_id_seq', 6, true);
pg_restore: processing data for table "public.payment"
pg_restore: [archiver (db)] Error from TOC entry 2628; 0 16521 TABLE DATA payment postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "payment" does not exist
Command was: COPY payment (payment_id, customer_id, staff_id, rental_id, amount, payment_date) FROM stdin;
pg_restore: executing SEQUENCE SET payment_payment_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2652; 0 0 SEQUENCE SET payment_payment_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "payment_payment_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('payment_payment_id_seq', 32098, tr...
^
Command was: SELECT pg_catalog.setval('payment_payment_id_seq', 32098, true);
pg_restore: processing data for table "public.rental"
pg_restore: [archiver (db)] Error from TOC entry 2630; 0 16527 TABLE DATA rental postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "rental" does not exist
Command was: COPY rental (rental_id, rental_date, inventory_id, customer_id, return_date, staff_id, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET rental_rental_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2653; 0 0 SEQUENCE SET rental_rental_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "rental_rental_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('rental_rental_id_seq', 16049, true...
^
Command was: SELECT pg_catalog.setval('rental_rental_id_seq', 16049, true);
pg_restore: processing data for table "public.staff"
pg_restore: [archiver (db)] Error from TOC entry 2632; 0 16539 TABLE DATA staff postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "staff" does not exist
Command was: COPY staff (staff_id, first_name, last_name, address_id, email, store_id, active, username, password, last_update, picture) FROM stdin;
pg_restore: executing SEQUENCE SET staff_staff_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2654; 0 0 SEQUENCE SET staff_staff_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "staff_staff_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('staff_staff_id_seq', 2, true);
^
Command was: SELECT pg_catalog.setval('staff_staff_id_seq', 2, true);
pg_restore: processing data for table "public.store"
pg_restore: [archiver (db)] Error from TOC entry 2634; 0 16550 TABLE DATA store postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "store" does not exist
Command was: COPY store (store_id, manager_staff_id, address_id, last_update) FROM stdin;
pg_restore: executing SEQUENCE SET store_store_id_seq
pg_restore: [archiver (db)] Error from TOC entry 2655; 0 0 SEQUENCE SET store_store_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "store_store_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('store_store_id_seq', 2, true);
^
Command was: SELECT pg_catalog.setval('store_store_id_seq', 2, true);
WARNING: errors ignored on restore: 28
I have a Postgres 8.4 database on a linux server that I have dumped using the following command:
pg_dump --format=c --exclude-table=log --file=/path/to/output my_db
I then ftp the created file to my local Windows 7 machine and attempt to restore the file to my local Postgres 8.4 instance using the following command:
pg_restore --create --exit-on-error --verbose c:pathtofile
The restore command generates plenty of output claiming it created my database, connected to it, and then created all the other tables as expected. However, when I view the databases on my local machine through pgAdmin the restored database doesn’t exist at all.
In an attempt to troubleshoot I tried the following command:
pg_restore --create --exit-on-error --verbose --host=blahblah --username=no_one c:pathtofile
When I run this command even though the host and username given are complete nonsense I still get the exact same output from the command without any errors.
Has anyone run into this before or know what could by causing this?
Postgresql ошибки при восстановлении
Модератор: Дмитрий Юхтимовский
Postgresql ошибки при восстановлении
Доброго времени суток!
Прошу не пинать сильно и сразу, тк с postgre работаю не так давно.
Есть кластер 1С , база крутится на postgresql
Каждый день делается бэкап :
pg_dump -U postgres -Fc -Z9 -v -f ${BACKUPDIR}/${YEAR}/${MONTH}/${DAY}/${DB_NAME}.gz ${DB_NAME} &>> $BACKUPDIR/$YEAR/$MONTH/$DAY/log
При восстановлении базы из бэкапа
sudo -H -u postgres /usr/bin/pg_restore -i -U postgres -d BASE -v /PATH/TO/BACKUPDIR
вылазиют ошибки
WARNING: errors ignored on restore: 1886
1С при том запускается но со сл ошибками:
скрины ошибок во вложеннии
- Вложения
-
- 1c_restore_errorrr.jpg (29.05 KiB) Просмотров: 6333
-
- 1c_restore_error.jpg (241.69 KiB) Просмотров: 6333
- redbull05689
- Сообщений: 3
- Зарегистрирован: 16 сен 2015, 13:48
Re: Postgresql ошибки при восстановлении
Slynko Alexey » 16 сен 2015, 17:18
1) Огласите версию PostgreSQL
2) Хорошо бы увидеть все, что выводит pg_restore
3) Попробуйте pg_restore с ключиком -c
- Slynko Alexey
- Сообщений: 1
- Зарегистрирован: 16 сен 2015, 17:18
Re: Postgresql ошибки при восстановлении
Гилёв Вячеслав » 16 сен 2015, 17:58
redbull05689 писал(а): вылазиют ошибки
WARNING: errors ignored on restore: 18861С при том запускается но со сл ошибками:
скрины ошибок во вложеннии
логично, что 1С в шоке
надо разобраться в чем проблема при восстановлении
выложите результаты сообщений в >logs.txt
- Гилёв Вячеслав
- Сообщений: 2543
- Зарегистрирован: 11 фев 2013, 15:40
- Откуда: Россия, Москва
Re: Postgresql ошибки при восстановлении
Dmitry Vasiliyev » 16 сен 2015, 19:53
Скорее всего вы сдампили данные с postgresql-1c а пытаетесь возможно востановить данные на postgresql без 1c патчей: pg_restore у вас прошел, а 1c приложение падает, так как не может найти указаный тип (mvchar который создается во время создания базы).
Не могли бы вы: востановить дамп заново и прислать вывод в консоли всех комманд которые вы выполняли,
(если у вас bash), то можете добавить в командную строчку востановления: &> /tmp/log.txt и прислать содержимое файла /tmp/log.txt
- Dmitry Vasiliyev
- Сообщений: 9
- Зарегистрирован: 16 сен 2015, 19:45
Re: Postgresql ошибки при восстановлении
redbull05689 » 17 сен 2015, 09:03
Спасибо всем откликнувшимся
Версия
postgresql-9.1
Попробовал восстановить с ключем -с
sudo -H -u postgres /usr/bin/pg_restore -c -i -U postgres -d kop_bakkagenko_1709 -v /DB/reserv/2015/Сен/17/baklagenko.gz &> /tmp/log.txt
ну и собственно лог
- redbull05689
- Сообщений: 3
- Зарегистрирован: 16 сен 2015, 13:48
Re: Postgresql ошибки при восстановлении
Гилёв Вячеслав » 17 сен 2015, 10:17
redbull05689 писал(а):ну и собственно лог
выложите пожалуйста лог на какой-нибудь яндекс-диск и киньте сюда пожалуйста ссылку
- Гилёв Вячеслав
- Сообщений: 2543
- Зарегистрирован: 11 фев 2013, 15:40
- Откуда: Россия, Москва
Re: Postgresql ошибки при восстановлении
Dmitry Vasiliyev » 17 сен 2015, 10:38
К сожалению, 9.1 — это очень старая версия. Поддержка 9.2 со стороны сообщества например заканчивается в сентябре, если я не ошибаюсь.
И да, к сожалению, не получиться воспользоваться версией старыми данными и новым сервером, для этого нужно воспользоваться утилитой pg_upgrade.
Наша компания постепенно переводит документацию по PostgreSQL на русский:
http://postgrespro.ru/doc
Как я понял, ее давно не актуализировали, в течении дня попрошу выложить свежую версию, возможно там уже будет про backup/restore и pg_upgrade
- Dmitry Vasiliyev
- Сообщений: 9
- Зарегистрирован: 16 сен 2015, 19:45
Re: Postgresql ошибки при восстановлении
Dmitry Vasiliyev » 17 сен 2015, 18:25
попробуйте сделать так:
sudo -H -u postgres /usr/bin/dropdb -c -i -U postgres kop_bakkagenko_1709
sudo -H -u postgres /usr/bin/pg_restore -c -i -U postgres -d kop_bakkagenko_1709 -v /DB/reserv/2015/Сен/17/baklagenko.gz &> /tmp/log.txt
- Dmitry Vasiliyev
- Сообщений: 9
- Зарегистрирован: 16 сен 2015, 19:45
Вернуться в Прочее
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Ошибка формата потока — одна из самых неприятных ошибок в работе 1С и вызывает панический ужас у многих администраторов и пользователей данной учетной системы. Ее появление обычно говорит о серьезных повреждениях базы данных и, чаще всего, наиболее верным решением будет восстановить базу из резервной копии. В случаях, когда это нежелательно или невозможно придется заняться восстановлением базы, но большинство инструкций в сети рассматривают данный вопрос только на примере MS SQL Server, а PostgreSQL если и касаются, то очень вскользь. Поэтому в данной статье мы постараемся исправить данный пробел.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Начнем с того, что именно обозначает эта ошибка. Разработчики немногословны, никаких подробностей сообщение об ошибке не содержит:

Столь же скупа и информация для технической поддержки:
Обычно это вызывает у пользователей и неподготовленных администраторов тихую панику, особенно если под рукой нет актуальной резервной копии. А судорожные попытки восстановления базы, обычно без понимания смысла выполняемых действий приводят как правило к ее полному разрушению.
К возникновению данной ошибки приводит повреждение основной конфигурации информационной базы. Реже — кеша конфигурации информационной базы, в последнем случае устранить ошибку можно путем очистки кеша, для этого можете воспользоваться нашей утилитой 1:Tools (кто хочет поддержать нас — может скачать ее по ссылке с Инфостарта)
1:Tools (Зеркало на Инфостарте)
MD5: 448277422B59EFA426CC51E4F3A52F53
В остальных случаях придется заниматься восстановлением непосредственно базы. В этом месте мы сразу внесем ясность и разделим сущности: информационная база 1С — это хранилище данных на уровне логики 1С:Предприятия которое описывается конфигурацией информационной базы. Т.е. именно здесь содержатся документы, справочники, регистры и т.д. и т.п., а повреждение конфигурации информационной базы делает невозможной работу с ними на этом уровне абстракции. База данных СУБД — это набор таблиц в которых хранятся как данные, так и конфигурация информационной базы 1С.
Повреждение основной конфигурации информационной базы происходит именно на уровне логики 1С:Предприятия, база данных СУБД остается работоспособной и не содержит ошибок с точки зрения СУБД. Если это не так, то мы будем иметь дело с повреждением самой базы данных СУБД, а это уже совсем иная ситуация.
В зависимости от того, какая именно часть конфигурации ИБ оказалась повреждена база может не загружаться в обычном режиме, но загружаться в Конфигуратор, либо вообще не загружаться никак. Если доступен режим конфигуратора, то можно попробовать снять базу с поддержки и загрузить в нее исправную конфигурацию из файла, в некоторых случаях это приведет к успеху, в других может потребоваться сначала выявить и удалить сбойный элемент метаданных.
Все это достаточно сложно и не всегда приносит требуемый результат, поэтому проще и надежнее заменить конфигурацию информационной базы на заведомо исправную используя инструменты СУБД, в нашем случае PostgreSQL. В зависимости от используемой ОС (Windows или Linux) некоторые аспекты работы с PostgreSQL могут отличаться и это будет оговорено отдельно, в остальных случаях указанные команды применяются вне зависимости от платформы.
Перед тем как начинать работу с PostgreSQL в Linuх последовательно повысим свои права для суперпользователя и затем войдем в систему от имени пользователя postgres:
sudo -s
su postgres
Если утилита sudo не установлена (такой вариант может быть в Debian), то:
su -
su postgres
В первом случае вам потребуется ввести пароль от текущей учетной записи, во втором — от учетной записи суперпользователя (root).
Затем обязательно сделаем копию информационной базы средствами СУБД. Получить список баз данных в кластере СУБД можно командой:
psql -l
В Windows вам потребуется ввести пароль пользователя postgres.
Выяснив имя необходимой базы данных выгрузим ее дамп командой:
#Linux
pg_dump basename > ~/basename.psql#Windows
pg_dump basename > D:backupbasename.psql
Где basename — имя нужной базы данных. Обратите внимание, что в Windows мы можем явно задать путь выгрузки дампа, а в Linux выгружаем его в домашнюю директорию пользователя postgres, т.е. /var/lib/postgresql.
Для дальнейших действий нам потребуется развернуть на этом же сервере СУБД еще одну базу с точно такой же конфигурацией информационной базы, это может быть как старый бекап поврежденной базы, так и другая база такой же конфигурации, чистая установка или демо база. Главное, чтобы конфигурация новой базы с точностью до релиза совпадала с конфигурацией поврежденной.
После чего откроем интерактивный терминал PostgreSQL в котором будем производить все последующие действия:
psql
В Windows вы можете получить сообщение:
ПРЕДУПРЕЖДЕНИЕ: Кодовая страница консоли (866) отличается от основной
страницы Windows (1251).
8-битовые (русские) символы могут отображаться некорректно.
В этом случае выполните:
! chcp 1251
Теперь подключимся к исправной базе:
с newbasename
где newbasename — имя исправной базы данных. При этом в строке приглашения появится имя подключенной базы.
Из нее мы выгрузим таблицу config в которой находится основная конфигурация информационной базы.
#Linux
COPY config TO '/var/lib/postgresql/config_OK.txt';#Windows
COPY config TO 'D:/backup/config_OK.txt';
Обратите внимание, при указании пути для операционной системы Windows вы также должны использовать прямой, а не обратный слеш. Также служба СУБД должна иметь права на запись в целевую аудиторию, проще всего это сделать выдав полные разрешения для пользователя Все.
Переподключимся к поврежденной базе:
с basename
На всякий случай, также сохраним содержимое таблицы config:
#Linux
COPY config TO '/var/lib/postgresql/config_ERR.txt';#Windows
COPY config TO 'D:/backup/config_ERR.txt';
После чего очистим сбойную таблицу:
DELETE FROM config;
И загрузим в нее данные из исправной информационной базы:
#Linux
COPY config FROM '/var/lib/postgresql/config_OK.txt';#Windows
COPY config FROM 'D:/backup/config_OK.txt';
Для выхода из терминала PostgreSQL введите:
q
Если все сделано правильно, то поврежденная конфигурация информационной базы будет заменена на исправную и ее работоспособность будет восстановлена.
В некоторых случаях оказывается повреждена не основная конфигурация информационной базы, а конфигурация, открытая на редактирование в Конфигураторе. Внешне это проявляется как невозможность загрузить информационную базу в этом режиме. Для исправления этой ошибки достаточно очистить таблицу configsave:
DELETE FROM configsave;
Как видим, устранение ошибки формата потока средствами СУБД PostgreSQL достаточно несложно, однако требует некоторых навыков работы с данной СУБД. Но если вы будете внимательно и вдумчиво следовать нашей инструкции, то проблем у вас возникнуть не должно.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
17.09.12 — 19:09
Добрый вечер. на Win Server 2003 установлен сервер 1с, PostgreSQL.
Делаются резервные копии каждый день. Но столкнулся с проблемой. необходимо восстановить базу на определенное число, а он при восстановлении выдает кучу ошибок на то что таблица существует, метод существует и тд , невозможно перезаписать. и в итоге Процесс вернул код выхода 1.
Соответсвенно в пустую базу он ничего не восстанавливает, она остается пустой. пробовал как создавать новую базу из управления серверами 1с, так и средствами postgres.
1 — 17.09.12 — 19:12
бэкап делается по команде
«C:Program Files (x86)PostgreSQL8.4.3-3.1Cbinpg_dump.exe» -i -h localhost -p 5432 -U postgres -Fc -b -f «F:postgres_backup%datetemp%.backup» Base
Восстанавливать пробовал из PgAdmin и командой
«C:Program Files (x86)PostgreSQL8.4.3-3.1Cbinpg_restore.exe» -i -h localhost -U postgres -c -d BuhTemp «F:postgres_backupBUHBUH_120803.backup»
2 — 17.09.12 — 19:37
Base сначала очистить надо. Или удалить, а потом — опять создать.
3 — 17.09.12 — 19:39
схему дропни или только таблицы
4 — 17.09.12 — 20:32
Я пустую базу создаю и в нее пытаюсь восстанавливать, наверно не имеет значения что у нее имя другое?
5 — 17.09.12 — 21:51
(4) Не имеет.
Попробуйте без флага -с в созданную пустую базу. Сейчас проверял, с флагом -с (-c —clean Clean (drop) database objects before recreating them) выдает ошибки, без него нормально восстанавливает.
6 — 17.09.12 — 22:09
хорошо попробую.
Вот создал новую базу и в нее восстановил с помощью pgAdmin/ он по умолчанию сделал такой командой:
C:Program Files (x86)PostgreSQL8.4.3-3.1Cbinpg_restore.exe -i -h localhost -p 5432 -U postgres -d «BuhTemp» -v «F:postgres_backupBUH_120725.backup»
В итоге куча ошибок. и база не восстановлена, даже конфигуратор не открывается.
…..
pg_restore: connecting to database for restore
pg_restore: creating SCHEMA public
pg_restore: creating COMMENT SCHEMA public
pg_restore: creating PROCEDURAL LANGUAGE plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 5256; 2612 16386 PROCEDURAL LANGUAGE plpgsql postgres
pg_restore: [archiver (db)] could not execute query: ERROR: language «plpgsql» already exists
Command was:
CREATE PROCEDURAL LANGUAGE plpgsql;
pg_restore: creating SHELL TYPE chkpass
pg_restore: [archiver (db)] Error from TOC entry 1230; 0 0 SHELL TYPE chkpass postgres
pg_restore: [archiver (db)] could not execute query: ERROR: type «chkpass» already exists
……..
pg_restore: creating FUNCTION isnge(ean13, upc)
pg_restore: [archiver (db)] Error from TOC entry 391; 1255 17237 FUNCTION isnge(ean13, upc) postgres
pg_restore: [archiver (db)] could not execute query: ERROR: function «isnge» already exists with same argument types
Command was: CREATE FUNCTION isnge(ean13, upc) RETURNS boolean
LANGUAGE internal IMMUTABLE STRICT
AS $$int8ge$$;
……
pg_restore: setting owner and privileges for INDEX byosname
pg_restore: setting owner and privileges for INDEX byrolesid
pg_restore: setting owner and privileges for INDEX byshow
WARNING: errors ignored on restore: 6866
Процесс вернул код выхода 1.
7 — 17.09.12 — 22:54
А базу чем создаете? Из консоли администрирования 1С? Или в PgAdmin?
8 — 17.09.12 — 23:26
уже и тем и другим способом пробовал. Все равно не восстанавливает. причем пробовал уже и другой архив брать, тоже самое. может не правильная команда создания копии?
9 — 18.09.12 — 10:17
Посомтри содержимое архива, вдруг он текстовый, блокнотом каким-нибудь.
Архив, созданный с флагом «-F c» начинается со слова PGDUMP, текстовый начинается со строк
—
— PostgreSQL database dump
—
и дальше команды SQL. Можно попробовать явно задать custom формат в pg_restore «-F c». Кстати, у тебя в командной строке «-Fc», без пробела, может в Windows как-то влияет, в Linux без разницы.
10 — 18.09.12 — 11:54
Хорошо, попытаюсь посмотреть, уже 5 минут WordPad открывает.
Кстати, не могли бы выложить рабочую комбинацию команд архивации и восстановления. на будущее хотя бы поменять. потому как походу ни один архив не восстанавливается.
11 — 18.09.12 — 12:29
архив начинается с
PGDMP
потмо название базы, кодировка и наверное команды. правда все так висит, что даже скопировать оттуда не удается.
Кстакти вот например строка
2200 — public — SCHEMA T CREATE SCHEMA public;
?I DROP SCHEMA public;
o postgres | false
странно как то, получается он сначала создает а потом удаляет?
12 — 18.09.12 — 12:36
и интересно что значит строчка
postgres | false? там много таких, или User1c | false. что то с пользователями связано
13 — 18.09.12 — 12:36
Базу рукам попробуй создать, в командной строке на сервере. creаtedb.exe -U postgres testbuh1, например.
Потом pg_restore.exe -U postgres -d testbuh1 имя_архива.
14 — 18.09.12 — 13:55
создал пустую базу, почему то опять ругается на существующие элементы. и в самом конце вот что выдал:
pg_restore: [archiver (db)] COPY failed: ERROR: out of memory
DETAIL: Failed on request of size 536870912.
CONTEXT: COPY config, line 9419: «e0666db2-45d6-49b4-a200-061c6ba7
-8696-411f-95a1-ef011fdf8da9 2012-03-28 16:49:37 2012-0…»
WARNING: errors ignored on restore: 1130
В итоге база не запускается. конфигуратор открывается но видит пустую конфигурацию
15 — 18.09.12 — 14:06
если только попробовать загрузить сначала в базу дтшник старый, а потом попробовать через постгрес восстановить только данные?
16 — 18.09.12 — 15:20
«COPY failed: ERROR: out of memory» — проходили, вылечили только загрузкой дампа в постгри, установленный на линуксе, на виндовый постгря дамп упорно не хотел заливаться, вылезала «out of memory», никакие манипуляции с конфигом не помогали.
17 — 18.09.12 — 15:22
А корень зла — бинарники, хранимые в БД, большие фотографии или pdf-ки…
18 — 18.09.12 — 15:56
Бухгалтерия предприятия. вроде нет файлов. если только документы.
19 — 18.09.12 — 15:58
а на виртуалке если поднять постгри, думаете поможет?
20 — 18.09.12 — 16:21
pg_restore: [archiver (db)] Error from TOC entry 13847; 0 361139 TABLE DATA config user1c
pg_restore: [archiver (db)] COPY failed: ERROR: duplicate key value violates unique constraint «config_pkey»
CONTEXT: COPY config, line 1: «d4a1f489-2fba-41f6-ab57-3986f22c7403 2012-03-28 16:50:37 2012-03-28 16:50:37 0 89 {\277{\177\265…»
pg_restore: restoring data for table «configsave»
pg_restore: restoring data for table «dbschema»
pg_restore: restoring data for table «files»
pg_restore: [archiver (db)] Error from TOC entry 13850; 0 377251 TABLE DATA files user1c
pg_restore: [archiver (db)] COPY failed: ERROR: duplicate key value violates unique constraint «files_pkey»
CONTEXT: COPY files, line 1: «c01b78f6-1525-41b1-9cc1-69e3da58d2ac.pfl 2010-12-30 10:15:16 2012-05-16 12:42:04 0 416 \215\207\0…»
pg_restore: restoring data for table «params»
pg_restore: [archiver (db)] Error from TOC entry 13849; 0 377204 TABLE DATA params user1c
pg_restore: [archiver (db)] COPY failed: ERROR: duplicate key value violates unique constraint «params_pkey»
CONTEXT: COPY params, line 1: «locale.inf 2010-12-30 10:15:15 2010-12-30 10:15:15 0 36 \357\273\277{«ru_RU»,0,0,»»,-1,»»,»»,»»,»…»
pg_restore: restoring data for table «v8users»
WARNING: errors ignored on restore: 600
Процесс вернул код выхода 1.
Это выдает при попытке «восстановить только данные » из pgAdmin в работоспособную бухгалтерию за июль
21 — 18.09.12 — 16:21
и соответственно новых данных не появляется
22 — 18.09.12 — 16:30
(19) Я на виртуалке не стал развертывать, ибо винда и железо было только 32 разрядное, просто на какой-то ближайшей рабочей станции установил линукс и слона.
Не знаю, может вам имеет смысл попробовать установить 64-битный постгри и там развернуть архив, если, канечно, есть где-то такая сборка с патчами 1С под винду…
23 — 18.09.12 — 16:46
Я бы посоветовал взять 9-й постгри и попробовать на нем (в том числе и утилиты pg_dump / pg_restore соответствующих версий)… Я тут неоднократно писал про чудеса 8.4.x. У меня сейчас крутится 9.1.2 от 1С — вроде полет нормальный — и с бэкапом, и с восстановлением.
24 — 18.09.12 — 17:41
поставил 9,1,2 постгри, пытаюсь туда восстановить. посмотрим
25 — 18.09.12 — 18:41
не помогло 9 постгри. Опять куча ошибок и база не открывается.
pg_restore: dropping SHELL TYPE ean13
pg_restore: dropping TYPE dblink_pkey_results
pg_restore: dropping COMMENT TYPE cube
pg_restore: dropping TYPE cube
pg_restore: dropping FUNCTION cube_out(cube)
pg_restore: [archiver (db)] Error from TOC entry 164; 1255 16855 FUNCTION cube_out(cube) postgres
pg_restore: [archiver (db)] could not execute query: ERROR: type «cube» does not exist
Command was: DROP FUNCTION public.cube_out(cube);
…
pg_restore: setting owner and privileges for INDEX byshow
WARNING: errors ignored on restore: 5395
Процесс вернул код выхода 1.
26 — 18.09.12 — 19:33
Сильно большой у вас дамп?
27 — 18.09.12 — 20:15
+ (26) Давай дамп, выкладывай куда-нить.
28 — 18.09.12 — 22:27
Не хочу показаться занудой, но вместо анализа дампа я бы сделал следующее:
1) Выгрузил базу в dt через конфигуратор
2) Залил базу на Postgre 9.1.2 из dt через конфигуратор
3) Сделал бы дамп в postgre 9.1.2
4) Попробовал бы залить на тот же 9.1.2 полученный дамп.
P.S. У меня для 9.1.2 дампа в командной строке есть приписочка:
-b -Z 9 -E UTF-8 — здесь указываю компрессию и кодировку
х.з. насколько это принципиально. Да — и восстанавливать я пробовал через pgAdmin 1.14.1 — хотя это тоже не принципиально — можно потом командную строку срисовать из графического интерфейса.
29 — 18.09.12 — 23:05
(22) >>Не знаю, может вам имеет смысл попробовать установить 64-битный постгри и там развернуть архив, если, канечно, есть где-то такая сборка с патчами 1С под винду…
Есть. На пользовательском сайте 1С.
30 — 19.09.12 — 01:16
Выгрузить базу в dt я конечно могу, но бухгалтерам вот приспичило восстановить от 1го августа. че то они там удалили потом нечаянно. поэтому и мучаюсь с этим дампом, т.к. нету других копий за те числа.
64 юитный постгри.. попробую.
Кстати заметил, когда восстанавливаю в базу созданную через пгАдмин или Средствами 1с, то вылазиют ошибки про существующие таблицы и тд., а когда создаю базу сreаtedb.exe -U postgres названиебазы, и восстанавливаю pg_restore.exe -U postgres -d названиебазы имя_архива, то потом вываливается out of memory
31 — 19.09.12 — 01:18
дамп размером 600 метров, размер азы в папке постгри 7 гигов.
32 — 19.09.12 — 09:55
(29) А можно ссылочку? И еще вопрос как перенести данные с MS SQL?
33 — 19.09.12 — 10:38
(32) Пожалуйста. http://users.v8.1c.ru/version.jsp?id=AddCompPostgre&ver=9.1.2-1.1C
Если есть доступ, конечно.
Перенос тоже просто, через dt файл.
34 — 19.09.12 — 10:49
(30) Когда база создается через консоль администрирования, в ней создаются таблицы, типы данных и т.д.
Поэтому при восстановлении и появляются ошибки о существующих таблицах.
Попробуй PostgreSQL x64, может поможет с out of memory.
35 — 19.09.12 — 10:51
36 — 19.09.12 — 11:03
(30) http://www.sql.ru/forum/actualthread.aspx?tid=594580
Пишут, что можно поварьировать maintenance_work_mem.
37 — 19.09.12 — 11:55
(33) Спасибо. Нет доступа(
38 — 19.09.12 — 12:47
maintenance_work_mem стоит по умолчанию. Текущее значение 16384. наверно в мегабайтах. хотя оперативки всего 8 гигов. попробую поменять на меньшее значение)
докачаю — выложу куда нибудь сборку постгреса
39 — 19.09.12 — 13:03
40 — 19.09.12 — 13:06
41 — 19.09.12 — 13:14
(40) Спасибо!
42 — 19.09.12 — 13:45
43 — 19.09.12 — 14:09
(42) а постгрес еще надо настраивать? есть ли готовые файлы с оптимальными настройками?)
44 — 19.09.12 — 14:29
(43) В зависимости от ваших конфигураций, размера баз и объема памяти сервера.
Поищите по форуму, были темы по настройке postgresql.conf.
В Интернете тоже много найдется. На сайте Гилева, например.
45 — 19.09.12 — 14:37
(44) Нашел сайт Гилева, почитаю, спасибо.
46 — 19.09.12 — 14:51
47 — 19.09.12 — 15:43
(46) ага, спасибо!
48 — 19.09.12 — 16:25
в продолжение темы про восстановление, на том же сервере есть еще одна база гига на 2 поменьше, бэкапится теми же командами, при восстановлении так же куча ошибок про существующие объекты, возвращает код 1, но в итоге после восстановления она работает.
Пока убедил бухгалтеров что нету копии за август, но найду свободный комп и попробую поднять постгрес на линуксе
DGorgoN
49 — 19.09.12 — 16:33
(48) Виртуалку поставь