Назад | Перейти на главную страницу

Совет по использованию postgresql temp_tablespace

Я выполняю запрос, который (я полагаю) генерирует большой объем временной информации, так как я получаю следующую ошибку:

ERROR:  could not write block 16451641 of temporary file: No space left on device
HINT:  Perhaps out of disk space?

********** Error **********

ERROR: could not write block 16451641 of temporary file: No space left on device
SQL state: 53100
Hint: Perhaps out of disk space?

Я сделал папку tmp_tablespace на моем G: диск, а затем отредактировал postgresql.conf и перезапустил базу данных.

#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------

# - Statement Behavior -

#search_path = '"$user",public'     # schema names
#default_tablespace = ''        # a tablespace name, '' uses the default
temp_tablespaces = 'G:/tmp_tablespace/'         # a list of tablespace names, '' uses

Насколько я могу судить, временное табличное пространство не используется, поскольку в нем не записываются файлы (по крайней мере, ни один из них я не вижу при обновлении). В Windows Options меню, Show Hidden Files установлен, и я обновил папку несколько раз во время этой обработки, а также проверял размер папки, который оставался равным 0.

В моем коде SQL я также пробовал использовать строки SET temp_tablespaces('G:\tmp_tablespace'); и temp_tablespaces('G:\tmp_tablespace'); но обе строки вернули сообщения об ошибках.

Я использую 32-разрядную версию PostGreSQL 9.1 и Windows 7. Есть ли другие настройки, которые мне следует проверить? Моя установка PostGreSQL находится на C:\ диск и связанное с ним табличное пространство находится на G:\ водить машину.

Вам нужно создать новое табличное пространство с помощью CREATE TABLESPACE а затем укажите имя табличного пространства в вашей конфигурации, а не имя основного каталога.

После создания папки tmp на диске J я применил следующий подход:

CREATE TABLESPACE dbspace_tmp LOCATION 'J:\tmp';
CREATE DATABASE dbspace_tmp tablespace dbspace_tmp;
ALTER DATABASE my_db SET temp_tablespaces = dbspace_tmp;

Кажется, это работает, поскольку он создал файл в этом месте и, похоже, хранит там временные данные.