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)

其他

總體來說,這種方法還是非常簡便的,比直接分離出數據庫的方法要容易實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM