1、查看表空间
postgres=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------+----------+----------+-------------------+---------+---------+-------------
pg_default | postgres | | | | 1088 MB |
pg_global | postgres | | | | 2167 kB |
(2 rows)
可以看到这里没有自定义表空间,默认使用pg_default 表空间
2、创建演示数据库和用户
使用新的数据库app,并且owner为app用户来进行演示
postgres=# create user app password'XXX';
CREATE ROLE
postgres=# create database app owner app;
CREATE DATABASE
postgres=# \c app app
You are now connected to database "app" as user "app".
app=> create schema app authorization app;
CREATE SCHEMA
app=> create table public.t1(id int);
CREATE TABLE
app=> create table app.t2(id int);
CREATE TABLE
3、新建表空间
创建表空间需要超级用户权限
$ mkdir tblspace_new
app=# CREATE TABLESPACE tbl_app OWNER app LOCATION '/home/postgres/tblspace_new';
CREATE TABLESPACE
4、数据库app使用新表空间作为默认表空间
app=# \c app app
You are now connected to database "app" as user "app".
app=> alter database app set default_tablespace to tbl_app;
退出psql再重新连接
app=> create table public.t3(id int);
CREATE TABLE
app=> create table app.t4(id int);
CREATE TABLE
app=> select pg_relation_filepath('t3');
pg_relation_filepath
------------------------------------------------
pg_tblspc/356916/PG_12_201909212/356883/356935
(1 row)
app=> select pg_relation_filepath('app.t4');
pg_relation_filepath
------------------------------------------------
pg_tblspc/356916/PG_12_201909212/356883/356938
(1 row)
app=> select oid,spcname from pg_tablespace ;
oid | spcname
--------+------------
1663 | pg_default
1664 | pg_global
356916 | tbl_app
(3 rows)
可以看到在app数据库下新建的表默认变到tbl_app表空间下,即oid为356916。
5、修改用户app默认表空间为tbl_app
先恢复下上面的配置
drop table public.t3;
drop table app.t4;
alter database app set default_tablespace to default;
app=# \c app app
app=> alter user app set default_tablespace to tbl_app;
退出psql再重新连接
app=> create table public.t5(id int);
CREATE TABLE
app=> create table app.t6(id int);
CREATE TABLE
app=> select pg_relation_filepath('t5');
pg_relation_filepath
------------------------------------------------
pg_tblspc/356916/PG_12_201909212/356883/356959
(1 row)
app=> select pg_relation_filepath('app.t6');
pg_relation_filepath
------------------------------------------------
pg_tblspc/356916/PG_12_201909212/356883/356962
(1 row)
可以看到用户app新建的表默认变到tbl_app表空间下,其他用户不受影响。
6、总结
- 如果要迁移数据表的表空间,会锁表,要注意对业务的影响。
- 新建表修改database级别或者user级别(一般还是database级别)的默认表空间,只需配置一次,原有的数据表存储不改变,这种方式是推荐的。