postgreSQL

使用 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 postgresql
  • service postgresql start/stop/restart
  • 直接執行 pg_ctl

但在 Windows 環境或手動安裝的 PostgreSQL 中,確實主要依賴 pg_ctl。

不清楚的原因:教材可能是基於特定環境(如 Windows 或手動安裝)撰寫,沒有涵蓋 Linux 系統服務的管理方式。作為 DBA,了解不同環境下的管理方式是很重要的。