PostgreSQL删除表空间

昨天在群里看到有同鞋问:如何删除表空间?因为删除的时候,一直报

1
2
3
postgres=# drop tablespace mytmp;
ERROR: tablespace "mytmp" is not empty
postgres=#

原因

想要删除表空间,那么该表空间必须为空(即没有任何其他的对象会使用到该表空间)才能被删除。

找出有哪些对象使用到了表空间

SQL语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
postgres=# SELECT
c.relname,
t.spcname
FROM
pg_class c
JOIN pg_tablespace t ON c.reltablespace = t.oid
WHERE
t.spcname = 'mytmp';
relname | spcname
---------+---------
tsp | mytmp
(1 row)
postgres=#

删除

找到表空间的使用对象时,这时如果确实要删除表空间,那就要将该表空间下的表对象都删除了最后才能删除表空间。

删除该表空间下的表

1
2
3
postgres=# drop table tsp;
DROP TABLE
postgres=#

删除该表空间

1
2
3
postgres=# drop tablespace mytmp;
DROP TABLESPACE
postgres=#

再检查一次看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
postgres=# select * from pg_tablespace where spcname = 'mytmp';
spcname | spcowner | spcacl | spcoptions
---------+----------+--------+------------
(0 rows)
postgres=#
postgres=# SELECT
postgres-# c.relname,
postgres-# t.spcname
postgres-# FROM
postgres-# pg_class c
postgres-# JOIN pg_tablespace t ON c.reltablespace = t.oid
postgres-# WHERE
postgres-# t.spcname = 'mytmp';
relname | spcname
---------+---------
(0 rows)
postgres=#