在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄,需遵循以下步驟。假設原數據目錄為“/var/lib/pgsql/12/data”,目標目錄為“/new/path/pgdata”。
1、步驟概覽
- 停止PostgreSQL服務
- 創建新目錄并設置權限
- 復制數據文件(保留權限)
- 修改配置文件指向新目錄
- 啟動服務并驗證
2、詳細操作
2.1、創建目標目錄并設置權限
sudo mkdir -p /new/path/pgdata
sudo chown -R postgres:postgres /new/path/pgdata # 確保屬主正確
sudo chmod 700 /new/path/pgdata # 安全權限
2.2、初始化PostgreSQL數據庫到自定義目錄(如果尚未初始化)
“-D /data/pgsql”這條命令的含義是:指定PostgreSQL數據庫的數據存儲目錄(該目錄用于存放所有數據庫的相關數據)
sudo -u postgres initdb -D /data/pgsql
2.3、停止PostgreSQL服務
sudo systemctl stop postgresql
2.4、復制數據文件(保留權限)
sudo rsync -av /var/lib/pgsql/data/ /new/path/pgdata/
- -av:保留權限、屬主等屬性并顯示進度
- 源目錄末尾的“/”:確保復制內容而非目錄本身
2.5、修改PostgreSQL配置
2.5.1、編輯服務單元文件
sudo vi /usr/lib/systemd/system/postgresql.service
找到“Environment=PGDATA=…”行,修改為:
Environment=PGDATA=/new/path/pgdata
2.5.2、重載systemd配置
sudo systemctl daemon-reload
2.6、啟動服務并驗證
sudo systemctl start postgresql # 啟動PostgreSQL
sudo systemctl status postgresql # 檢查PostgreSQL狀態
2.7、驗證數據目錄
sudo -u postgres psql -c "SHOW data_directory;" # 應輸出:“/new/path/pgdata”# 查看存儲每個數據庫的唯一數字標識符(OID)和系統表,包含所有數據庫的元數據
sudo -u postgres psql -c "SELECT oid, datname FROM pg_database;"
3、故障排查
- 權限問題:確保“/new/path/pgdata”屬主為“postgres”且權限為“700”
- SELinux 錯誤:檢查日志“/var/log/audit/audit.log”,臨時測試可“setenforce 0”(生產環境不推薦)
- 服務啟動失敗:查看日志“journalctl -u postgresql -xe”
- 路徑錯誤:確認“postgresql.service”中的“PGDATA”路徑正確
4、注意事項
- 備份優先:操作前務必備份數據(“pg_dumpall”或文件級備份)
- 磁盤空間:確保目標目錄有足夠空間
- 路徑一致性:自定義路徑需永久掛載(避免重啟后丟失)
完成遷移后,可刪除原數據目錄釋放空間(確認服務運行正常后):
sudo rm -rf /var/lib/pgsql/12/data.old