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)
其他
总体来说,这种方法还是非常简便的,比直接分离出数据库的方法要容易实现。