2人参与 • 2026-08-07 • MsSqlserver
在日常运维中,定期备份数据库是保障数据安全的重要手段。本文将详细介绍如何利用 postgresql 自带的 pg_dump 工具配合 windows 任务计划程序,实现每天自动从云端 postgresql 数据库备份指定表到本地 windows 电脑。
pg_dump(postgresql 原生逻辑备份工具).pgpass 文件实现免密登录-f c),支持压缩和灵活恢复在本地电脑创建用于存放备份文件的目录,建议使用纯英文路径以避免编码问题。例如:
d:\backup\postgresql\daily
注意:后续所有路径请根据实际环境修改。
为了在脚本中自动登录数据库而不明文写入密码,需要创建 .pgpass 文件。
在用户主目录(c:\users\你的用户名\)下新建文件 pgpass.conf。
用记事本编辑,写入一行(格式严格,冒号为英文半角):
<数据库主机>:<端口>:<数据库名>:<用户名>:<密码>
例如(替换为你的实际信息):
192.168.1.100:5432:mydb:myuser:mypassword
保存后将文件重命名为 .pgpass(前面带点,无扩展名)。可在命令行执行:
rename pgpass.conf .pgpass
验证:打开命令提示符,执行:
set pgpassfile=%userprofile%\.pgpass psql -h <数据库主机> -p <端口> -u <用户名> -d <数据库名> -c "select 1"
若返回结果 1,则配置成功。
创建一个批处理文件(例如 backup.bat),内容如下。请根据你的环境修改变量部分。
@echo off
chcp 65001 >nul
setlocal
rem ==================== 请修改变量 ====================
set pgpath=c:\program files\postgresql\16\bin\pg_dump.exe
set backup_dir=d:\backup\postgresql\daily
set db_host=your_db_host
set db_port=5432
set db_user=your_db_user
set db_name=your_db_name
rem 需要备份的表(可多个,空格分隔,注意模式名)
set tables=public.table1 public.table2 public.table3
rem ===================================================
rem 指定密码文件位置
set pgpassfile=%userprofile%\.pgpass
rem 创建目录(如果不存在)
if not exist "%backup_dir%" mkdir "%backup_dir%"
rem 生成时间戳(yyyy-mm-dd_hhmmss)
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value') do set datetime=%%i
set timestamp=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%_%datetime:~8,2%%datetime:~10,2%%datetime:~12,2%
set backup_file=%backup_dir%\%db_name%_%timestamp%.backup
rem 构建表参数
set table_args=
for %%t in (%tables%) do set table_args=!table_args! -t %%t
setlocal enabledelayedexpansion
echo 正在备份远程数据库 %db_name% 中的指定表到 %backup_file%
"%pgpath%" -h %db_host% -p %db_port% -u %db_user% -w -f c -b -v !table_args! -f "%backup_file%" %db_name%
if %errorlevel% neq 0 (
echo 备份失败!错误码:%errorlevel%
pause
exit /b %errorlevel%
) else (
echo 备份成功完成!文件保存在: %backup_file%
)
rem 清理 15 天前的备份文件
echo 正在清理 15 天前的备份文件...
forfiles /p "%backup_dir%" /m *.backup /d -15 /c "cmd /c del /q @path" 2>nul
echo 清理完成。
pause脚本关键点:
chcp 65001:切换控制台为 utf-8,避免中文乱码pgpassfile:显式指定密码文件wmic:获取精确时间戳,避免日期格式依赖-f c:自定义格式(压缩,支持 pg_restore)-t:指定表名,可多次使用-w:使用 .pgpass 免密登录forfiles:自动删除 15 天前的备份文件注意:脚本中的变量(如 pgpath、backup_dir、数据库连接信息、表名)需根据实际环境修改。
backup.bat 保存到任意目录(如 d:\scripts\)。backup_dir 目录下生成类似 mydb_2026-08-06_085747.backup 的文件。常见问题排查:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
no password supplied | .pgpass 未生效 | 检查文件路径、格式,并在脚本中设置 pgpassfile |
' is not recognized | 脚本包含特殊字符或编码问题 | 用纯文本编辑器重新编写,确保英文标点 |
| 中文乱码 | 控制台代码页不一致 | 脚本开头添加 chcp 65001 |
| 备份路径错误 | backup_dir 变量写错 | 检查路径是否存在,建议使用绝对路径 |
win + r,输入 taskschd.msc 回车,打开“任务计划程序”。backup.bat。d:\scripts\)。如需更复杂的调度策略(如每周特定几天),可在创建后编辑任务触发器。
在本地(或任意 postgresql 实例)创建一个新的空数据库:
create database new_target_db;
pg_restore -d new_target_db -u postgres "d:\backup\postgresql\daily\mydb_2026-08-06_085747.backup"
如果备份文件中包含多余的对象,而你只想恢复特定的三张表:
pg_restore -d new_target_db -u postgres \ --no-owner --no-privileges \ -t public.table1 \ -t public.table2 \ -t public.table3 \ "d:\backup\postgresql\daily\mydb_2026-08-06_085747.backup"
参数说明:
-d:目标数据库-u:数据库用户-t:指定表名(可多次使用)--no-owner:不恢复所有者信息(避免权限错误)--no-privileges:不恢复权限信息pg_restore -l "备份文件路径.backup"
通过本方案,你可以实现:
| 功能 | 实现方式 |
|---|---|
| 每日定时备份 | windows 任务计划 + pg_dump |
| 仅备份指定表 | -t 参数指定表名列表 |
| 免密登录 | .pgpass 密码文件 |
| 备份文件命名 | 数据库名_yyyy-mm-dd_hhmmss.backup |
| 自动清理过期备份 | forfiles 删除 n 天前文件 |
| 快速恢复 | pg_restore 指定表恢复 |
forfiles /d -15 中的数字。--jobs 参数并行恢复。scp 或云存储工具。本文方案已在 windows 10 + postgresql 16 环境下验证通过,读者可根据自身环境调整相关路径和参数。
以上就是postgresql自动备份之每天定时备份云端指定表到本地的详细步骤的详细内容,更多关于postgresql每天定时备份指定表的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论