Ошибка при восстановлении 1C базы PostgreSQL

1. MaximR 09.04.21 18:14 Сейчас в теме
Здравствуйте.

При восстановлении базы из бэкапа утилитой pg_restore выдает два предупреждения (ранее такого не было). Ниже.
База восстанавливается, и работает.
Как это можно исправить, и насколько это критичные ошибки?

Ранее было обновление платформа 8.3 и PostgreSQL12.5.

**************************************** 1 *************************************************************
pg_restore: creating FUNCTION "public.datediff(character varying, timestamp without time zone, timestamp without time zone)"
pg_restore: creating FUNCTION "public.datediff2(character varying, timestamp without time zone, timestamp without time zone)"
pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 12752; 1255 16404 FUNCTION datediff2(character varying, timestamp without time zone, timestamp without time zone) postgres
pg_restore: error: could not execute query: ERROR: function "datediff2" already exists with same argument types
Command was: CRE ATE FUNCTION public.datediff2(character varying, timestamp without time zone, timestamp without time zone) RETURNS integer
LANGUAGE plpgsql
AS $_$
DECLARE
arg_mode alias for $1;
arg_d2 alias for $2;
arg_d1 alias for $3;
BEGIN
if arg_mode = 'SECOND' then
return date_part('epoch',arg_d1) - date_part('epoch',arg_d2) ;
elsif arg_mode = 'MINUTE' then
return trunc((date_part('epoch',arg_d1) - date_part('epoch',arg_d2)) / 60);
elsif arg_mode = 'HOUR' then
return trunc((date_part('epoch',arg_d1) - date_part('epoch',arg_d2)) /3600);
elsif arg_mode = 'DAY' then
return cast(arg_d1 as date) - cast(arg_d2 as date);
elsif arg_mode = 'WEEK' then
return trunc( ( cast(arg_d1 as date) - cast(arg_d2 as date) ) / 7.0);
elsif arg_mode = 'MONTH' then
return 12 * (date_part('year',arg_d1) - date_part('year',arg_d2))
+ date_part('month',arg_d1) - date_part('month',arg_d2);
elsif arg_mode = 'QUARTER' then
return 4 * (date_part('year',arg_d1) - date_part('year',arg_d2))
+ date_part('quarter',arg_d1) - date_part('quarter',arg_d2);
elsif arg_mode = 'YEAR' then
return (date_part('year',arg_d1) - date_part('year',arg_d2));
end if;
END
$_$;

**************************************** 2 *************************************************************

pg_restore: creating CONSTRAINT "public.params params_pkey"
pg_restore: from TOC entry 147599; 2606 44951 CONSTRAINT params params_pkey postgres
pg_restore: error: could not execute query: ERROR: could not create unique index "params_pkey"
DETAIL: Key (filename, partno)=(ibparams.inf, 0) is duplicated.
Command was: ALT ER TABLE ONLY public.params
ADD CONSTRAINT params_pkey PRIMARY KEY (filename, partno);

********************************************************************************************************

pg_restore: warning: errors ignored on restore: 2
End
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. XAKEP 09.04.21 20:24 Сейчас в теме
а что искали и не нашли ответа ?
4. MaximR 09.04.21 22:58 Сейчас в теме
(3)
Спасибо, но:

https://forum.infostart.ru/forum16/topic234974/
не мой случай, т.к. база переносилась на новые релизы postgresql и 1С через выгрузку dt в старых версиях.

https://stackoverflow.com/questions/51114997/pg-restore-warning-errors-ignored-on-restore-62
https://postgrespro.ru/list/thread-id/2123112
не решает проблемы :-(
5. ab_initio 96 10.04.21 05:50 Сейчас в теме
Пробуйте в пустую базу восстановить.
6. MaximR 10.04.21 22:44 Сейчас в теме
(5)
Как раз восстанавливаю в пустую базу.
Перед восстановлением делаю через pgAdmn drop текущей базе, потом cre ate database. И в эту пустую базу восстанавливаю командой:

"C:\Program Files\PostgreSQL\12.5-6.1C\bin\pg_restore.exe" --host "localhost" --port "5432" --username "XXX" --dbname "XXX" --no-password --role "postgres" --no-password --section pre-data --section data --section post-data --verbose "XXX"

Кстати, я попробовал отдельно сделать восстановление в туже пустую базу с ключом --clean, и восстанавливает без этих двух ошибок, но дольше. Правда вначале восстановления долго ругается на несуществующие объекты, которые пытается очистить.

Непонятно, почему при восстановлении в пустую базу возникают эти ошибки создания каких-то существующих объектов:
- function "datediff2" already exists with same argument types
- key (filename, partno)=(ibparams.inf, 0) is duplicated.
7. uZer716242 19.05.21 13:09 Сейчас в теме
(6)
Как раз восстанавливаю в пустую базу.
Перед восстановлением делаю через pgAdmn drop текущей базе, потом cre ate database. И в эту пустую базу восстанавливаю командой:

"C:\Program Files\PostgreSQL\12.5-6.1C\bin\pg_restore.exe" --host "localhost" --port "5432" --username "XXX" --dbname "XXX" --no-password --role "postgres" --no-password --section pre-data --section data --section post-data --verbose "XXX"

Кстати, я попробовал отдельно сделать восстановление в туже пустую базу с ключом --clean, и восстанавливает без этих двух ошибок, но дольше. Правда вначале восстановления долго ругается на несуществующие объекты, которые пытается очистить.

Непонятно, почему при восстановлении в пустую базу возникают эти ошибки создания каких-то существующих объектов:
- function "datediff2" already exists with same argument types
- key (filename, partno)=(ibparams.inf, 0) is duplicated.


Та же самая ситуация, восстановление с 11.5 на 13.2

pg_restore: из записи оглавления 63950; 2606 71019376 CONSTRAINT params params_pkey postgres
pg_restore: ошибка: could not execute query: ОШИБКА:  создать уникальный индекс "params_pkey" не удалось
ПОДРОБНОСТИ:  Ключ (filename, partno)=(ibparams.inf, 0) дублируется.
Выполнялась команда: ALT ER   TABLE ONLY public.params
    ADD CONSTRAINT params_pkey PRIMARY KEY (filename, partno);


Вообще конечно ситуация странная, новая версия по идее должна быть обратно совместимой со старой версией.
8. MaximR 19.05.21 13:25 Сейчас в теме
postgree свежий вызывает много вопросов в части работы и производительности... надо переходить на MSSQL.
9. Storm_ 15.09.25 15:30 Сейчас в теме
Ошибка связана с тем, что кластер 1с поддерживает соединение с базой.
Для её избежания, перед восстановлением базы, временно, на кластере 1с очищаем имя базы.
Желательно подождать секунд 10, для того что бы 1с завершила обмен данными, если он есть.
Только после этого проводить восстановление базы.
После восстановления не забудьте вернуть имя базы в кластере 1с.
EvgeniyFmn; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот