PostgreSQ數(shù)據(jù)庫實(shí)現(xiàn)在Windows上異地自動備份指南的詳細(xì)教程
前期準(zhǔn)備
確保網(wǎng)絡(luò)連通:確保備份服務(wù)器能訪問數(shù)據(jù)庫服務(wù)器的5432端口
安裝PostgreSQL客戶端:在備份服務(wù)器上安裝PostgreSQL客戶端(只需安裝pg_dump工具即可)
獲取必要信息:
- 數(shù)據(jù)庫服務(wù)器IP
- PostgreSQL端口(默認(rèn)5432)
- 數(shù)據(jù)庫用戶名(如postgres)
- 數(shù)據(jù)庫密碼
要備份的數(shù)據(jù)庫名
實(shí)現(xiàn)步驟
步驟一:創(chuàng)建備份腳本
在備份服務(wù)器上創(chuàng)建一個批處理文件(比如pg_backup.bat),內(nèi)容如下:
@echo off REM 設(shè)置變量 SET PGPATH=C:\Program Files\PostgreSQL\16\bin\pg_dump.exe SET BACKUP_DIR=D:\pg_backup\ SET DB_HOST=數(shù)據(jù)庫服務(wù)器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(yuǎn)程服務(wù)器(異地存儲) echo 正在傳輸備份文件到遠(yuǎn)程服務(wù)器... scp "%BACKUP_DIR%%DB_NAME%_%DATE%_%TIME%.backup" 用戶名@遠(yuǎn)程服務(wù)器IP:/遠(yuǎn)程存儲路徑/ 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í)際安裝路徑 - 將數(shù)據(jù)庫服務(wù)器IP、數(shù)據(jù)庫密碼、要備份的數(shù)據(jù)庫名等替換為實(shí)際值
步驟二:配置免密登錄(可選但推薦)
為了避免每次備份都要輸入密碼,可以在備份服務(wù)器上配置免密登錄:
在備份服務(wù)器上,創(chuàng)建pgpass.conf文件:
.pgpass文件格式詳解
.pgpass 文件的每一行必須嚴(yán)格遵循 5 個字段 的格式:
主機(jī):端口:數(shù)據(jù)庫:用戶名:密碼
例子說明:
182.12.14.22:5432:*:postgres:your_password
| 字段 | 值 | 說明 |
|---|---|---|
| 主機(jī) | 182.12.14.22 | PostgreSQL 服務(wù)器 IP 地址 |
| 端口 | 5432 | PostgreSQL 端口號(默認(rèn) 5432) |
| 數(shù)據(jù)庫 | * | 要連接的數(shù)據(jù)庫名(* 表示匹配所有數(shù)據(jù)庫) |
| 用戶名 | postgres | PostgreSQL 登錄用戶名(通常是超級用戶) |
| 密碼 | your_password | 對應(yīng)用戶的密碼 |
如果不行,可嘗試另一個辦法:創(chuàng)建配置文件(在文章最后,報錯里面的解決辦法):
步驟三:設(shè)置任務(wù)計劃程序
- 打開"任務(wù)計劃程序"(在開始菜單搜索)
- 點(diǎn)擊"創(chuàng)建基本任務(wù)"
- 命名為"PostgreSQL異地備份"
- 選擇觸發(fā)器:每天凌晨2點(diǎn)(避免影響業(yè)務(wù))
- 選擇操作:啟動程序
- 程序/腳本:選擇你創(chuàng)建的
pg_backup.bat文件 - 完成設(shè)置
步驟四:測試備份
- 手動運(yùn)行
pg_backup.bat測試腳本 - 檢查備份文件是否生成在
D:\pg_backup\ - 確認(rèn)文件是否備份到服務(wù)器
實(shí)際示例
假設(shè)你的配置如下:
PostgreSQL安裝路徑:C:\Program Files\PostgreSQL\16\bin
數(shù)據(jù)庫服務(wù)器IP:192.168.1.105
數(shù)據(jù)庫名:mydb
用戶名:postgres
密碼:password123
遠(yuǎn)程存儲位置:
那么你的備份腳本應(yīng)該是:
@echo off
REM PostgreSQL異地自動備份腳本 (優(yōu)化版)
REM 1. 修復(fù)日期格式問題 (兼容中文/英文系統(tǒng))
REM 2. 添加完整錯誤檢查和日志
REM 3. 優(yōu)化清理邏輯 (精準(zhǔn)刪除30天前文件)
REM 4. 避免彈窗干擾 (后臺靜默運(yùn)行)
REM 5.請將C:\Program Files\PostgreSQL\16\bin\pg_dump.exe替換為你的PostgreSQL實(shí)際安裝路徑
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為你的實(shí)際信息) ================
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 不需要了,因?yàn)槲覀冎苯釉趥浞莘?wù)器保存文件
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. 開始備份(輸出到獨(dú)立日志)================
echo [%DATE% %TIME%] === 備份任務(wù)開始 === > "%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. 檢查備份結(jié)果 ================
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%] === 備份任務(wù)完成 === >> "%LOG_FILE%"
重要提醒
- 首次運(yùn)行時:可能會提示"無法連接",確保數(shù)據(jù)庫服務(wù)器防火墻允許5432端口
- 如果使用遠(yuǎn)程服務(wù)器:確保遠(yuǎn)程服務(wù)器已安裝OpenSSH或WinSCP
- 備份頻率:根據(jù)業(yè)務(wù)需求調(diào)整,建議至少每天備份一次
- 測試恢復(fù):每月至少測試一次恢復(fù)流程,確保備份可用
詳細(xì)任務(wù)計劃設(shè)置指南
重要:操作前請確保:
- 你的Windows已安裝 OpenSSH(用于
scp命令) - 備份服務(wù)器能通過SSH訪問遠(yuǎn)程服務(wù)器(測試:在CMD中輸入
ssh backup@192.168.1.105)
步驟 1:安裝OpenSSH(如果未安裝)
打開 PowerShell(管理員)
運(yùn)行:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
重啟電腦
步驟 2:配置任務(wù)計劃(詳細(xì)操作)
1.打開任務(wù)計劃程序:Win + R → 輸入 taskschd.msc → 回車
2.創(chuàng)建基本任務(wù)
- 右側(cè) → 創(chuàng)建基本任務(wù)
- 任務(wù)名稱:
PostgreSQL異地自動備份 - 描述:
每天凌晨2點(diǎn)自動備份數(shù)據(jù)庫并清理30天前文件 - 點(diǎn)擊 下一步
3.設(shè)置觸發(fā)器
- 選擇 每天
- 開始時間:
凌晨 2:00(避開業(yè)務(wù)高峰) - 點(diǎn)擊 下一步
4.設(shè)置操作
選擇 啟動程序
程序/腳本:C:\Windows\System32\cmd.exe
參數(shù):/c "D:\backup\pg_backup.bat"
關(guān)鍵:路徑要指向你的腳本位置(如 D:\backup\pg_backup.bat)
起始位置:D:\backup(腳本所在目錄)
點(diǎn)擊 下一步
5.高級設(shè)置(必須勾選)
右側(cè)點(diǎn)擊 高級設(shè)置 → 勾選:
- 使用最高權(quán)限運(yùn)行(否則可能無法訪問目錄)
- 如果任務(wù)失敗,重新啟動(重試3次)
- 任務(wù)運(yùn)行時計算機(jī)處于空閑狀態(tài)(避免影響用戶)
- 如果任務(wù)運(yùn)行時計算機(jī)進(jìn)入睡眠狀態(tài),不要喚醒計算機(jī)
點(diǎn)擊 確定
6.測試任務(wù)
在任務(wù)列表中右鍵點(diǎn)擊任務(wù) → 運(yùn)行
檢查日志文件:D:\pg_backup\backup.log
(正常應(yīng)顯示 備份與清理完成!)
最后檢查清單
- 腳本中所有變量(
DB_HOST,DB_PASS等)已替換為你的實(shí)際值 D:\pg_backup\目錄已存在(或腳本會自動創(chuàng)建)- 通過
ssh backup@192.168.1.105測試遠(yuǎn)程連接(輸入密碼) - 任務(wù)計劃已設(shè)置 凌晨2:00(非白天高峰時間)
- 任務(wù)屬性勾選了 使用最高權(quán)限運(yùn)行
效果圖
每天凌晨 2 點(diǎn)開始備份,并且刪除 30 天之前的備份(只保留最近30天數(shù)據(jù))

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

