Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I get an error "could not write block .... of temporary file no space left on device ..." using postgresql

I'm running a really big query, that insert a lot of rows in table, almost 8 million of rows divide in some smaller querys, but in some moment appear that error : "I get an error "could not write block .... of temporary file no space left on device ..." using postgresql". I don't know if i need to delete temporary files after each query and how I can to do that, or if it is related with another issue.

Thank you

like image 443
jacr1614 Avatar asked Apr 22 '14 18:04

jacr1614


2 Answers

OK. As there are still some facts missing, an attempt to answer to maybe clarify the issue:

It appears that you are running out of disk space. Most likely because you don't have enough space on your disk. Check on a Linux/Unix df -h for example.

To show you, how this could happen: Having a table with maybe 3 integers the data alone will occupy about 12Byte. You need to add some overhead to it for row management etc. On another answer Erwin mentioned about 23Byte and linked to the manual for more information about. Also there might needs some padding betweens rows etc. So doing a little math:

Even with a 3 integer we will end up at about 40 Byte per row. Having in mind you wanted to insert 8,000,000 this will sum up to 320,000,000Byte or ~ 300MB (for our 3 integer example only and very roughly).

Now giving, you have a couple of indexes on this table, the indexes will also grow during the inserts. Also another aspect might could be bloat on the table and indexes which might can be cleared with a vacuum.

So what's the solution:

  1. Provide more disk space to your database
  2. Split your inserts a little more and ensure, vacuum is running between them
like image 167
frlan Avatar answered Oct 30 '22 22:10

frlan


Inserting data or index(create) always needs temp_tablespaces, which determines the placement of temporary tables and indexes, as well as temporary files that are used for purposes such as sorting large data sets.according to your error, it meant that your temp_tablespace location is not enough for disk space .

To resolve this problem you may need these two ways:
1.Re-claim the space of your temp_tablespace located to, default /PG_DATA/base/pgsql_tmp

2. If your temp_tablespace space still not enough for temp storing you can create the other temp tablespace for that database:

create tablespace tmp_YOURS location '[your enough space location';
alter database yourDB set temp_tablespaces = tmp_YOURS ;
GRANT ALL ON TABLESPACE tmp_YOURS to USER_OF_DB;

then disconnect the session and reconnect it.

like image 21
BongSey Avatar answered Oct 30 '22 21:10

BongSey