PostgreSQ數(shù)據(jù)庫實現(xiàn)在Windows上異地自動備份指南的詳細教程
前期準備
確保網(wǎng)絡連通:確保備份服務器能訪問數(shù)據(jù)庫服務器的5432端口
安裝PostgreSQL客戶端:在備份服務器上安裝PostgreSQL客戶端(只需安裝pg_dump工具即可)
獲取必要信息:
- 數(shù)據(jù)庫服務器IP
- PostgreSQL端口(默認5432)
- 數(shù)據(jù)庫用戶名(如postgres)
- 數(shù)據(jù)庫密碼
要備份的數(shù)據(jù)庫名
實現(xiàn)步驟
步驟一:創(chuàng)建備份腳本
在備份服務器上創(chuàng)建一個批處理文件(比如pg_backup.bat),內容如下:
@echo off REM 設置變量 SET PGPATH=C:\Program Files\PostgreSQL\16\bin\pg_dump.exe SET BACKUP_DIR=D:\pg_backup\ SET DB_HOST=數(shù)據(jù)庫服務器IP SET DB_PORT=5432 SET DB_USER=postgres SET DB_PASS=數(shù)據(jù)庫密碼 SET DB_NAME=要備份的數(shù)據(jù)庫名 SET DATE=%date:~0,4%%date:~5,2%%date:~8,2% SET TIME=%time:~0,2%%time:~3,2%%time:~6,2% REM 創(chuàng)建備份目錄 if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" REM 執(zhí)行備份 echo 正在備份數(shù)據(jù)庫... "%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -w -F c -b -v -f "%BACKUP_DIR%%DB_NAME%_%DATE%_%TIME%.backup" %DB_NAME% REM 傳輸?shù)竭h程服務器(異地存儲) echo 正在傳輸備份文件到遠程服務器... scp "%BACKUP_DIR%%DB_NAME%_%DATE%_%TIME%.backup" 用戶名@遠程服務器IP:/遠程存儲路徑/ REM 清理臨時文件(可選) REM del /f /q "%BACKUP_DIR%%DB_NAME%_%DATE%_%TIME%.backup" echo 備份完成! pause
重要提示:
- 請將
C:\Program Files\PostgreSQL\16\bin\pg_dump.exe替換為你的PostgreSQL實際安裝路徑 - 將數(shù)據(jù)庫服務器IP、數(shù)據(jù)庫密碼、要備份的數(shù)據(jù)庫名等替換為實際值
步驟二:配置免密登錄(可選但推薦)
為了避免每次備份都要輸入密碼,可以在備份服務器上配置免密登錄:
在備份服務器上,創(chuàng)建pgpass.conf文件:
.pgpass文件格式詳解
.pgpass 文件的每一行必須嚴格遵循 5 個字段 的格式:
主機:端口:數(shù)據(jù)庫:用戶名:密碼
例子說明:
182.12.14.22:5432:*:postgres:your_password
| 字段 | 值 | 說明 |
|---|---|---|
| 主機 | 182.12.14.22 | PostgreSQL 服務器 IP 地址 |
| 端口 | 5432 | PostgreSQL 端口號(默認 5432) |
| 數(shù)據(jù)庫 | * | 要連接的數(shù)據(jù)庫名(* 表示匹配所有數(shù)據(jù)庫) |
| 用戶名 | postgres | PostgreSQL 登錄用戶名(通常是超級用戶) |
| 密碼 | your_password | 對應用戶的密碼 |
如果不行,可嘗試另一個辦法:創(chuàng)建配置文件(在文章最后,報錯里面的解決辦法):
步驟三:設置任務計劃程序
- 打開"任務計劃程序"(在開始菜單搜索)
- 點擊"創(chuàng)建基本任務"
- 命名為"PostgreSQL異地備份"
- 選擇觸發(fā)器:每天凌晨2點(避免影響業(yè)務)
- 選擇操作:啟動程序
- 程序/腳本:選擇你創(chuàng)建的
pg_backup.bat文件 - 完成設置
步驟四:測試備份
- 手動運行
pg_backup.bat測試腳本 - 檢查備份文件是否生成在
D:\pg_backup\ - 確認文件是否備份到服務器
實際示例
假設你的配置如下:
PostgreSQL安裝路徑:C:\Program Files\PostgreSQL\16\bin
數(shù)據(jù)庫服務器IP:192.168.1.105
數(shù)據(jù)庫名:mydb
用戶名:postgres
密碼:password123
遠程存儲位置:
那么你的備份腳本應該是:
@echo off
REM PostgreSQL異地自動備份腳本 (優(yōu)化版)
REM 1. 修復日期格式問題 (兼容中文/英文系統(tǒng))
REM 2. 添加完整錯誤檢查和日志
REM 3. 優(yōu)化清理邏輯 (精準刪除30天前文件)
REM 4. 避免彈窗干擾 (后臺靜默運行)
REM 5.請將C:\Program Files\PostgreSQL\16\bin\pg_dump.exe替換為你的PostgreSQL實際安裝路徑
chcp 65001 >nul :: 解決中文亂碼問題
REM export LANG=zh_CN.UTF-8
REM export LC_ALL=zh_CN.UTF-8
title 異地備份正式數(shù)據(jù)庫程序
REM ================ 配置區(qū)域 (請?zhí)鎿Q為你的實際信息) ================
SET PGPATH=C:\Program Files\PostgreSQL\16\bin\pg_dump.exe
SET BACKUP_DIR=E:\pg_backupData\
SET DB_HOST=192.168.1.105
SET DB_PORT=5432
SET DB_USER=postgres
SET DB_PASS=password123
SET DB_NAME=mydb
REM REMOTE_SERVER 和 REMOTE_PATH 不需要了,因為我們直接在備份服務器保存文件
REM ================================================================
REM ================ 1. 創(chuàng)建目錄 ================
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
REM ================ 2. 生成時間戳 ================
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "datetime=%%a"
set "DATE=%datetime:~0,8%"
set "TIME=%datetime:~8,6%"
set "BACKUP_FILE=%DB_NAME%_%DATE%_%TIME%.backup"
SET LOG_FILE=%BACKUP_DIR%backup_%DATE%_%TIME%.log
REM ================ 3. 開始備份(輸出到獨立日志)================
echo [%DATE% %TIME%] === 備份任務開始 === > "%LOG_FILE%"
echo [%DATE% %TIME%] 正在備份數(shù)據(jù)庫... >> "%LOG_FILE%"
"%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -F c -b -v -f "%BACKUP_DIR%%BACKUP_FILE%" %DB_NAME% >> "%LOG_FILE%" 2>&1
REM ================ 4. 檢查備份結果 ================
if %errorlevel% equ 0 (
echo [%DATE% %TIME%] 000000;Success >> "%LOG_FILE%"
echo [%DATE% %TIME%] 備份成功! >> "%LOG_FILE%"
) else (
echo [%DATE% %TIME%] 44444;failure: %errorlevel% >> "%LOG_FILE%"
echo [%DATE% %TIME%] 備份失敗!錯誤代碼: %errorlevel% >> "%LOG_FILE%"
goto :cleanup_logs
)
REM ================ 5. 清理30天前的備份文件(無論成功與否都執(zhí)行)================
echo [%DATE% %TIME%] 清理30天前的備份文件... >> "%LOG_FILE%"
REM 使用 PowerShell 安全清理 .backup 文件(避免 forfiles 兼容性問題)
REM 清理30天前的 .backup 文件
REM 清理30天前的.backup文件
echo [%DATE% %TIME%] Clean .backup files older than 30 days >> "%LOG_FILE%"
powershell -Command "Get-ChildItem '%BACKUP_DIR%\*.backup' | Where-Object {!$_.PSIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-30)} | Remove-Item -Force"
echo [%DATE% %TIME%] Clean .backup files older than 30 days--Success >> "%LOG_FILE%"
REM 清理30天前的.log文件
echo [%DATE% %TIME%] Clean .log files older than 30 days >> "%LOG_FILE%"
powershell -Command "Get-ChildItem '%BACKUP_DIR%\*.log' | Where-Object {!$_.PSIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-30)} | Remove-Item -Force"
echo [%DATE% %TIME%] Clean .log files older than 30 days--Success >> "%LOG_FILE%"
echo [%DATE% %TIME%] === 備份任務完成 === >> "%LOG_FILE%"
重要提醒
- 首次運行時:可能會提示"無法連接",確保數(shù)據(jù)庫服務器防火墻允許5432端口
- 如果使用遠程服務器:確保遠程服務器已安裝OpenSSH或WinSCP
- 備份頻率:根據(jù)業(yè)務需求調整,建議至少每天備份一次
- 測試恢復:每月至少測試一次恢復流程,確保備份可用
詳細任務計劃設置指南
重要:操作前請確保:
- 你的Windows已安裝 OpenSSH(用于
scp命令) - 備份服務器能通過SSH訪問遠程服務器(測試:在CMD中輸入
ssh backup@192.168.1.105)
步驟 1:安裝OpenSSH(如果未安裝)
打開 PowerShell(管理員)
運行:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
重啟電腦
步驟 2:配置任務計劃(詳細操作)
1.打開任務計劃程序:Win + R → 輸入 taskschd.msc → 回車
2.創(chuàng)建基本任務
- 右側 → 創(chuàng)建基本任務
- 任務名稱:
PostgreSQL異地自動備份 - 描述:
每天凌晨2點自動備份數(shù)據(jù)庫并清理30天前文件 - 點擊 下一步
3.設置觸發(fā)器
- 選擇 每天
- 開始時間:
凌晨 2:00(避開業(yè)務高峰) - 點擊 下一步
4.設置操作
選擇 啟動程序
程序/腳本:C:\Windows\System32\cmd.exe
參數(shù):/c "D:\backup\pg_backup.bat"
關鍵:路徑要指向你的腳本位置(如 D:\backup\pg_backup.bat)
起始位置:D:\backup(腳本所在目錄)
點擊 下一步
5.高級設置(必須勾選)
右側點擊 高級設置 → 勾選:
- 使用最高權限運行(否則可能無法訪問目錄)
- 如果任務失敗,重新啟動(重試3次)
- 任務運行時計算機處于空閑狀態(tài)(避免影響用戶)
- 如果任務運行時計算機進入睡眠狀態(tài),不要喚醒計算機
點擊 確定
6.測試任務
在任務列表中右鍵點擊任務 → 運行
檢查日志文件:D:\pg_backup\backup.log
(正常應顯示 備份與清理完成!)
最后檢查清單
- 腳本中所有變量(
DB_HOST,DB_PASS等)已替換為你的實際值 D:\pg_backup\目錄已存在(或腳本會自動創(chuàng)建)- 通過
ssh backup@192.168.1.105測試遠程連接(輸入密碼) - 任務計劃已設置 凌晨2:00(非白天高峰時間)
- 任務屬性勾選了 使用最高權限運行
效果圖
每天凌晨 2 點開始備份,并且刪除 30 天之前的備份(只保留最近30天數(shù)據(jù))

