powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не выполняется дамп
45 сообщений из 45, показаны все 2 страниц
Не выполняется дамп
    #35672029
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Пытаемся средствами через dump создать архив базы 1С-8, но вываливается ошибка:
Код: plaintext
1.
2.
3.
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  out of memory
DETAIL:  Failed on request of size  536870912 .
Дам выполняется следующей командой:
Код: plaintext
1.
pg_dump.exe -F c -b -f "DB.backup" DB
Архив получается около трех гигабайт, места свободного полно, NTFS.
Что можно сделать?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35672724
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
архив (сжатый) около 3 гигов? сколько же тогда 'весит' база?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35672740
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовал на рабочих базах - никаких проблем с дампом (но они у меня пока небольшие).

сделал тестовую базу на 3 гига (притом с одной таблицей на 2 гига) - сдампилась нормально, размер бэкапа менее 500Мб. "поедания" памяти в процессе обнаружено не было.

приведите конфиг постгреса, может быть там что интересное есть
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35672764
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Архив не сжатый, pg_dump не дает делать сжатые - говорит что не поддерживается компрессия, видать из-за того, что сборка PG-SQL от фирмы 1С. Сама база не превышает пять гигов, судя по размерам каталога PGDATA, но выгрузка pg_dump-ом затыкается на трех с небольшим гигах.
Средствами 1С выгрузить базу тоже не удается.
В лог PGSQL вываливается следующее:
Код: plaintext
1.
2.
3.
could not send data to client: Unknown winsock error  10061 
could not receive data from client: Unknown winsock error  10061 
unexpected EOF on client connection
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35672847
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погуглил - вполне вероятно повреждение базы.

начать стоит с того, чтобы остановить postgres, сделать простую копию каталога с данными (на тот случай, если дальнейшие попытки совсем обрушат базу).

далее можно попробовать сделать vacuum full, reindex database. вдруг поможет ;)

можно попробовать сделать частичный бэкап - найти то место, на котором "обламывается" dump и забэкапить всё, кроме него.

ну и искать источник проблем. как минимум - запустить (не менее, чем на сутки) тест памяти. погонять туда-суда по дискам большие файлы, а потом сверить md5.

если по железу ничего не находится - отписаться в соответсвующей рассылке, скорее всего разработчики обратят внимание и примут участие.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35672864
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, база похоже не повреждена. Выгрузка затыкается постоянно на одной и той-же таблице, в этой таблице 1С хранит вложения файлов ко всяким документам.
Сама база еще похоже рабочая, в нее можно зайти, потестировать, переиндексировать.
Вот конфиг pgsql, он почти дефолтный, что-то там давно менялось но что именно - не помню.
Памяти на сервере 2Гб всего, память в порядке, тестировалась, система Вин-2003SP2-R, версия PG-SQL 8.2.6:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
max_connections =  100 
shared_buffers =  89600 
work_mem =  1048576 
max_fsm_pages =  204800 
fsync = off
effective_cache_size = 128MB

stats_start_collector = on
stats_row_level = on
autovacuum = off

datestyle = 'iso, dmy'
max_locks_per_transaction =  150 	
Может чего-то в конфиге поменять, что бы выгрузка не затыкалась на этой большой таблице?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35672909
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаю, в каких единицах измеряется work_mem :)
скорее всего это килобайты, получается уже гигабайт, ИМХО перебор.

может быть стоит явно написать:
shared_buffers =512MB
work_mem = 64MB
maintenance_work_mem = 256MB

