postgresql数据库表空间迁移

问题背景

在pg数据库实际使用过程中,随着业务数据的不断累积,会导致磁盘的可用空间越来越小,尤其是在linux下,没办法将原来的磁盘进行扩容,只能够通过加载新的磁盘来进行扩容。如果原来的pg数据库是一个簇,那么可以很好处理,一种是将数据库簇一部分挪走,另一种就是本文讲到的表空间迁移的方式。

分析

pg数据库一般默认安装完后有两个表空间,pg_default和pg_golebal。这两个表空间的物理位置都默认在data目录下。如果不进行其他配置的话,那么所有的数据都会存在pg_default中。pg数据库是可以让用户自己创建表空间的,同时指定物理位置。这样的好处就是可以让频繁使用的数据库使用性能好的ssd挂载盘,其他可以放在hdd中,充分考虑到业务的需求。当然也可以进行数据迁移,也就是下面介绍的。

场景

工作在linux系统中的主从pg数据库在不断存储数据过程中,挂载在/data1下的数据库pgdata占用空间越来越大,磁盘监控发出报警,为了保证业务的不中断,现在需要将数据进行迁移。

解决:

  • 首先在linux系统中/data2目录挂载一块新磁盘。这个步骤需要在从数据库中同步进行。
mkfs.ext4 /dev/sdc
mount /data2 /dev/sdc
  • 在/data2下创建一个目录作为新表空间的数据目录,并给与postgres权限。这个步骤也需要在从数据库中同步进行。
mkdir /data2/pg_tbs1
chown -R postgres.postgres /data2/pg_tbs1
chmod 700 /data2/pg_tbs1
  • 创建新的表空间,并指定新创建的目录,这个在主数据库中进行就可以了,从会自动同步。

postgres=# create tablespace tbs_data location '/data2/pg_tbs1';
CREATE TABLESPACE
  • 查看表空间
postgres=# \db+
                                     List of tablespaces
    Name    |  Owner   |    Location    | Access privileges | Options |  Size   | Description 
------------+----------+----------------+-------------------+---------+---------+-------------
 pg_default | postgres |                |                   |         | 15 GB   | 
 pg_global  | postgres |                |                   |         | 521 kB  | 
 tbs_data   | postgres | /data2/pg_tbs1 |                   |         | 0 bytes | 
(3 rows)

  • 迁移数据库,这个过程还是比较快的,基本就是复制。同样,只需要在主库中进行就行了,从库会自动同步。注意,迁移过程中,TEST库是会加上全局锁的,无法读写。所以在实际中需要协调出业务空闲时间。
迁移数据库TEST的表空间
alter database TEST set tablespace tbs_data;

  • 迁移完毕查看,将近12G的数据库迁移到了新的磁盘中,原来的盘空间释放出来了。
postgres=# \db+
                                     List of tablespaces
    Name    |  Owner   |    Location    | Access privileges | Options |  Size   | Description 
------------+----------+----------------+-------------------+---------+---------+-------------
 pg_default | postgres |                |                   |         | 3043 MB | 
 pg_global  | postgres |                |                   |         | 521 kB  | 
 tbs_data   | postgres | /data2/pg_tbs1 |                   |         | 12 GB   | 
(3 rows)

其他

总体来说,这种方法还是非常简便的,比直接分离出数据库的方法要容易实现。

posted @ 2019-12-03 11:50  echao  阅读(2886)  评论(0编辑  收藏  举报