Skip to content
Open Source

建立、備份與還原資料庫

建立五種受支援的資料庫、接到服務,並完成備份、還原或傾印匯出。

在專案的 新增 選單選擇資料庫引擎,設定版本與儲存空間,再 檢查變更。資料庫就緒後,用 接到服務 加入連線變數。要保留可還原的資料,接著到 備份 設定 S3 目的地。

  • 已有專案,並有建立資料庫與所需機密的權限。替服務加入連線時,也需要修改該服務的權限。
  • 管理員已安裝所選引擎的 operator。缺少元件時,新增 選單會連到 元件,見管理叢集元件。
  • 叢集有可用的儲存類別與足夠空間。建立多個執行個體時,表單的容量與資源都是每個執行個體的數值。
  • 要設定備份,準備可從叢集連到的 S3 相容端點、已存在的儲存貯體與金鑰,或可讀取的共用 S3 目的地。PostgreSQL 備份另需 Barman Cloud 外掛。
引擎管理元件建立表單提供的版本預設每個執行個體容量
PostgreSQLCloudNativePG18、17、165 GiB
MongoDBPercona Operator for MongoDB8.0、7.010 GiB
MySQLMOCO8.410 GiB
MariaDBmariadb-operator12.3、11.810 GiB
Dragonfly(相容 Redis)Dragonfly Operator1.342 GiB

表單預設選最新版本。MongoDB 8.0 在部分 Linux 版本上要改一項記憶體設定才能啟動,Zeabur 建立和還原的 MongoDB 8 都會加上 GLIBC_TUNABLES=glibc.pthread.rseq=1,效能可能會稍微低一點。之前建立、還沒有這項設定的 MongoDB 8,資料庫頁面會提醒,按「修改設定」就能補上。

Dragonfly 的授權為 Apache-2.0 AND BUSL-1.1。選用前閱讀表單顯示的授權限制,尤其是向他人提供託管資料庫服務的情境。

在專案選 新增 → 所需引擎,或按 新增資料庫。

填寫 名稱,選擇 版本、執行個體數、每個執行個體的儲存空間、規格 與儲存類別。名稱最多 30 個字元,使用小寫字母、數字與連字號,以字母開頭。

單節點叢集預設一個執行個體。多節點叢集的 MongoDB、MySQL 預設三個,其餘引擎預設一個。MongoDB、MySQL 可選 1、3、5,其他引擎依表單提供的數量選擇。

只有一個執行個體時,故障後沒有其他執行個體接手,資料也只有一個磁碟區上的副本。需要容錯時,除了數量,也要安排執行個體分布與儲存位置。

在建立表單的 接到服務 勾選應用程式。也可先不選,等資料庫就緒後,在 概覽 → 連線 按 接到服務。

確認 變數名稱 與 會加入的變數:

引擎預設主要變數另外加入的值
PostgreSQLDATABASE_URL可選擇額外加入 PGHOST、PGPORT、PGUSER、PGPASSWORD、PGDATABASE。
MongoDBMONGO_URL密碼變數 MONGOPASSWORD。
MySQL、MariaDBDATABASE_URL密碼變數 MYSQLPASSWORD。
DragonflyREDIS_URL密碼變數 REDIS_PASSWORD。

密碼留在機密中,服務讀取機密參照。已有同名變數時,表單會提示衝突或建議在變數名稱前面加上資料庫名稱,請確認名稱符合應用程式的設定。

按 檢查變更,確認引擎、名稱、執行個體數與容量。若同時接到服務,也檢查哪些服務會更新連線。

套用後打開資料庫,等待 就緒,再確認執行個體數量。剛建立時若顯示 未知,到 事件、日誌 查看 operator 與執行個體的狀態。

資料庫 連線 顯示的是叢集內位址。需要手動設定應用程式時,複製 主機、連接埠、資料庫 與 使用者名稱。有讀取機密權限時,按密碼旁的 顯示。最後從應用程式寫入並讀回一筆測試資料,確認連線與權限。

  1. 開啟資料庫的 備份 → 設定備份。
  2. S3 目的地 預設選叢集登錄的第一個目的地。要用其他位置,改選另一個目的地,或選 手動輸入,填入 端點、儲存貯體、區域、存取金鑰 ID、私密存取金鑰。叢集還沒有目的地時,表單會連到新增目的地的地方。
  3. 有 資料夾 欄位時,可指定儲存位置,留空使用資料庫名稱。MySQL 固定寫入 moco/<專案名稱>/<資料庫名稱>。
  4. 在 排程 選 每天 03:00(UTC) 或 每週日 03:00(UTC)。台灣時間對應上午 11:00。
  5. 依引擎設定保留方式,按 檢查變更。檢查畫面會用一句句話列出排程與目的地、保留天數、金鑰存放的 Secret,以及資料庫是否會重新啟動。確認後按 設定備份。

選用共用目的地時,套用會把金鑰複製到專案。之後管理員更換共用目的地的金鑰,這份複本不會自動更新。

引擎保留方式立即備份還原來源
PostgreSQL保留天數,也持續封存預寫式日誌有已成功且含還原資訊的備份
MongoDB表單天數換算成份數。每日保留相同份數,每週保留天數除以 7 後向上取整有已成功且含還原資訊的備份
MySQL所有備份保留,在 S3 儲存貯體設定生命週期清除無,依排程執行已成功且含還原資訊的備份
MariaDB保留天數有已成功且含還原資訊的備份
Dragonfly所有快照保留,在 S3 儲存貯體設定生命週期清除無,依排程與停止時寫入快照最新的快照

PostgreSQL、MongoDB、MariaDB 設定好備份後,按頁面上方的 立即備份,檢查畫面會寫出要備份到哪個目的地,再按 立即備份,到 備份紀錄 等它成功。第一筆成功紀錄出現之前,還沒有可以還原的備份。Dragonfly 的快照不會列在這個頁面,要到 S3 目的地確認快照檔案。

到原資料庫的 備份,按 還原成新的資料庫。選擇 備份,填入未使用的 新資料庫名稱,再檢查並套用。

PostgreSQL、MongoDB、MySQL、MariaDB 只會列出成功且含還原資訊的紀錄。Dragonfly 使用 最新的快照。新資料庫沿用原本的規格,資料停在選定備份當時,原資料庫與應用程式連線保持原樣。

等待新資料庫 就緒,使用它的連線資訊檢查資料。MongoDB 還原會沿用原資料庫的使用者機密,請確認備份與相關機密都保留著。

在新資料庫的還原資訊按 把服務指向這裡。核對變更列出的服務、環境變數與機密參照,再套用,並從應用程式確認讀寫正常。

這個動作只改寫變更裡列出的服務環境變數。寫在設定檔或外部系統裡的連線,要自己更新。沒有出現這個按鈕時,用 接到服務 加入新連線。

原資料庫會繼續執行。確認切換結果與保留需求後,再清除不需要的資料庫。

在資料庫右上角的 更多 選 匯出,瀏覽器會下載由資料庫工具產生的檔案:

引擎工具與下載內容
PostgreSQLpg_dump --format=custom,下載 .dump。
MongoDBmongodump --archive --gzip --oplog,下載 .archive.gz。
MySQLmysqldump --single-transaction,排除系統資料庫,下載 gzip 壓縮的 SQL。
MariaDBmariadb-dump --single-transaction,排除系統資料庫,下載 gzip 壓縮的 SQL。
Dragonfly沒有 匯出 動作,使用快照備份。

匯出透過你的 pods/exec 權限在資料庫容器執行。MySQL 另需讀取其機密的權限。下載失敗或中途停止時,那個檔案不完整,重新匯出一次。

下載的傾印檔可交給相應資料庫工具處理。還原成新的資料庫 使用的是 S3 備份紀錄,沒有上傳傾印檔的欄位。

資料庫頁面顯示 就緒,連線 列出主機和連接埠,就可以使用。設定備份後,備份紀錄 的第一筆顯示成功,才有可以還原的備份。

用 kubectl 等資料庫就緒,每種引擎看的欄位不同:

kubectl -n shop wait --for=condition=Ready cluster.postgresql.cnpg.io/orders --timeout=10m
kubectl -n shop wait --for=jsonpath='{.status.state}'=ready psmdb/catalog --timeout=10m
kubectl -n shop wait --for=condition=Healthy mysqlcluster/shopdb --timeout=10m
kubectl -n shop wait --for=condition=Ready mariadb/blogdb --timeout=10m
kubectl -n shop wait --for=jsonpath='{.status.phase}'=Ready dragonfly/cache --timeout=10m

Zeabur 建立的資料庫物件、機密和備份設定都帶有 zeabur.com/database: <名稱>,用它列出同一個資料庫的物件:

kubectl -n shop get secret,job -l zeabur.com/database=shopdb

MySQL 另有 shopdb-app-setup Job,它建立資料庫 app 和使用者 app,COMPLETIONS 是 1/1 後應用程式才連得上。

備份紀錄是 operator 的物件:

kubectl -n shop get backups.postgresql.cnpg.io -l zeabur.com/database=orders
kubectl -n shop get psmdb-backup
kubectl -n shop get backups.k8s.mariadb.com

PostgreSQL 的 Backup PHASE 是 completed,MongoDB 的備份 STATUS 是 ready,就是成功。MySQL 的排程備份是 MOCO 建立的 CronJob,看 kubectl -n shop get cronjob,job 的結果。

資料庫由各引擎的 operator 管理,Zeabur 只寫 operator 讀的物件。移除 Zeabur 後,operator 照樣運作。下面的 YAML 都是表單用預設值(一個執行個體、小 規格)建立的內容,存成檔案後用 kubectl -n shop apply -f <檔案> 套用。<24 個英數字> 換成自己產生的密碼,例如 openssl rand -base64 18 | tr -d '/+='。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: orders
labels:
zeabur.com/database: orders
spec:
instances: 1
imageName: ghcr.io/cloudnative-pg/postgresql:18-standard-trixie
storage:
size: 5Gi
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
memory: 512Mi

CloudNativePG 會自己建立 orders-app 機密,uri 是完整的連線字串,另有 host、port、username、password、dbname。服務連到 orders-rw,連接埠 5432。

接到服務 只是替服務加環境變數。PostgreSQL 讀機密裡的 uri:

spec:
template:
spec:
containers:
- name: web
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: orders-app
key: uri

其他引擎先從機密讀密碼,再用 $(變數) 組出連線字串。Kubernetes 只會展開寫在前面的變數,所以密碼變數要放在前面:

spec:
template:
spec:
containers:
- name: web
env:
- name: MONGOPASSWORD
valueFrom:
secretKeyRef:
name: catalog-custom-user-secret
key: app
- name: MONGO_URL
value: mongodb://app:$(MONGOPASSWORD)@catalog-rs0.shop.svc:27017/app?replicaSet=rs0&authSource=app

存成 connect.yaml,用 kubectl -n shop patch deployment web --patch-file connect.yaml 套用。MySQL、MariaDB 的 DATABASE_URL 是 mysql://app:$(MYSQLPASSWORD)@<主機>:3306/app,Dragonfly 的 REDIS_URL 是 redis://:$(REDIS_PASSWORD)@cache.shop.svc:6379。

PostgreSQL 的備份用 Barman Cloud 外掛,要建立金鑰機密、ObjectStore 和 ScheduledBackup,再讓 Cluster 用外掛封存預寫式日誌:

apiVersion: v1
kind: Secret
metadata:
name: orders-backups-s3
labels:
zeabur.com/database: orders
type: Opaque
stringData:
ACCESS_KEY_ID: <存取金鑰 ID>
ACCESS_SECRET_KEY: <私密存取金鑰>
REGION: us-east-1
---
apiVersion: barmancloud.cnpg.io/v1
kind: ObjectStore
metadata:
name: orders-backups
labels:
zeabur.com/database: orders
spec:
retentionPolicy: 7d
configuration:
destinationPath: s3://backups/orders
endpointURL: https://s3.example.com
s3Credentials:
accessKeyId:
name: orders-backups-s3
key: ACCESS_KEY_ID
secretAccessKey:
name: orders-backups-s3
key: ACCESS_SECRET_KEY
region:
name: orders-backups-s3
key: REGION
wal:
compression: gzip
data:
compression: gzip
---
apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
name: orders-scheduled
labels:
zeabur.com/database: orders
spec:
schedule: "0 0 3 * * *"
backupOwnerReference: self
cluster:
name: orders
method: plugin
pluginConfiguration:
name: barman-cloud.cloudnative-pg.io
kubectl -n shop patch cluster.postgresql.cnpg.io orders --type=merge \
-p '{"spec":{"plugins":[{"name":"barman-cloud.cloudnative-pg.io","isWALArchiver":true,"parameters":{"barmanObjectName":"orders-backups"}}]}}'