ps: если на сервере больше ничего не крутится - я бы ещё поднял effective_cache_size до 1024MB. хотя к исходному сообщению это отношения не имеет.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675137
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сегодня попробовал выгрузить дамп на машину с линуксом - но с тем же успехом, дамп обломился.
Попробовал выгрузить через EMS SQL Manager for PostgreSQL - там можно типа экспортнуть таблицу кусками по одной записи - но тоже случился облом.
В итоге - после очистки злополучной таблицы, содержащей бинарные объекты - дамп пошел. Интересно - какие тогда ограничения у PG-SQL на размеры данных, хранящихся в таблицах?
И почему тогда получается, что сохранить в PG-SQL крупные блобы можно, но вот сдампить их для архива - не выйдет?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675163
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какого размера были те самые бинарные объёкты?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675250
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eddieа какого размера были те самые бинарные объёкты?
Размеры разные, в этой табличке хранятся прицепленные к документам файлы, среди них были и объемом более ста мегабайт.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675496
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё раз, повторю eddie : Вы work_mem уменьшили ? Вы знаете что это такое ? это сколько памяти можно использовать в запросе. причём work_mem при выполнение _одного_ запроса, в зависимости от запроса, может быть использовано целиком несколько раз. у Вас work_mem - один гигабайт, дамп осуществляется обычными sql командами, которые естественно могут использовать work_mem.

авторкакие тогда ограничения у PG-SQL на размеры данных, хранящихся в таблицах?это написано в документации, http://www.postgresql.org/docs/faqs.FAQ.html#item4.4
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
These are the limits:
Maximum size for a database?  unlimited (32 TB databases exist)
  Maximum size for a table?  32 TB
  Maximum size for a row?  400 GB
  Maximum size for a field?  1 GB
  Maximum number of rows in a table?  unlimited
  Maximum number of columns in a table?  250-1600 depending on column types
  Maximum number of indexes on a table?  unlimited

авторИ почему тогда получается, что сохранить в PG-SQL крупные блобы можно, но вот сдампить их для архива - не выйдет?потому что Вы некорректно настроили сервер - разрешили ему сожрать всё виртуальное адресное пространство процесса, и даже больше. любую базу можно сдампить если она не повреждена.


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675538
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЁшВы work_mem уменьшили ?
Я специально увеличил ворк-мем в надежде, что дамп таки выгрузится. На компе кроме PG-SQL ничего нету, и кроме как pg-dump никто к серверу не обращается. Потом добавил еще пару планок мозгов - в итоге их стало в общем зачете три гига с копейками - но и это не помогло.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675581
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хотите - можете посчитать, приблизительно:
32-х битный виндовс по умолчанию обычно выделяет 2 гигабайта под пользовательское адресное пространство в процессе. у Вас следующие настойки:
Код: plaintext
1.
shared_buffers = 89600 # 89600 * 8kB = 89600 * 8192 = 734003200 ~700 мегабайт
work_mem = 1048576 # 1048576 * 1kB = 1048576 * 1024 = 1073741824 ~ 1 гигабайт

добавьте ещё сюда размер страниц под выполняемый код + данные (.exe .dll) + стек - пусть будет 100 мегабайт

итого ~ 1,8 гигабайта (если work_mem заполнится целиком только один раз, что совершенно не обязательно). у Вас осталось в запасе - 200 мегабайт. ещё раз выделить work_mem УЖЕ невозможно. то есть с текущими настройками Вам нужно сидеть и молиться что бы work_mem заполнялся целиком только максимум один раз на запрос, что совсем не обязательно. :)

А если вспомнить что адреса выделяются не по порядку, с нуля, а несколько "хаотично", например под .exe обычно выделяется адрес начиная с 0x00400000. а .dll отображается в адресное пространство не обязательно сразу после .exe или до. получается фрагментация адресного пространства которая "сожрёт" и гораздо больше тех оставшихся 200-т мегабайт просто под "дырки" между выделенными адресами. и выделить тот гигабайт work_mem одним куском - не получается...

всё тоже самое относится и к maintenance_work_mem, только она используется при восстановлении дампа (индексы, vacuum)

