PostgreSQL硬盘满了扩容
前言:我们系统原来是乙方做的,后来扔给了我们.
我们没有专业的运维和DBA😢
国庆期间,遇到了一个重大的问题----数据库硬盘满了😱😱😱
1. 扩容
我们先向云服务商给挂载的数据盘申请了500G的空间,然后准备扩容.
发现,分区默认是MBR格式的,最大只支持2T…GG,白申请了
只能先清理下日志,临时文件啥的.最后腾出来了200G.
2. 再遇
过了一个多礼拜,200G硬盘又差不多要用光了,得赶紧找办法了.
经过半天多的摸索,终于找到了一个方法–表空间(TableSpace)
之前也完全没接触过这个东西…
3. 开干
- 后台挂载一块新硬盘
- 格式化
# 1.查看当前挂载的硬盘
[root@xxx]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 2.5T 0 disk
└─sda1 8:1 0 2T 0 part /data
vda 253:0 0 40G 0 disk
├─vda1 253:1 0 36G 0 part /
└─vda2 253:2 0 4G 0 part [SWAP]
vdb 253:16 0 2T 0 disk
└─vdb1 253:17 0 2T 0 part /data/new_space
# 2.查看硬盘--我这个已经弄过了=v=
[root@xxx]# fdisk -l
Disk /dev/vdb: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: E1B56E5D-F33B-49C1-A7B7-B38F0FE4FAC5
# Start End Size Type Name
1 2048 4194301951 2T Microsoft basic primary
# 3.parted选择硬盘(不要选择分区,例如/dev/vdb1之类的)
# 以下命令都是在parted交互模式下
[root@xxx]# parted /dev/vdb
# 3.1设置卷标--gpt
[root@xxx]#parted> mklabel gpt
# 3.2创建逻辑分区
[root@xxx]#parted> mkpart primary 0% 100%
# 3.3print查看有没有成功
[root@xxx]#parted> print
# 4.格式化成xfs
mkfs.xfs /dev/vdb1
- 挂载到目录
# 创建目录用来挂载
[root@xxx]# mkdir /data/new_space
# 挂载目录
[root@xxx]# mount /dev/vdb1 /data/new_space/
# 编辑/etc/fstab 设置开机自动挂载
[root@xxx]# vi /etc/fstab
# 添加 /dev/vdb1 /data/new_space xfs defaults 0 0
[root@xxx]#vi> o # 当前行下新建一行
[root@xxx]#vi> /dev/vdb1 /data/new_space xfs defaults 0 0
# 给postgres分配此目录权限
[root@xxx]# chown postgres /data/new_space
# 读写权限(按需修改)
[root@xxx]# chmod -R 777 /data/new_space
- 创建表空间
# 切换postgres用户(注意'-',不加'-'shell环境不切换,报错)
[root@xxx]# su - postgres
# 进入psql交互模式
[root@xxx]# psql
# 创建新表空间 ts_gps_new
[root@xxx]#psql> CREATE TABLESPACE "ts_gps_new" location '/data/new_space';
# 修改默认表空间 (注意:只对此会话有效!!!)
[root@xxx]#psql> set default_tablespace = ts_gps_new;
# 查看表空间
[root@xxx]#psql> \db
List of tablespaces
Name | Owner | Location
------------+----------+-----------------
pg_default | postgres |
pg_global | postgres |
ts_gps_new | postgres | /data/new_space
- 修改新创建的表的表空间
# 新建表
[root@xxx]#psql> CREATE TABLE XXX(int id...) tablespace ts_gps_new;
# 设置了default_tablespace可以省略后面的(再次提醒:default_tablespace只对当前会话有效!!!)
[root@xxx]#psql> CREATE TABLE XXX(int id...)
# 查看表所在的表空间
[root@xxx]#psql> select pg_relation_filepath('XXX')
- 修改已有表的表空间
- 由于之前的一些旧的表采用了Partitions分区表,所以修改时要修改下面的子表
- 附表好像改了没用?
[root@xxx]#psql> alter table mt_xxx_2019 set tablespace ts_gps_new;
[root@xxx]#psql> alter table mt_xxx_2020 set tablespace ts_gps_new;
首发同步:https://www.yuque.com/docs/share/0da26961-ca16-4dd0-9f05-a5449b6baa32?# 《PostgreSQL硬盘满了扩容》