I am executing PostgreSQL functions to update a table which has a huge amount of data and the update happens for about 100000 records everyday. During the update I get an error saying:
"could not write to hash-join temporary file: No space left on device"
I have not really been able to get something useful to overcome this error. I got something where it says to SET a temporary table spaces. But I was not able to find how do I create a temporary table space where the data will be stored during the executing of the update procedure.
halfer
19.7k17 gold badges95 silver badges183 bronze badges
asked Apr 13, 2015 at 9:49
Yousuf SultanYousuf Sultan
2,9148 gold badges31 silver badges60 bronze badges
2
SQL> create tablespace temp_tbs location '/some/big/disk';- change
temp_tablespaces = 'temp_tbs'in postgresql.conf. select pg_reload_conf();- enjoy
Vivek S.
19.1k7 gold badges66 silver badges84 bronze badges
answered Apr 13, 2015 at 10:09
8
I got the same issue, but I was working with docker.
Just in case if you are working with docker too, go to:
Docker Preferences > Disk Panel > Disk image size and increase it.
It solved my problem.
alxlives
5,0044 gold badges26 silver badges47 bronze badges
answered Sep 26, 2019 at 12:28
1- How do the internals of postgres work that cause this message to occur in the first place?
When joining two very large data sets, one strategy PostgreSQL can use is to scan one table and hash its join columns. Then scan the other table and compare the hashes of the join columns to hashes calculated for the second table.
See https://en.wikipedia.org/wiki/Hash_join
It works really well when you’re joining a small table against a much larger one, especially where no indexes suit the join conditions.
PostgreSQL can use a hash join strategy for bigger tables where it writes the hash table partitions out to disk first. This is presumably what you got.
What is the hash-join in reference to the creation of the temporary file that the db creates?
Hash tables. I don’t really understand this question.
2- How can I predict and prevent errors like this (related to performance and memory) occurring in the future?
Have more spare disk space for temporary storage. It doesn’t have to be in the main tablespace; see the temp_tablespaces setting.
As far as I know PostgreSQL doesn’t have the ability to estimate hash table sizes and decide the hash table will be too big for the available disk space.
09.01.23 — 12:29
8.3.20.2180
обновление бух 3.0 с 3.0.123.26 на 3.0.127.49
postgre 10
53100:error: could not extend file «base/52185646/95696157»: no space left on device HINT: check free disk space
размер базы около 20Гб
свободного места на тот момент было 7ГБ
загрузили бэкап, все ок
админ и руководство хотят узнать есть ли методы анализа требуемого места для предстоящего обновления
я не знаю таких методов, помогите найти вразумительные слова для них, или может предложите решение
1 — 09.01.23 — 12:33
(0) Жесть, экономить место на диске? Вы серьезно? 7 гигов свободно????
ИМХО на диске должно быть хотя бы в 2-3 раза больше места чем размер базы.
2 — 09.01.23 — 12:34
(1) это само собой, я сразу это сказал, налейте места и забудем на ближайшие несколько лет
но им хочется анализ
3 — 09.01.23 — 12:34
если перекладывать из одних таблиц в другие при реструктуризации базы, логично предположить, что свободного места должно быть не меньше текущего размера базы + логи транзакций?
если база 20 Гектар, то и места должно быть не меньше 20 Га?
4 — 09.01.23 — 12:39
>>есть ли методы анализа требуемого места для предстоящего обновления
Не думаю, если при обновлении не написано ничего в подсказках, но если
>>размер базы около 20Гб
>>свободного места на тот момент было 7ГБ
тут ИМХО и так более чем очевидно. Если у вас там не раритетные суперскоростные скази-диски или не оптаны лимитированной серии, то смысл крохоборить?…
5 — 09.01.23 — 12:40
(4) ну как вариант арендовать SSD диск на время обновления, после обновления базу вернуть взад
6 — 09.01.23 — 12:42
то есть метод анализа примерно такой как (3)?
минимум размер базы плюс подушка какая-то
7 — 09.01.23 — 12:43
(2) Дык анализ уже произведен средствами 1С: Нет места на жестком диске….
8 — 09.01.23 — 12:43
(6) За анализом им к психологу, он им поставит анализ.
Или анализ чего им нужно?
9 — 09.01.23 — 12:44
(8) требуемого свободного места на диске для корректного завершения обновления
10 — 09.01.23 — 12:44
(7) они хотят перед обновлением оценивать — хватит места или нет
11 — 09.01.23 — 12:45
(8) Ну автор нормальный вопрос задал, просто читать всю ветку надо) Типа предварительный анализ перед обновлением — хватит ли места.
12 — 09.01.23 — 12:45
(7) особенно «анализ» обновления типовой ERP (соблюдайте спокойствие. поезд скоро отправится. обновление в зависимости от количества данных займет от нескольких минут до нескольких дней)
и костыли в виде запуска в параллель нескольких фоновых заданий и галочка производительности обновления или работы пользователей.
а еще обновление через копию базы забыл 
13 — 09.01.23 — 12:47
(9) Это вопрос должен быть адресован админу. Железо — его головняк. Он должен обеспечить работоспособность программы.
14 — 09.01.23 — 12:48
(6) я бы заморачивался если бы речь шла на терабайты. Но «жалкие» (по нынешним дням) ~50 гигов держать свободными уж точно можно…
15 — 09.01.23 — 12:48
(10)
п.1 бэкап базы.
п.2 обновление — > no space left on device HINT: check free disk space
БИНГО! предварительный анализ — недостаточно места! <- вы находитесь здесь
п.4 загружаем из бэкапа базу
п.5 пишем на форум, читаем, много думаем…
16 — 09.01.23 — 12:51
(0) если кратко, то примерно так:
1. через сравнение-объединение определяешь объекты с изменившейся структурой
2. смотришь объем таблиц этих объектов вместе с индексами + объем таблиц Config
3. умножаешь на 2, но лучше сразу на π
вот тебе будет оценка
17 — 09.01.23 — 12:52
(16) кстати да, и неделю времени на анализ (это ж сколько денег можно заработать, если франь)
18 — 09.01.23 — 12:53
(16) спасибо за конкретику
(17) тоже об этом подумал
я думаю мой конспект из этой темы их удовлетворит, всем спасибо, можно закрывать
19 — 09.01.23 — 13:14
Есть шанс что ошибки на диске
20 — 09.01.23 — 13:53
(11) так кроме эмпирического пути других методов нет, даже (размер базы умножь на 2) и то иногда не спасает, тем более когда модель восстановления стоит FULL а не простая.
Так что только делать обновление на копии и смотреть сколько заняло место
21 — 09.01.23 — 16:25
(20) И как же это посмотреть? После обновления база занимает +/- столько же, сколько и до
22 — 09.01.23 — 16:28
А по сути вопроса, если грубо, то: — да ну вас нахрен, даже голову напрягать не стоит из-за 50 гигабайтов…
23 — 09.01.23 — 16:30
(0) обновлял на днях бух корп (размер не смотрел), места на диске было 10г свободных, при обновлении глюкануло что не достаточно места. пришлось чистить немного и повторно обновлять
24 — 09.01.23 — 16:33
(О) размер диска какой? столкнулся с тем что под пользователем, которым обновлял. в темпах пользователя накопился кэш от обновлений, примерно 50 г. можно почистить
25 — 09.01.23 — 16:35
(21) запустить стандартный виндовый счетчик свободного место на время обновления и смотреть минимальное значение?
26 — 09.01.23 — 16:37
(25) Спасибо, не знал что такое вообще есть стандартное в винде
27 — 09.01.23 — 16:44
Счетчики производительности для дисковой подсистемы
%Free Space — Объем свободного дискового пространства на выбранном логическом диске, в процентах.
https://windowsnotes.ru/other/schetchiki-proizvoditelnosti-dlya-diskovoj-podsistemy/
Ну или по 1С-совски
Мониторинг свободного места на диске с помощью OneScript
https://infostart.ru/1c/articles/1450352/
28 — 09.01.23 — 16:58
(27) Все же можно проще, без всяких OneScript
Только что на коленке собрал
FSO=Новый COMОбъект(«Scripting.FileSystemObject»);
Для каждого ТекДиск Из FSO.Drives Цикл
Если ТекДиск.DriveType=2 Тогда
СвободныйОбъем = Окр(fso.GetDrive(ТекДиск.DriveLetter).FreeSpace/1048576,1);
Сообщить(«Диск «+ТекДиск.DriveLetter+» свободно «+СвободныйОбъем+» Мб.»);
КонецЕсли;
КонецЦикла;
29 — 09.01.23 — 16:59
30 — 09.01.23 — 17:06
(28) там вроде как ограничения типа с сетевыми дискми не работает. или в виртуалки чудит, короче тестить надо
31 — 09.01.23 — 17:07
(28) В (25) говорят, что всё уже написано до Вас
Kassern
32 — 09.01.23 — 17:17
(30) Все же есть)
DriveType
Возвращаемое значение: число — определяет тип ресурса. Возможные значения:
0 — неизвестное устройство.
1 — устройство со сменным носителем.
2 — жёсткий диск.
3 — сетевой диск.
4 — CD-ROM.
5 — RAM-диск.