--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35675589
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImNeedHelpЯ специально увеличил ворк-мем в надежде, что дамп таки выгрузится.Вам надо не увеличивать, а уменьшать. Оно у Вас и так не влезает в два гигабайта.
ImNeedHelpНа компе кроме PG-SQL ничего нету, и кроме как pg-dump никто к серверу не обращается.это не имеет значения, если физической памяти не хватит - будет использован свап файл.
ImNeedHelpПотом добавил еще пару планок мозгов - в итоге их стало в общем зачете три гига с копейками - но и это не помогло.это не имеет значения. виндовс выделяет 2 гигабайта под страницы пользователя. Вы можете поставить хоть 8 планок физической памяти по гигабайту, это не изменит лимит в два гигабайта под страницы пользователя на процесс.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35676202
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прописал как советовали:
Код: plaintext
1.
2.
shared_buffers =512MB
work_mem = 64MB
maintenance_work_mem = 256MB
Не помогло. Вываливается с теми-же ошибками, ругань на ту же таблицу.
Как же все-таки вытащить дамп без очистки этой большой таблицы?
Может - какой-то фикс запустить или проверку? Есть какая-нибудь утилита?
Запускал pg-resetxlog.exe - но это очевидно из другой оперы и не помогает. Ваккумизация с полным анализом - тоже не помогает. Что можно сделать еще?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35676641
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сервер перезапускали после изменения конфигурации ? если да - попробуйте вообще закоментировать work_mem и maintenance_work_mem, что бы значения по умолчанию остались.

авторМожет - какой-то фикс запустить или проверку? Есть какая-нибудь утилита?есть, если у Вас select * from problem_table и vacum full analyze работают без сообщений об ошибках (смотреть в логах) - значит скорее всего у Вас всё в порядке.

авторЗапускал pg-resetxlog.exe - но это очевидно из другой оперы и не помогает. о боже, это ещё зачем !? всю базу разнесли, или что-то осталось ? :)

если ничего не помогает - обращайтесь в 1С - пусть они разбираются что они там напатчили и почему _у них_ дамп не работает.


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677485
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёшсервер перезапускали после изменения конфигурации ?
Канечно - PG-SQL на лету эти опции не прочитывает и не изменяет.
Ёшпопробуйте вообще закоментировать work_mem и maintenance_work_mem, что бы значения по умолчанию остались.
Пробовал - тот же результат.
Ёш
если у Вас select * from problem_table и vacum full analyze работают без сообщений об ошибках (смотреть в логах) - значит скорее всего у Вас всё в порядке.
select * from problem_table выдает клиенту out of memory for query result
Ёш
о боже, это ещё зачем !? всю базу разнесли, или что-то осталось ?
Да пофиг - я все равно не рабочую базу терзаю, скопировал каталог PGDATA на другой комп - и там уже душу.
Ёш
обращайтесь в 1С - пусть они разбираются что они там напатчили и почему _у них_ дамп не работает.
Несмотря на то, что 1С официальна куплена - обращатся за помощью в их супорт считаю бессмысленной тратой времени, они начнут лепить отмазы типа: у вас версия не самая последняя, доставайте базу из архива и т.п. - в общем - разведут гнилые базары на целый месяц, а реальной помощи не будет - это мы уже проходили. А если посмотреть на то, что через какой анус у них организована работа с SQL - уже станет плохо.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677520
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
киньте структуру "больной" таблицы, попробую повторить у себя
что-то типа pg_dump -s -t bad_table bad_db
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677768
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторselect * from problem_table выдает клиенту out of memory for query resultвот этого по идеи не должно быть... хм...


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677774
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот структура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;

CREATE TABLE _reference59 (
    _idrref bytea NOT NULL,
    _version integer NOT NULL,
    _marked boolean NOT NULL,
    _ismetadata boolean NOT NULL,
    _description mvarchar( 100 ) NOT NULL,
    _fld700rref bytea,
    _fld701 mvarchar,
    _fld702_type bytea,
    _fld702_rtref bytea,
    _fld702_rrref bytea,
    _fld703 bytea,
    _fld6303 bytea
);
ALTER TABLE ONLY _reference59 ALTER COLUMN _idrref SET STORAGE PLAIN;
ALTER TABLE ONLY _reference59 ALTER COLUMN _fld700rref SET STORAGE PLAIN;
ALTER TABLE ONLY _reference59 ALTER COLUMN _fld702_type SET STORAGE PLAIN;
ALTER TABLE ONLY _reference59 ALTER COLUMN _fld702_rtref SET STORAGE PLAIN;
ALTER TABLE ONLY _reference59 ALTER COLUMN _fld702_rrref SET STORAGE PLAIN;


