---
# System prepended metadata

title: '我所理解的 PostgreSQL 01: 釐清 Database Cluster 與 pgAdmin 的常見誤解'
tags: [PostgreSQL, 我所理解的 PostgreSQL]

---

# 我所理解的 PostgreSQL 01: 釐清 Database Cluster 與 pgAdmin 的常見誤解

{%hackmd @moment89/tXJIcGqmSI6_fJQp2hnJUA %}

## Database Cluster? 和 Database 的關係?

看到 Cluster 這個字眼可能會直覺想到是指分散式資料庫? 是指有很多個 PostgreSQL Server 組成的分散式服務? ❌不是

節選自[官方文檔 18.2 節](https://www.postgresql.org/docs/current/creating-cluster.html)

> Before you can do anything, you must initialize a database storage area on disk. We call this a database cluster. (The SQL standard uses the term catalog cluster.) A database cluster is a collection of databases that is managed by a single instance of a running database server.

Database Cluster 在 PostgreSQL 的定義是指指由單個 PostgreSQL Server Instance 管理的 Database 集合，這些 Database 會使用相同的配置文件、Port、Process 與 Memory 結構，就可以稱為一個 Database Cluster。

一般我們安裝 PostgreSQL，預設就會在本機的 5432 Port 上運作一個 PostgreSQL Server Instance，這個服務上除了原生自帶的 postgres 資料庫，還能建立多個其他的資料庫，故這個服務就是一個 Database Cluster。


### 那一個環境可以有多個 Database Cluster 嗎? 

✅可以

安裝過 PostgreSQL 後，我們電腦內就有了 PostgreSQL 的功能 (在安裝路徑下的 bin 資料夾內)，我們可以參考剛剛貼的那份官方文檔，使用 PostgreSQL 的 initdb 功能建立一個新的 PostgreSQL Server Instance，並可以將該實例的啟動指令註冊成 Windows 服務，方便管理。

但要注意的是，一個 Port 上只能有一個 PostgreSQL Server Instance，不能同時運作兩個，也就是說新建的 PostgreSQL Server Instance 要記得去 Config 檔修改成其他 Port (ex. 改成 5433) 才能運作喔!

### 結論

Database Cluster 並不是分散式架構，而是單一 PostgreSQL Server Instance 所管理的多個 Database 集合。

![image](https://hackmd.io/_uploads/HJEAOYkwle.png)


## pgAdmin 就是 PostgreSQL 嗎?

原生的 PostgreSQL 是一個單純的資料庫服務，需要透過 Terminal 以 psql 功能連線到資料庫內進行操作。

![image](https://hackmd.io/_uploads/B1NDeILPgx.png)

pgAdmin 工具是對 PostgreSQL 的操作包裝成 GUI 介面的工具，讓連線資料庫、下 SQL 指令、查看系統狀況等手續變更簡單。
(但 pgAdmin 並不是呼叫 psql 工具來執行 SQL，而是使用 Python 的 psycopg 套件連線並發送 SQL 指令。)

可透過 pgAdmin 可以快速從左側導覽列看到 Database Cluster 下所有 Database 及其下所有物件，而 pgAdmin 可以顯示這些就是因為它在背後直接透過連線資料庫、查詢 PostgreSQL 系統表返回這些資訊並顯示為按鈕。

(這也就是為什麼，當我們透過 pgAdmin 介面連線了 Database Cluster 下某一個 database，想刪除該 database 時會跳錯誤說有使用者正在連線、不可刪除，因為背後就是 pgAdmin 會對資料庫建立連線拿這些顯示用的資訊。)

<center class="half">
    <img src=https://hackmd.io/_uploads/rkyCgL8Peg.png width="200"/>
</center>

也可以透過 pgAdmin 操作資料庫邏輯備份和還原，但這些功能背後調用的是你電腦裡安裝的 PostgreSQL 的 pg_dump、pg_restore 操作備份還原。

<center class="half">
    <img src=https://hackmd.io/_uploads/HkDtWIIwlx.png width="200"/>
</center>

如果電腦裡有裝 PostgreSQL，但還是用不了 Backup、Restore 功能，那可能是需要手動配置 PostgreSQL 功能執行檔的路徑 (PostgreSQL Binary Path)。

1. 點擊 pgAdmin 左上角進入 Preferences 介面

<center class="half">
    <img src=https://hackmd.io/_uploads/Bk56ZLIwge.png width="200"/>
</center>

2. 配置 PostgreSQL Binary Path 為 PostgreSQL bin 資料夾的路徑

<center class="half">
    <img src=https://hackmd.io/_uploads/HJOIG88wxl.png width="500"/>
</center>

### 結論

* pgAdmin 只是一個 GUI 介面工具，將查詢指令包裝成圖形化介面。
* pgAdmin 專門服務於 PostgreSQL，但並不等於 PostgreSQL。