Pivotal Knowledge Base

Follow

Dropping Tablespace Error: "Tablespace "xxxx" is not Empty"

Environment

Symptom

Attempting to drop a tablespace ends up with error message

gpadmin=# drop tablespace ts3;
ERROR:  tablespace "ts3" is not empty

Cause

There are two causes for why the tablespace cannot be dropped

Cause 1:

Tablespace has object from some other database , to verify if there is any object on the tablespace use the below query (replace <tablespace_name> with concerned tablespace).

psql -d template1 -t -c "select datname from pg_database where datname!='template0'" | while read x
do 
echo --- $x ---   
psql -d $x -c "select count(*) from pg_class where reltablespace in ( select oid from pg_tablespace where spcname='<tablespace_name>')"
done

Cause 2:

The database in the cluster are using the tablespace has default tablespace.

psql -d template1 -c "select datname from pg_database where datname!='template0' and dattablespace in ( select oid from pg_tablespace where spcname='<tablespace_name>')" 

when you have the tablespace ( that you attempting to drop ) as default tablespace to the database , the catalog table/information of that database are stored on that location which is avoiding the tablespace to be dropped , to cross verify

  • The tablespace "ts3" oid is
gpadmin=# select oid,spcname,spcfsoid from pg_tablespace;
   oid    |  spcname   | spcfsoid 
----------+------------+----------
     1663 | pg_default |     3052
     1664 | pg_global  |     3052
 33730629 | fs10       | 33730626
 33731447 | ts3        | 33730626
(4 rows)

Time: 3.064 ms
  • The database with default tablespace ts3.
gpadmin=# Select oid,datname,dattablespace from pg_database where dattablespace=33731447;
   oid    | datname | dattablespace 
----------+---------+---------------
 33731528 | testdb  |      33731447
(1 row)

Time: 2.443 ms
  • so the location of the files are
gpadmin=# select * from pg_filespace_entry where fsefsoid=33730626;
 fsefsoid | fsedbid |      fselocation       
----------+---------+------------------------
 33730626 |       1 | /data/master/gpseg-1
 33730626 |       2 | /data1/primary/gpseg0
 33730626 |       3 | /data1/primary/gpseg1
 33730626 |       4 | /data1/primary/gpseg2
 33730626 |       5 | /data1/primary/gpseg3
 33730626 |       6 | /data1/primary/gpseg4
  • Navigating to the <fselocation>/<tablespace_oid>/<database_oid>
cd /data/master/gpseg-1/33731447/33731528
  • so in the example the file count available at the location is
gpadmin:Fullrack@mdw $ ls -ltr | wc -l
169

Please NOTE : For tablespace that is a default to the database , the reltablespace value in pg_class is 0(zero) which is the reason you are not able to see the object with query as discussed in cause 1 (above) , More of it is discussed in the article here

Resolution

For cause 1:

If there is any object on the tablespace that you are attempting to drop , please move to a new location , using the below command.

alter table <table_name> set tablespace <tablespace_name>;

For cause 2:

As Pivotal Greenplum is build on postgres 8.2 , there is no easy way to change the default tablespace , i.e the command ( below ) was not part of the postgres 8.2

alter database <database_name> set tablespace <tablespace_name>;

so in order to change the default tablespace , you will need to follow the steps as mentioned on the article here

Comments

Powered by Zendesk