ALTER TABLE public._reference59 OWNER TO postgres;

ALTER TABLE ONLY _reference59
    ADD CONSTRAINT _reference59_pkey PRIMARY KEY (_idrref);

CREATE UNIQUE INDEX _referenc59_byfield706_rr ON _reference59 USING btree (_fld700rref, _idrref);

CREATE UNIQUE INDEX _referenc59_byfield707_rr ON _reference59 USING btree (_fld702_type, _fld702_rtref, _fld702_rrref, _idrref);

CREATE UNIQUE INDEX _referenc59_descr_sr ON _reference59 USING btree (_description, _idrref);
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677782
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скажите ещё пожалуйста, какое-то конкретное поле содержит большие блобы или оно размазано по всем полям bytea ?


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677803
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Возьмите конфиг по умолчанию постгреса используемой вами версии, перезагрузитесь и запустите дамп. Если снова не получится, перезагрузитесь и дампайте сначала все таблицы, кроме проблемной, а потом отдельно проблемную таблицу. О результатах отпишитесь.

P.S. Перезагружаться под виндой обязательно.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677804
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
    max(length(_idrref)) as _idrref,
    max(length(_description)) as _description,
    max(length(_fld700rref)) as _fld700rref,
    max(length(_fld701)) as _fld701,
    max(length(_fld702_type)) as _fld702_type,
    max(length(_fld702_rtref)) as _fld702_rtref,
    max(length(_fld702_rrref)) as _fld702_rrref,
    max(length(_fld703)) as _fld703,
    max(length(_fld6303)) as _fld6303
from _reference59;
удаётся выполнить ?


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677811
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGВозьмите конфиг по умолчанию постгреса используемой вами версии, перезагрузитесь и запустите дамп. Если снова не получится, перезагрузитесь и дампайте сначала все таблицы, кроме проблемной, а потом отдельно проблемную таблицу. О результатах отпишитесь.

P.S. Перезагружаться под виндой обязательно.мне кажется бессмыслено мучить pg_dump если простой select * from problem_table выдает клиенту out of memory for query result... надо имхо сначала разобраться с этим. очень похоже на ошибку или повреждение базы...
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677864
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похожий баг:
http://archives.postgresql.org/pgsql-bugs/2006-11/msg00071.php
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35677909
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG
Возьмите конфиг по умолчанию постгреса...
P.S. Перезагружаться под виндой обязательно.

Уже делал. По умолчанию и с перезагрузкой. Такой-же фигвам...
MBG
дампайте сначала все таблицы, кроме проблемной, а потом отдельно проблемную таблицу

Какой смысл? И так понятно что не сдампится именно эта таблица. Ведь когда ее очищаешь - то все нормально. Но очищать - низзя, там нужные объекты.
eddieпохожий баг:
http://archives.postgresql.org/pgsql-bugs/2006-11/msg00071.php
Не, не похожий. Там все нормально:[quote]But if try pg_dump --encoding=UTF8 -U postgres docs > docs.sql ALL OK![/quote]
Вот ооочень похожий: http://forum.ru-board.com/topic.cgi?forum=8&topic=28245

P.S. Завтра попробую сделать предложенную выборку - сейчас уже нет возможности.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35678734
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImNeedHelpselect * from problem_table выдает клиенту out of memory for query resultсообщение "out of memory for query result" нашел в исходниках libpq. то есть оперативки не хватает клиенту, а не серверу.

попробуйте сдампировать данные не через pg_dump, а самостоятельно с использованием курсоров.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35679443
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поэкспериментировал с bytea и таки добился out of memory :)
Код: plaintext
1.
2.
3.
pg_dump: Dumping the contents of table "_reference59" failed: PQgetCopyData() failed.
pg_dump: Сообщение об ошибке с сервера: out of memory
pg_dump: Команда была: COPY big._reference59 (_idrref, _version, _marked, _ismetadata, . . .

1,5 Гб памяти + 2 Гб свап. при дампе 136 314 880 байтного bytea ~ два гигабайта съел сервер + ~ столько же - клиент и банально кончилась память. после увеличения свапа на два гигабайта - всё сдампилось успешно:
Код: plaintext
1.
2.
3.
4.
5.
Mem:   1556260k total,  1522008k used,    34252k free,     8164k buffers
Swap:  4194284k total,  2742920k used,  1451364k free,    93536k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
23451 seb       20   0 1952m 1.0g 1024 D  2.0 70.4   0:12.92 /usr/lib/postgresql/8.3/bin/pg_dump -n big -f big.sql seb
23452 postgres  20   0 1745m 1628 1520 S  0.0  0.1   0:43.24 postgres: seb seb [local] COPY

ImNeedHelp , маловероятно, но может быть у Вас со свап файлом проблема ?

ps: как я ни старался - залить в поле столько, что потом нельзя было сдампить, не получается. insert/copy/update - все отменяются с out of memory, правда у меня стандартный 8.3 без 1С


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35680139
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Ёшпоэкспериментировал с bytea и таки добился out of memory :)
Код: plaintext
1.
2.
3.
pg_dump: Dumping the contents of table "_reference59" failed: PQgetCopyData() failed.
pg_dump: Сообщение об ошибке с сервера: out of memory
pg_dump: Команда была: COPY big._reference59 (_idrref, _version, _marked, _ismetadata, . . .

1,5 Гб памяти + 2 Гб свап. при дампе 136 314 880 байтного bytea ~ два гигабайта съел сервер + ~ столько же - клиент и банально кончилась память. после увеличения свапа на два гигабайта - всё сдампилось успешно:


Хорошая иллюстрация к часто задаваемому вопросу о разумности хранения файлов в БД. Честно говоря, даже в голову не приходило, что оверхед может быть настолько огромным.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35681181
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGХорошая иллюстрация к часто задаваемому вопросу о разумности хранения файлов в БД. Честно говоря, даже в голову не приходило, что оверхед может быть настолько огромным.бывает и хуже, имхо :)

вообще - да, он большой, так как при обработке bytea бинарные данные сериализуются через их строковое представление типа: E'\\000' - это например байт со значением ноль. то есть на один байт при сериализации в строку выделяется '\' '\' '0' '0' '0' - пять символов (байтов). получается в пять раз больше.

я честно говоря раньше думал что парсер запроса может обрабатывать входные строки по кусочкам, но судя по результатам экспериментов - получается что это не так. чудес не бывает :) и обновить кусок одного поля потом другого, потом вернуться опять к первому или начать выполнение до того как получена вся строка запроса от клиента - вряд ли возможно (можно конечно сделать такой сервер, что он будет писать входной запрос во временный файл, если он превышает определённый порог, но имхо это уже специфический изврат - текст запроса больше двух гигабайт :) ).
судя по размеру потраченной памяти - он пытается собрать строку сразу целиком за один раз, а так как ограничение на размер одного поля - 1 Гб (Maximum size for a field? 1 GB), видимо один гигабайт максимум он и может выделить на обработку одной строки (одного параметра запроса).
получается что приблизительный максимальный размер bytea бинарных данных = 1 Гб / 5 ~ 200 Мб.

