設定Windows自動備份PostgreSQL Docker容器裡的資料庫

因為前面使用Docker部署Miniflux RSS Reader,是裝在Windows Docker Desktop,考慮之後也許會換到Windows Rancher Desktop或Windows Podman Desktop(?),所以採通用方式來備份。

如何備份和還原資料庫

  1. 開啟命令列進入PostgreSQL容器:

    docker container exec -it  <container-name> bash -l
  2. 建立/var/backups/db資料夾(每行命令分開執行):

    cd /var/backups
    mkdir db
  3. 備份資料庫:

    PGPASSWORD=<db-password> pg_dump -U <db-username> <db-name> -Fc > /var/backups/db/db.dump
  4. 還原資料庫:

    pg_restore -d <db-name> /var/backups/db/db.dump -c -U <db-username>
  5. 離開容器,將容器裡的備份檔複製到本機:

    docker cp <container-name>:/var/backups/db/db.dump C:\Docker\Miniflux
  6. 或是將本機裡的備份檔複製到容器裡:

    docker cp C:\Docker\Miniflux\db\db.dump <container-name>:/var/backups/db

建立自動備份執行檔

  1. Windows使用Notepad++建立BASH:

    #!/bin/bash
    PGPASSWORD=<db-password> pg_dump -U <db-username> <db-name> -Fc > /var/backups/db/$(date +%Y-%m-%d_%H-%M-%S).dump
    cd /var/backups/db
    ls -t | awk 'NR>7' | xargs rm -f

    最後一行是刪除舊的備份檔,保留最新7個備份檔。存檔前換行格式要改成UNIX格式(LF),另存為bash-file.sh

  2. bash-file.sh複製到PostgreSQL容器裡的/var/backups資料夾:

    docker cp C:\Docker\Miniflux\<bash-file.sh> <container-name>:/var/backups
  3. 測試bash-file.sh能否正確執行:

    docker exec -it <container-name> sh /var/backups/<bash-file.sh>
  4. 建立Windows batch──將步驟3命令另存為bat-file-1.bat,以下內容存為bat-file-2.bat

    rd /s /q C:\Docker\Miniflux\db
    timeout /t 2
    docker cp <container-name>:/var/backups/db C:\Docker\Miniflux

    先刪除本機備份檔,再將容器裡的備份檔複製到本機,保持兩邊檔案一致。

  5. bat-file-1.batbat-file-2.bat都丟到Windows的工作排程器,系統便會自動定時備份。


參考文章: