問題背景
在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)
其他
總體來說,這種方法還是非常簡便的,比直接分離出數據庫的方法要容易實現。