Но тут есть неясности... во первых - не все байты обязательно паковать в пять байт их кода, те байты, значение которых совпадает с кодом ASCII символа, который можно вывести на экран - паковать не обязательно. Получается что можно передать и больше 200 мегабайт, хотя в общем случае - это зависит от содержимого (печатных символов в кодировке ASCII ~ 96 штук (из 255) )
но, например, залить avi файл размером 167 мегабайт в виде bytea мне не удалось...
2008-11-27 00:48:47 MSK ERROR: не хватает памяти
2008-11-27 00:48:47 MSK ПОДРОБНОСТИ: Ошибка при запросе размера 1073741823.
2008-11-27 00:48:47 MSK КОНТЕКСТ: COPY _reference59, строка 1: "1 1 true true 1 \N \N \N \N \N \N RIFFj\\367\\370\\011AVI LIST~"\\000\\000hdrlavih8\\000\\000\\000@\..."
2008-11-27 00:48:47 MSK КОМАНДА: COPY big._reference59 FROM STDIN

я экспериментировал с файлом размером 136 314 880 байт, заполненным случайными байтами с равномерным распределением по всему множеству значений, его текстовое представление в bytea занимало 483 470 156 символов (байт) - это с учётом печатных символов ASCII, если кодировать каждый байт (и печатный тоже), то он занимал бы соответственно 681 574 400 байт
этот файл успешно заливался через COPY TO в базу, я сделал шесть строк с ним + седьмая где это файл присутствовал в двух полях bytea:
Код: plaintext
1.
2.
3.
4.
5.
update _reference59 set
  _fld703 = i._fld6303,
  _fld6303 = i._fld6303
from _reference59 as i
where i._idrref = '6' and _reference59._idrref = '7';
вся эта таблица, после увеличения свапа, успешно дампилась pg_dump'ом

вообще, у меня хранятся файлы в рабочей базе, но в виде LO (Large Objects которые). у них есть кардинальные преимущества перед bytea:

- их не обязательно сериализовать в строку и по умолчанию насколько я понимаю это и не делается при передаче между клиентом и сервером, то есть никакого "в пять раз больше"
- с LO не обязательно работать целиком, как с одним значением. его можно читать кусочками как файл
- даже если очень хочется - его нельзя вставить в таблицу по значению, только как ID (ссылка на системную таблицу pg_largeobject), соответственно он не будет мешать обычным insert/select/update/delete
- его максимальный размер - 2 Гб
- он хранится разбитый на кусочки (по 131072 байта если не ошибаюь), таким образом при резервном копировании и восстановлении он не порождает никаких особогигантских многомегабайтных строк

да и сами файлы у меня небольшие - это отчёты в pdf максимум килобайт на 500

ps: но это всё лирика :) она не отвечает на вопрос автора топика - как так получилось что у него _в базе_ оказался bytea для обработки которого не хватает памяти. и что ему с этим делать... у меня пока не получается повторить эту проблему, но в принципе есть одна идея, может быть попробую попозже.

pps: кстати, можно ли быть уверенным что если в логах нет ругани на vacuum full и select, то таблица не повреждена ? может быть это всё же просто банально битая таблица ? %)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35681275
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшps: но это всё лирика :) она не отвечает на вопрос автора топика - как так получилось что у него _в базе_ оказался bytea для обработки которого не хватает памяти. и что ему с этим делать... у меня пока не получается повторить эту проблему, но в принципе есть одна идея, может быть попробую попозже.попробуйте сделать выборку с другой машинки, на которой мало [доступной] памяти, чтобы не хватило памяти не серверу, а клиенту.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35681383
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatЁшps: но это всё лирика :) она не отвечает на вопрос автора топика - как так получилось что у него _в базе_ оказался bytea для обработки которого не хватает памяти. и что ему с этим делать... у меня пока не получается повторить эту проблему, но в принципе есть одна идея, может быть попробую попозже.попробуйте сделать выборку с другой машинки, на которой мало [доступной] памяти, чтобы не хватило памяти не серверу, а клиенту.

