Вход | Регистрация

  1  2
1С:Предприятие :: 1С:Предприятие 8 общая

КА 1.1.107.4 - проблемы с архивацией на СУБД Postgres Pro

КА 1.1.107.4 - проблемы с архивацией на СУБД Postgres Pro
Я
   mgk2
 
16.10.18 - 08:52
Исходные данные :
КА 1.1.107.4 с мелкими доработками
Платформа 8.3.9.2170
СУБД Postgres Pro 9.4

Все работало стабильно почти 2 года, пока не обновил конфу на релиз 1.1.107.4 .
Заметил, что перестали восстанавливаться архивы созданные с помощью pg_dump.

Начал разбираться и выяснил, что pg_dump в процессе архивации выдает ошибки :

pg_dump: Ошибка выгрузки таблицы "config": сбой в PQgetResult().
pg_dump: Сообщение об ошибке с сервера: Р?РЁР?Р'Р?Р?:  invalid memory alloc request size 1174829507
pg_dump: Выполнялась команда: COPY public.config (filename, creation, modified,attributes, datasize, binarydata) TO stdout;

Переносил базу на другие сервера , менял версии Postgres (9.6 и 10.5), менял платформу (8.3.9.2309 и 8.3.10.2772) - результат тот же, pg_dump не может нормально создать архив.

При постановке конфы обратно на поддержку архивация начинает работать нормально.

Как можно решить проблему?
 
 
   ansh15
 
101 - 08.11.18 - 10:36
Извиняюсь за многословие.
Простой эксперимент.
createdb test; psql test
В базе создаем таблицу
create table config(id int, bindata bytea);
и грузим в нее что-нибудь(неважно что, какой-нибудь файл)
insert into config values (1, pg_read_binary_file('_input/tstf.tgz'));
Все хорошо загрузилось, без ошибок.
Смотрим размер бинарной строки select octet_length(bindata) FROM config;
octet_length
--------------
    668411047                 размер загруженного файла в байтах
(1 row)

После этого пытаемся использовать pg_dump для создания выгрузки
pg_dump -F c -b  -f test.backup test
Результат — такая же ошибка, как и у автора темы
invalid memory alloc request size 1336822097   -  число, равное длина_бинарной_строки * 2 + 3

Далее, опять psql test
Смотрим, можно ли командой copy выгрузить таблицу config в файл
copy config to '/home/postgres/config.tbl';
Нет, нельзя, возникает та же ошибка.
В документации видим, что у команды copy есть параметр формата чтения/записи
данных binary, пробуем - copy config to '/home/postgres/temp2/config.tbl' with binary;
Ошибки не возникает, файл создается того же размера, что и бинарная строка.
Если размер бинарной строки, скажем, 350 МБ, то ошибки не возникает.
   Фрэнки
 
102 - 08.11.18 - 10:42
(101) круто!

А вот интересно (раз пошла такая пьянка - режь последний огурец), почему такого вида траблы нет, когда конфигурации не равны КА 1.1 или УПП 1.3 , например, КА 2 какая-то ?
   Garykom
 
103 - 08.11.18 - 11:16
(99) Но он же хочет больше "invalid memory alloc request size 1 174 829 507"
Может в этом дело?
   Garykom
 
104 - 08.11.18 - 11:19
(101) Урра ошибка не в 1С а в PostgreSQL так?
   Фрэнки
 
105 - 08.11.18 - 11:25
(104) нет. Пост собственно о том, что платформа 1С как-то криво и неоднозначно прописывает в базу конфигу Поставщика
   ansh15
 
106 - 08.11.18 - 11:29
Сервер для выполнения команды copy пытается выделить память, натыкается на ограничение в 1 GB и выдает ошибку.
< 2018-11-08 10:53:02.140 MSK >LOG:  00000: statement: copy config to '/home/postgres/config.tbl';
< 2018-11-08 10:53:02.140 MSK >LOCATION:  exec_simple_query, postgres.c:940
< 2018-11-08 10:53:02.513 MSK >ERROR:  XX000: invalid memory alloc request size 1336822097
< 2018-11-08 10:53:02.513 MSK >LOCATION:  palloc, mcxt.c:858
< 2018-11-08 10:53:02.513 MSK >STATEMENT:  copy config to '/home/postgres/config.tbl';
   Garykom
 
107 - 08.11.18 - 11:36
(105) Тоже верно, не учли особенностей постгрес и лимитов на одну запись.
Точнее учли но не догадались что при выгрузке бинарного поля оно каким то хитрым образом конвертится и занимает чуть более чем в 2 раза памяти.
   Фрэнки
 
108 - 08.11.18 - 11:57
(107) все бы ничего, но почему-то в других конфигах с этими примерно размерами траблы не возникает

з.ы. я уже одно и тоже повторяю :-)
   stopa85
 
109 - 08.11.18 - 12:10
(101) Снимаю шляпу. Я был уверен что эта фича-бага как-то так воспроизведется. Но вы меня опередили)
   ansh15
 
110 - 08.11.18 - 12:38
(109)Просто интересно стало.
(108)Может в более новых конфигурациях и стали учитывать. Не превышать размер конфы поставщика выше определенного значения.
 
 Рекламное место пустует
   Rema Dan
 
111 - 08.11.18 - 12:38
(0) Хорошо бы проверить повторится ли эта ошибка на демобазе с разрешёнными изменениями и отключённым режимом совместимости. Возможно, что из-за активного режима совместимости платформа не использует какой-нибудь трюк для обхода этой проблемы.
   mgk2
 
112 - 08.11.18 - 12:57
(111) на демобазе все воспроизводится.
   stopa85
 
113 - 08.11.18 - 15:43
ansh15, а тебе удается восстановить табличку config из файла после COPY ... binary?


COPY public.config (id, bindata) FROM '/var/lib/postgresql/copy.test' with binary;

У меня вызывает крах сервера ИЛИ "Ошибка при запросе памяти (850672995 Б)"
   NorthWind
 
114 - 08.11.18 - 21:42
(102) возможно, там либо этот объем меньше, либо как-то изменен формат хранения, чтобы в одном поле одной строки столько не хранилось. Собственно, в (105) вы пишете как раз об этом
   NorthWind
 
115 - 08.11.18 - 21:47
(108) "примерно" здесь не сработает, нужно сделать запрос и посмотреть размер. Скорее всего, в новых конфигурациях каким-то образом обошли критический размер поля, а в старых это либо оказалось трудоемко, либо просто поленились связываться с этим. Либо третий вариант - обошли, но в сочетании новая платформа/новая конфигурация.
   kook
 
116 - 08.11.18 - 21:49
(115)Вероятнее всего дело в объеме данных.
Формат хранения конфигурации поставщика поменять - это ж нужно платформу допиливать, так?
   ansh15
 
117 - 08.11.18 - 21:49
(113) Да, в пустую таблицу.
   NorthWind
 
118 - 08.11.18 - 21:57
(116) здесь может быть сочетание особенностей платформы и особенностей файла конфигурации. Т.е. что постарше хранят так, а что поновее - по-другому.
   Фрэнки
 
119 - 09.11.18 - 09:05
(118) +100500 :-)
вот у меня абсолютно такое же впечатление - сочетание особенностей
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует