前阵子在工作中遇到一个问题,公司pg数据库的数据盘即将爆满,在联想到MySQL可以迁移表空间的基础上,想尝试一下pg是否也能完成此操作,经过一系列试验,发现pg确实也是可以进行表空间迁移的,就此记录一下操作流程
关键步骤
创建新的表空间
postgres=# create tablespace tbs1 location '/data/pgsql-10/data_tbs1';
简要说明:
tbs1:新的表空间的名字,可自定义
/data/pgsql-10/data_tbs1:新的表空间的存储位置,该目录需要提前建好,并且将所属权改成postgres用户和组
当建好新的表空间之后,在data目录中的pg_tblspc目录中就会生成一个软链接指向指定的文件夹
迁移表空间
postgres=# alter table tmp_t1 set tablespace tbs1;
简要说明:
tmp_t1:需要迁移表空间的表名
tbs1:新的表空间名
迁移了表空间之后,就会发现该表的数据已经转移到了新的表空间内,但是如果这张表建有索引,索引不会跟着数据一起转移过去,需要在新的表空间里建立新的索引来替代老的索引,例子如下:
postgres=# create index concurrently idx_tmp_t1_x2 on tmp_t1 using btree (c0) tablespace tbs1;
postgres=# begin;
drop index idx_tmp_t1_x1;
alter index idx_tmp_t1_x2 rename to idx_tmp_t1_x1;
commit;
简要说明:
相当于在新的表空间建立了一个新的索引,然后删除老的索引,将新的索引改名成老的索引的名字,达到索引替换的效果
至此,就完成了迁移表空间的整个流程