да как вариант - не сможет сделать дамп, но автор делает дамп насколько я понял на той же машине где и сервер. и памяти там по идеи хватает.
авторСегодня попробовал выгрузить дамп на машину с линуксом - но с тем же успехом, дамп обломился.
. . .
На компе кроме PG-SQL ничего нету, и кроме как pg-dump никто к серверу не обращается. Потом добавил еще пару планок мозгов - в итоге их стало в общем зачете три гига с копейками - но и это не помогло.3 Гб + ещё свап виндовый (он пока не ответил какого размера свап) + он пробовал и на другую машину делать дамп (правда не написал сколько там памяти)
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35681394
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшда как вариант - не сможет сделать дамп, но автор делает дамп насколько я понял на той же машине где и сервер. и памяти там по идеи хватает.может почти вся память отдана серверу постгреса, клиенту остается недостаточно. я подумал, что вы именно из-за этого советовали уменьшить work_mem.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35681446
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatможет почти вся память отдана серверу постгреса, клиенту остается недостаточно.может быть. надо ждать его ответа про свап :)
LeXa NalBatя подумал, что вы именно из-за этого советовали уменьшить work_mem.не совсем, work_mem у него был катастрофически большой - 1 Гб. если он весь используется да ещё + shared_buffers 700 Мб, то в адресном пространстве сервера просто не останется места под строку bytea. Всего в windows процесс может выделить ~ 2 Гб
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683125
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёшможет быть. надо ждать его ответа про свап

Своп виндовый автоматический, на винте места до дури - свап может расти еще далеко.

[quot Ёш]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
    max(length(_idrref)) as _idrref,
    max(length(_description)) as _description,
    max(length(_fld700rref)) as _fld700rref,
    max(length(_fld701)) as _fld701,
    max(length(_fld702_type)) as _fld702_type,
    max(length(_fld702_rtref)) as _fld702_rtref,
    max(length(_fld702_rrref)) as _fld702_rrref,
    max(length(_fld703)) as _fld703,
    max(length(_fld6303)) as _fld6303
from _reference59;
удаётся выполнить ?
Удается, вот результат:
Код: plaintext
1.
2.
3.
 _idrref | _description | _fld700rref | _fld701 | _fld702_type | _fld702_rtref | _fld702_rrref | _fld703  | _fld6303 
---------+--------------+-------------+---------+--------------+---------------+---------------+----------+----------
       16  |            92  |           16  |       60  |             1  |              4  |             16  |  77503069  |     24948 
( 1  row)
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683131
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImNeedHelp
eddieпохожий баг:
http://archives.postgresql.org/pgsql-bugs/2006-11/msg00071.php
Не, не похожий. Там все нормально:But if try pg_dump --encoding=UTF8 -U postgres docs > docs.sql ALL OK! как раз таки похожий.
I have a database with table "documents", that have column type " bytea ".
Database size is ~1.5 GB (99% of objects is images, documents, pdf's in
bytea fields, middle size of each object ~ 20Mb ).
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683134
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скопировал PGData на юниховую машину и попробовал натравить на проблемную таблицу перловую утилиту pgfsck
Она выдала много таких строк:
Код: plaintext
1.
2.
-- Table _reference59(25157):Page 0:Tuple 1:Toast Tuple 33802: Incorrect value in header (incorrect blocksize?)
-- 0C 00 00 00 80 B2 38 BB 01 00 00 00 24 00 40 00 00 20 03 20
Может в самом деле - если эта утилита не врет - таблица побилась? Но почему тогда VACUUM/ANALIZE не выдает в логах сервера никаких ошибок и процедура отрабатывает успешно?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683154
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eddieкак раз таки похожий.
Хм...
Счаз попробовал сделать дамп с --encoding=UTF8 - дамп прошел нормально! Выгрузилось четыре с лишним гига, в логах постгря - никаких ошибок out of memory !
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683224
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImNeedHelpСкопировал PGData на юниховую машину и попробовал натравить на проблемную таблицу перловую утилиту pgfsck
Она выдала много таких строк:
Код: plaintext
1.
2.
-- Table _reference59(25157):Page 0:Tuple 1:Toast Tuple 33802: Incorrect value in header (incorrect blocksize?)
-- 0C 00 00 00 80 B2 38 BB 01 00 00 00 24 00 40 00 00 20 03 20
Может в самом деле - если эта утилита не врет - таблица побилась? Но почему тогда VACUUM/ANALIZE не выдает в логах сервера никаких ошибок и процедура отрабатывает успешно?а Вы останавливали сервер перед копированием ?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683225
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImNeedHelpeddieкак раз таки похожий.
Хм...
Счаз попробовал сделать дамп с --encoding=UTF8 - дамп прошел нормально! Выгрузилось четыре с лишним гига, в логах постгря - никаких ошибок out of memory !значит это была просто ошибка :) надо Вам видимо обновляться до 8.2.11, в 8.2.8 была исправлена ошибка:
Код: plaintext
Fix ERRORDATA_STACK_SIZE exceeded crash that occurred on Windows when using UTF-8 database encoding and a different client encoding (Tom)
может быть с ней и была связана Ваша проблема ? у Вас какие настройки локали базы ?
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683276
ImNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёша Вы останавливали сервер перед копированием ?
Странный вопрос, конечно останавливал - иначе даже скопировать не получится - файлы блокируются постгрей.
Ёшзначит это была просто ошибка :)
Да вааще непонятно - что это такое. Попробовал сделать дамп как и раньше без --encoding=UTF8 - дамп прошел нормально - и судя по файлам - он ничем не отличается от дампа с --encoding=UTF8
Ёшнадо Вам видимо обновляться до 8.2.11
Сие невозможно, так как постгря патченный фирмой 1С, есть только 8.2.6 и далее уже 8.3.х
Видать придется на 8.3 ставить, так как выгрузка базы средствами 1С все равно не проходит.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35683779
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читалась ветка взалеб, как детективный роман, думалось .. вот она, разгадка, близко ...
.. а оказалось ни причины ни следствия, все работает или само(???) вдруг заработало... грустно.
...
Рейтинг: 0 / 0
Не выполняется дамп
    #35726273
мимоходящий сисадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImNeedHelpкак выгрузка базы средствами 1С все равно не проходит. а вот это проблема некоторых релизов 1С 8.1.
у нас 8.1.11.67 - в нем таких проблем уже нет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Не выполняется дамп
    #37730899
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3.5 года прошло, а воз и ныне там..
у меня таже самая ситуация:
постгря 8.3.8 на центосе (всё 32бит) стоит и при попытке стандартного дампа выдаёт:

авторpg_dump: SQL command failed
pg_dump: Error message from server: ERROR: не хватает памяти
DETAIL: Ошибка при запросе размера 1073741823.
pg_dump: The command was: COPY public.config (filename, creation, modified, attributes, datasize, binarydata) TO stdout;

увеличение свопа до 50гб ничего не дало
файл дампа обрубается на 2117мб, т.е. ~2ГБ

vacuum full ничего не показывает
select * from public.config; - ошибок не выдает ( там кстати почему-то пустая таблица .. по-крайней мере в начале только оглавления столбцов и никаких данных.. но я так понимаю, - если начало пустое, значит и вся таблица пустая?)

вариант ставить 64 бита не вариант, потому что из-за каких-то кривых конфигов, написанных самих же 1с, отдавать 50к им же, и за работу ещё столько же и гемор потом лечить всю жизнь - не айс ни разу
остаётся вариант только править сам конфиг..
какие ещё варианты?

работало кстати всё ок, пока там чё-то обновлять не начали в конфиге. поставили новый походу и понеслась..
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Не выполняется дамп
    #38838751
algur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если это ещё кому-то интересно.
Проблема, скорее всего в ограничении размера транзакции (1ГБ).
Возможное решение - делать дамп с ключиком --inserts:

Код: plaintext
pg_dump -U postgres --inserts -Fc -Z9 -c -f $dump_name.sql $table_name

Должно работать, но надо пробовать.
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не выполняется дамп
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]