測試信息
20251212 124534] pg_dump: 錯誤: 連接到"192.168.1.105"上的服務器,端口5432失?。篺e_sendauth: no password supplied
問題解析:fe_sendauth: no password supplied錯誤
這個錯誤非常常見,原因很簡單:PostgreSQL 服務器要求密碼驗證。
為什么會出現(xiàn)這個錯誤
在你的腳本中,你使用了 -w 參數(shù)(-w 表示 "不提示密碼"),但數(shù)據(jù)庫要求密碼驗證:
"%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -w -F c -b -v -f "%BACKUP_DIR%%BACKUP_FILE%" %DB_NAME%
當使用 -w 時,pg_dump 會嘗試不提供密碼連接,但數(shù)據(jù)庫要求密碼,所以連接失敗。
解決方案(3種方法)
方法1:創(chuàng)建.pgpass文件(推薦,最安全)
這是最專業(yè)的解決方案,適用于所有系統(tǒng):
1.在備份服務器上創(chuàng)建 .pgpass 文件:
路徑:C:\Users\<你的用戶名>\.pgpass(例如 C:\Users\Admin\.pgpass)
文件內容:
-- 格式:ip+端口+數(shù)據(jù)庫+賬號+密碼
-- 也可以使用通配符
192.168.1.105:5432:mydb:postgres:你的密碼
2.設置文件權限(Windows中無法完全設置,但可以隱藏文件):
右鍵點擊 `.pgpass` 文件 → 屬性 → 勾選 "隱藏" → 應用
為什么這個方法好
- 密碼不會出現(xiàn)在腳本或命令行中
- 符合安全最佳實踐
- 適用于所有自動化腳本
方法2:在腳本中直接提供密碼(不推薦,有安全風險)
如果你堅持要這樣做(**不推薦**,因為密碼會暴露在腳本中):
"%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -W -F c -b -v -f "%BACKUP_DIR%%BACKUP_FILE%" %DB_NAME%
但這樣會在命令行中提示輸入密碼,在自動化腳本中無法工作。
方法3:修改腳本,去掉-w參數(shù)(不推薦)
"%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -F c -b -v -f "%BACKUP_DIR%%BACKUP_FILE%" %DB_NAME%
這樣會提示輸入密碼,但在自動化腳本中無法交互,所以不推薦。
重要提示
確保數(shù)據(jù)庫服務器允許密碼驗證:在 pg_hba.conf 中,確保有類似配置:
host all all 0.0.0.0/0 md5
這表示使用密碼驗證(md5)。
檢查數(shù)據(jù)庫密碼是否正確:在數(shù)據(jù)庫服務器上,可以嘗試用 psql -U postgres 連接,確認密碼是否正確。
根本原因(99% 的情況)
.pgpass 文件不在正確的位置,或 文件名/格式有隱藏問題。
PostgreSQL 在 Windows 上查找 .pgpass 的順序是:
PGPASSFILE環(huán)境變量指定的路徑%APPDATA%\postgresql\pgpass.conf← 這是 Windows 的標準位置!%USERPROFILE%\.pgpass
關鍵發(fā)現(xiàn):你在 C:\Users\Administrator\.pgpass 創(chuàng)建文件,但 PostgreSQL 實際在 %APPDATA%\postgresql\ 下找 pgpass.conf!
終極解決方案(Windows 專用)
步驟 1:創(chuàng)建正確的配置文件
打開文件資源管理器,進入:C:\Users\Administrator\AppData\Roaming\postgresql\
如果 postgresql 文件夾不存在,請手動創(chuàng)建
在該目錄下創(chuàng)建文件 pgpass.conf(注意:不是 .pgpass,而是 pgpass.conf)
文件內容(替換為你的實際值):192.168.1.105:5432:*:postgres:你的密碼

步驟 2:設置文件權限(重要?。?/p>
# 隱藏文件 attrib +h "C:\Users\Administrator\AppData\Roaming\postgresql\pgpass.conf" # 限制訪問(防止安全警告) icacls "C:\Users\Administrator\AppData\Roaming\postgresql\pgpass.conf" /inheritance:r icacls "C:\Users\Administrator\AppData\Roaming\postgresql\pgpass.conf" /grant Administrator:F
步驟 3:修改備份腳本(移除-w參數(shù))
REM 刪除 -w 參數(shù)!因為 pgpass.conf 會自動提供密碼 "%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -F c -b -v -f "%BACKUP_DIR%%BACKUP_FILE%" %DB_NAME%
到此這篇關于PostgreSQ數(shù)據(jù)庫實現(xiàn)在Windows上異地自動備份指南的詳細教程的文章就介紹到這了,更多相關PostgreSQ數(shù)據(jù)庫備份內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 使用Navicat備份數(shù)據(jù)庫MySQL、PostGreSQL等的詳細步驟
- PostgreSQL數(shù)據(jù)庫備份的幾種實現(xiàn)方法
- PostgreSQL數(shù)據(jù)庫備份與恢復的四種辦法
- PostgreSQL數(shù)據(jù)庫備份還原全攻略
- Shell腳本實現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份
- docker運行PostgreSQL數(shù)據(jù)庫維護執(zhí)行腳本備份數(shù)據(jù)庫與更新表結構的方法
- Linux 上 定時備份postgresql 數(shù)據(jù)庫的方法
- docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) 實例代碼
相關文章
Postgresql的pl/pgql使用操作--將多條執(zhí)行語句作為一個事務
這篇文章主要介紹了Postgresql的pl/pgql使用操作--將多條執(zhí)行語句作為一個事務,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL索引掃描時為什么index only scan不返回ctid
這篇文章主要介紹了PostgreSQL索引掃描時為什么index only scan不返回ctid的原因探索,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-09-09
本地計算機上的 postgresql 服務啟動后停止的問題解決
這篇文章主要介紹了本地計算機上的 postgresql 服務啟動后停止的問題解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Postgresql數(shù)據(jù)庫SQL字段拼接方法
Postgresql里面內置了很多的實用函數(shù),下面這篇文章主要給大家介紹了關于Postgresql數(shù)據(jù)庫SQL字段拼接方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11