步驟 2:設(shè)置文件權(quán)限(重要?。?/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ù)!因?yàn)?pgpass.conf 會自動提供密碼 "%PGPATH%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -F c -b -v -f "%BACKUP_DIR%%BACKUP_FILE%" %DB_NAME%
到此這篇關(guān)于PostgreSQ數(shù)據(jù)庫實(shí)現(xiàn)在Windows上異地自動備份指南的詳細(xì)教程的文章就介紹到這了,更多相關(guān)PostgreSQ數(shù)據(jù)庫備份內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Navicat備份數(shù)據(jù)庫MySQL、PostGreSQL等的詳細(xì)步驟
- PostgreSQL數(shù)據(jù)庫備份的幾種實(shí)現(xiàn)方法
- PostgreSQL數(shù)據(jù)庫備份與恢復(fù)的四種辦法
- PostgreSQL數(shù)據(jù)庫備份還原全攻略
- Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份
- docker運(yùn)行PostgreSQL數(shù)據(jù)庫維護(hù)執(zhí)行腳本備份數(shù)據(jù)庫與更新表結(jié)構(gòu)的方法
- Linux 上 定時備份postgresql 數(shù)據(jù)庫的方法
- docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) 實(shí)例代碼
相關(guān)文章
PostgreSQL 序列(Sequence) 與 Oracle 序列對比差異分
PostgreSQL 和 Oracle 都提供了序列(Sequence)功能,但在實(shí)現(xiàn)細(xì)節(jié)和使用方式上存在一些重要差異,下面給大家介紹PostgreSQL 序列(Sequence) 與 Oracle 序列對比差異分析,感興趣的朋友一起看看吧2025-05-05
postgresql高級應(yīng)用之行轉(zhuǎn)列&匯總求和的實(shí)現(xiàn)思路
這篇文章主要介紹了postgresql高級應(yīng)用之行轉(zhuǎn)列&匯總求和的實(shí)現(xiàn)思路,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05
postgresql 計算距離的實(shí)例(單位直接生成米)
這篇文章主要介紹了postgresql 計算距離的實(shí)例(單位直接生成米),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
淺談PostgreSQL 11 新特性之默認(rèn)分區(qū)
這篇文章主要介紹了淺談PostgreSQL 11 新特性之默認(rèn)分區(qū),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
pgsql 實(shí)現(xiàn)用戶自定義表結(jié)構(gòu)信息獲取
這篇文章主要介紹了pgsql 實(shí)現(xiàn)用戶自定義表結(jié)構(gòu)信息獲取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
一文詳解數(shù)據(jù)庫中如何使用explain分析SQL執(zhí)行計劃
Explain是SQL分析工具中非常重要的一個功能,它可以模擬優(yōu)化器執(zhí)行查詢語句,幫助我們理解查詢是如何執(zhí)行的,這篇文章主要介紹了數(shù)據(jù)庫中如何使用explain分析SQL執(zhí)行計劃的相關(guān)資料,需要的朋友可以參考下2025-06-06
基于postgresql數(shù)據(jù)庫鎖表問題的解決
這篇文章主要介紹了基于postgresql數(shù)據(jù)庫鎖表問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

