PostgreSQL

1、查看表空间

  1. postgres=# \db+
  2. List of tablespaces
  3. Name | Owner | Location | Access privileges | Options | Size | Description
  4. ------------+----------+----------+-------------------+---------+---------+-------------
  5. pg_default | postgres | | | | 1088 MB |
  6. pg_global | postgres | | | | 2167 kB |
  7. (2 rows)

可以看到这里没有自定义表空间,默认使用pg_default 表空间

2、创建演示数据库和用户

使用新的数据库app,并且owner为app用户来进行演示

  1. postgres=# create user app password'XXX';
  2. CREATE ROLE
  3. postgres=# create database app owner app;
  4. CREATE DATABASE
  5. postgres=# \c app app
  6. You are now connected to database "app" as user "app".
  7. app=> create schema app authorization app;
  8. CREATE SCHEMA
  9. app=> create table public.t1(id int);
  10. CREATE TABLE
  11. app=> create table app.t2(id int);
  12. CREATE TABLE

3、新建表空间

创建表空间需要超级用户权限

  1. $ mkdir tblspace_new
  2. app=# CREATE TABLESPACE tbl_app OWNER app LOCATION '/home/postgres/tblspace_new';
  3. CREATE TABLESPACE

4、数据库app使用新表空间作为默认表空间

  1. app=# \c app app
  2. You are now connected to database "app" as user "app".
  3. app=> alter database app set default_tablespace to tbl_app;
  4. 退出psql再重新连接
  5. app=> create table public.t3(id int);
  6. CREATE TABLE
  7. app=> create table app.t4(id int);
  8. CREATE TABLE
  9. app=> select pg_relation_filepath('t3');
  10. pg_relation_filepath
  11. ------------------------------------------------
  12. pg_tblspc/356916/PG_12_201909212/356883/356935
  13. (1 row)
  14. app=> select pg_relation_filepath('app.t4');
  15. pg_relation_filepath
  16. ------------------------------------------------
  17. pg_tblspc/356916/PG_12_201909212/356883/356938
  18. (1 row)
  19. app=> select oid,spcname from pg_tablespace ;
  20. oid | spcname
  21. --------+------------
  22. 1663 | pg_default
  23. 1664 | pg_global
  24. 356916 | tbl_app
  25. (3 rows)

可以看到在app数据库下新建的表默认变到tbl_app表空间下,即oid为356916。

5、修改用户app默认表空间为tbl_app

先恢复下上面的配置

  1. drop table public.t3;
  2. drop table app.t4;
  3. alter database app set default_tablespace to default;
  4. app=# \c app app
  5. app=> alter user app set default_tablespace to tbl_app;

退出psql再重新连接

  1. app=> create table public.t5(id int);
  2. CREATE TABLE
  3. app=> create table app.t6(id int);
  4. CREATE TABLE
  5. app=> select pg_relation_filepath('t5');
  6. pg_relation_filepath
  7. ------------------------------------------------
  8. pg_tblspc/356916/PG_12_201909212/356883/356959
  9. (1 row)
  10. app=> select pg_relation_filepath('app.t6');
  11. pg_relation_filepath
  12. ------------------------------------------------
  13. pg_tblspc/356916/PG_12_201909212/356883/356962
  14. (1 row)

可以看到用户app新建的表默认变到tbl_app表空间下,其他用户不受影响。

6、总结

  • 如果要迁移数据表的表空间,会锁表,要注意对业务的影响。
  • 新建表修改database级别或者user级别(一般还是database级别)的默认表空间,只需配置一次,原有的数据表存储不改变,这种方式是推荐的。