使用 pg_ctl 關閉
.\pg_ctl -D D:\postgresql-版本號-windows-x64-binaries\pgsql\data stop教材中提到,pg_ctl stop 指令預設使用 “fast” 模式關閉資料庫,你也可以明確指定不同的關閉模式:
- smart:等待所有連線斷開後再關閉
- fast(預設):立即斷開所有連線並關閉
- immediate:立即關閉,不等待任何操作完成(可能導致資料損壞)
例如:
pg_ctl -D /path/to/data -m smart stop # 溫和關閉
pg_ctl -D /path/to/data -m fast stop # 快速關閉(預設)
pg_ctl -D /path/to/data -m immediate stop # 立即關閉(危險)systemctl 與 pg_ctl 的差別
主要差別在於使用場景和控制層級:
pg_ctl
- PostgreSQL 原生工具:直接控制 PostgreSQL 資料庫實例
- 跨平台:在 Windows、Linux 都可使用
- 資料庫層級控制:直接對資料庫 cluster/instance 進行操作
- 必須指定資料目錄:需要 -D 參數指定 data directory
systemctl
- Linux 系統服務管理工具:屬於 systemd 系統
- 作業系統層級控制:管理註冊為系統服務的 PostgreSQL
- 服務導向:控制的是包裝成系統服務的 PostgreSQL
- 簡化操作:不需要指定資料目錄,因為已在服務定義中設定
實際運作關係
當你使用 systemctl stop postgresql 時,systemctl 實際上是調用預先設定好的腳本,該腳本最終還是會執行類似 pg_ctl stop 的命令。所以 systemctl 可以說是 pg_ctl 的上層包裝。
從你的教材內容,我發現有個說法需要澄清:“PostgreSQL Instance的啟動與停止只能使用pg_ctl,無法藉由其他工具” 這個說法在 Linux 環境下並不完全正確。
在 Linux 系統中,當 PostgreSQL 安裝為系統服務時,你可以使用:
systemctl start/stop/restart postgresqlservice postgresql start/stop/restart- 直接執行
pg_ctl
但在 Windows 環境或手動安裝的 PostgreSQL 中,確實主要依賴 pg_ctl。
不清楚的原因:教材可能是基於特定環境(如 Windows 或手動安裝)撰寫,沒有涵蓋 Linux 系統服務的管理方式。作為 DBA,了解不同環境下的管理方式是很重要的。