15人参与 • 2025-12-15 • Windows
确保网络连通:确保备份服务器能访问数据库服务器的5432端口
安装postgresql客户端:在备份服务器上安装postgresql客户端(只需安装pg_dump工具即可)
获取必要信息:
要备份的数据库名
在备份服务器上创建一个批处理文件(比如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=数据库服务器ip set db_port=5432 set db_user=postgres set db_pass=数据库密码 set db_name=要备份的数据库名 set date=%date:~0,4%%date:~5,2%%date:~8,2% set time=%time:~0,2%%time:~3,2%%time:~6,2% rem 创建备份目录 if not exist "%backup_dir%" mkdir "%backup_dir%" rem 执行备份 echo 正在备份数据库... "%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 传输到远程服务器(异地存储) 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实际安装路径为了避免每次备份都要输入密码,可以在备份服务器上配置免密登录:
在备份服务器上,创建pgpass.conf文件:
.pgpass文件格式详解
.pgpass 文件的每一行必须严格遵循 5 个字段 的格式:
主机:端口:数据库:用户名:密码
例子说明:
182.12.14.22:5432:*:postgres:your_password
| 字段 | 值 | 说明 |
|---|---|---|
| 主机 | 182.12.14.22 | postgresql 服务器 ip 地址 |
| 端口 | 5432 | postgresql 端口号(默认 5432) |
| 数据库 | * | 要连接的数据库名(* 表示匹配所有数据库) |
| 用户名 | postgres | postgresql 登录用户名(通常是超级用户) |
| 密码 | your_password | 对应用户的密码 |
如果不行,可尝试另一个办法:创建配置文件(在文章最后,报错里面的解决办法):
pg_backup.bat文件pg_backup.bat测试脚本d:\pg_backup\假设你的配置如下:
postgresql安装路径:c:\program files\postgresql\16\bin
数据库服务器ip:192.168.1.105
数据库名:mydb
用户名:postgres
密码:password123
远程存储位置:
那么你的备份脚本应该是:
@echo off
rem postgresql异地自动备份脚本 (优化版)
rem 1. 修复日期格式问题 (兼容中文/英文系统)
rem 2. 添加完整错误检查和日志
rem 3. 优化清理逻辑 (精准删除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 异地备份正式数据库程序
rem ================ 配置区域 (请替换为你的实际信息) ================
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. 创建目录 ================
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%] 正在备份数据库... >> "%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天前的备份文件(无论成功与否都执行)================
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%"
重要提醒
重要:操作前请确保:
scp命令)ssh backup@192.168.1.105)打开 powershell(管理员)
运行:
add-windowscapability -online -name openssh.client~~~~0.0.1.0
重启电脑
1.打开任务计划程序:win + r → 输入 taskschd.msc → 回车
2.创建基本任务
postgresql异地自动备份每天凌晨2点自动备份数据库并清理30天前文件3.设置触发器
凌晨 2:00(避开业务高峰)4.设置操作
选择 启动程序
程序/脚本:c:\windows\system32\cmd.exe
参数:/c "d:\backup\pg_backup.bat"
关键:路径要指向你的脚本位置(如 d:\backup\pg_backup.bat)
起始位置:d:\backup(脚本所在目录)
点击 下一步
5.高级设置(必须勾选)
右侧点击 高级设置 → 勾选:
点击 确定
6.测试任务
在任务列表中右键点击任务 → 运行
检查日志文件:d:\pg_backup\backup.log
(正常应显示 备份与清理完成!)
db_host, db_pass等)已替换为你的实际值d:\pg_backup\ 目录已存在(或脚本会自动创建)ssh backup@192.168.1.105 测试远程连接(输入密码)每天凌晨 2 点开始备份,并且删除 30 天之前的备份(只保留最近30天数据)

20251212 124534] pg_dump: 错误: 连接到"192.168.1.105"上的服务器,端口5432失败:fe_sendauth: no password supplied
这个错误非常常见,原因很简单:postgresql 服务器要求密码验证。
在你的脚本中,你使用了 -w 参数(-w 表示 "不提示密码"),但数据库要求密码验证:
"%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 会尝试不提供密码连接,但数据库要求密码,所以连接失败。
方法1:创建.pgpass文件(推荐,最安全)
这是最专业的解决方案,适用于所有系统:
1.在备份服务器上创建 .pgpass 文件:
路径:c:\users\<你的用户名>\.pgpass(例如 c:\users\admin\.pgpass)
文件内容:
-- 格式:ip+端口+数据库+账号+密码
-- 也可以使用通配符
192.168.1.105:5432:mydb:postgres:你的密码
2.设置文件权限(windows中无法完全设置,但可以隐藏文件):
右键点击 `.pgpass` 文件 → 属性 → 勾选 "隐藏" → 应用
为什么这个方法好
方法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参数(不推荐)
"%pgpath%" -h %db_host% -p %db_port% -u %db_user% -f c -b -v -f "%backup_dir%%backup_file%" %db_name%
这样会提示输入密码,但在自动化脚本中无法交互,所以不推荐。
确保数据库服务器允许密码验证:在 pg_hba.conf 中,确保有类似配置:
host all all 0.0.0.0/0 md5
这表示使用密码验证(md5)。
检查数据库密码是否正确:在数据库服务器上,可以尝试用 psql -u postgres 连接,确认密码是否正确。
.pgpass 文件不在正确的位置,或 文件名/格式有隐藏问题。
postgresql 在 windows 上查找 .pgpass 的顺序是:
pgpassfile 环境变量指定的路径%appdata%\postgresql\pgpass.conf ← 这是 windows 的标准位置!%userprofile%\.pgpass关键发现:你在 c:\users\administrator\.pgpass 创建文件,但 postgresql 实际在 %appdata%\postgresql\ 下找 pgpass.conf!
步骤 1:创建正确的配置文件
打开文件资源管理器,进入:c:\users\administrator\appdata\roaming\postgresql\
如果 postgresql 文件夹不存在,请手动创建
在该目录下创建文件 pgpass.conf(注意:不是 .pgpass,而是 pgpass.conf)
文件内容(替换为你的实际值):192.168.1.105:5432:*:postgres:你的密码

步骤 2:设置文件权限(重要!)
# 隐藏文件 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参数)
rem 删除 -w 参数!因为 pgpass.conf 会自动提供密码 "%pgpath%" -h %db_host% -p %db_port% -u %db_user% -f c -b -v -f "%backup_dir%%backup_file%" %db_name%
到此这篇关于postgresq数据库实现在windows上异地自动备份指南的详细教程的文章就介绍到这了,更多相关postgresq数据库备份内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论