CloudNativePG 的排程有秒的欄位,0 0 3 * * * 是每天 03:00(UTC)。立即備份 是一個 Backup:

apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
name: orders-20261026-030000
labels:
zeabur.com/database: orders
spec:
cluster:
name: orders
method: plugin
pluginConfiguration:
name: barman-cloud.cloudnative-pg.io

其他引擎的備份設定寫在這些地方,名稱規則相同(金鑰機密都叫 <名稱>-backups-s3):

引擎物件
MongoDBPerconaServerMongoDB 的 spec.backup:storages.backups.s3 寫儲存貯體和端點,credentialsSecret 指向金鑰機密(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY),tasks 有一項 scheduled。立即備份是 PerconaServerMongoDBBackup。
MySQLServiceAccount <名稱>-backup、BackupPolicy <名稱>-backups,MySQLCluster 的 spec.backupPolicyName 指向它。
MariaDBBackup <名稱>-scheduled,schedule.cron 是排程,maxRetention 是保留時間。
DragonflyDragonfly 的 spec.args 加 --s3_endpoint、--s3_use_https,spec.env 讀金鑰,spec.snapshot.dir 改成 s3://<儲存貯體>/<資料夾>。

欄位的完整內容,可以先在介面設定一次,再用 kubectl -n shop get <種類> <名稱> -o yaml 對照。

還原會建立新的 Cluster,從 ObjectStore 讀備份。先查備份 ID:

kubectl -n shop get backup.postgresql.cnpg.io orders-20261026-030000 -o jsonpath='{.status.backupId}'

再建立新的 Cluster,spec 照原資料庫,拿掉 plugins,加上 bootstrap.recovery 和 externalClusters:

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: orders-restored-1026
labels:
zeabur.com/database: orders-restored-1026
annotations:
zeabur.com/restored-from: orders
zeabur.com/restored-backup: orders-20261026-030000
spec:
instances: 1
imageName: ghcr.io/cloudnative-pg/postgresql:18-standard-trixie
storage:
size: 5Gi
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
memory: 512Mi
bootstrap:
recovery:
source: orders
database: app
owner: app
recoveryTarget:
backupID: <備份 ID>
targetImmediate: true
externalClusters:
- name: orders
plugin:
name: barman-cloud.cloudnative-pg.io
parameters:
barmanObjectName: orders-backups
serverName: orders

zeabur.com/restored-* annotation 讓介面顯示還原資訊和 把服務指向這裡,不加也能還原。要還原到某個時間點,recoveryTarget 改成 targetTime: "2026-10-26T02:00:00Z"。

  • 要變更 執行個體數、規格 或 每個執行個體的儲存空間,到 設定 修改,再 檢查變更。儲存空間只能擴大,且要使用支援擴充的儲存類別。Dragonfly 的快照磁碟區大小在建立時決定,設定表單不提供擴充。
  • 找不到資料庫引擎時,到 元件 檢查 operator。如果頁面明確顯示無權讀取,向管理員申請對應權限。
  • 建立後一直 未知 或未就緒時,查看 事件 與 日誌,確認 operator、磁碟區、節點資源與映像檔都可用。
  • PostgreSQL 無法設定備份時,先確認 Barman Cloud 外掛已安裝且可讀取。
  • 備份失敗時,閱讀 備份紀錄 的原因,檢查 S3 端點、儲存貯體、金鑰與網路。MySQL 還要有足夠空間配置備份工作的暫存磁碟區。
  • 接到服務 沒有列出目標時,確認專案內已有可修改的應用程式服務。其他工具管理的服務與資料服務不列入這個選單。

只想撤掉應用程式的連線,在 連線 的服務動作選 中斷連線。這會移除相關環境變數,保留資料庫與機密。

要刪除資料庫,在右上角的 更多 選 刪除資料庫。先查看刪除清單、仍在使用它的服務,以及磁碟區的回收政策,再套用。S3 裡的備份會保留,後續依目的地的生命週期政策處理。