Я выполняю запрос, который (я полагаю) генерирует большой объем временной информации, так как я получаю следующую ошибку:
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;
Кажется, это работает, поскольку он создал файл в этом месте и, похоже, хранит там временные данные.