it编程 > 数据库 > MsSqlserver

PostgreSQL自动备份之每天定时备份云端指定表到本地的详细步骤

2人参与 2026-08-07 MsSqlserver

背景

在日常运维中,定期备份数据库是保障数据安全的重要手段。本文将详细介绍如何利用 postgresql 自带的 pg_dump 工具配合 windows 任务计划程序,实现每天自动从云端 postgresql 数据库备份指定表到本地 windows 电脑

典型场景

技术选型

详细实施步骤

第一步:准备本地目录

在本地电脑创建用于存放备份文件的目录,建议使用纯英文路径以避免编码问题。例如:

d:\backup\postgresql\daily

注意:后续所有路径请根据实际环境修改。

第二步:配置.pgpass免密文件

为了在脚本中自动登录数据库而不明文写入密码,需要创建 .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)

创建一个批处理文件(例如 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

脚本关键点

注意:脚本中的变量(如 pgpathbackup_dir、数据库连接信息、表名)需根据实际环境修改。

第四步:测试脚本

  1. backup.bat 保存到任意目录(如 d:\scripts\)。
  2. 双击运行,观察控制台输出。
  3. 如果成功,会在 backup_dir 目录下生成类似 mydb_2026-08-06_085747.backup 的文件。

常见问题排查

错误现象可能原因解决方法
no password supplied.pgpass 未生效检查文件路径、格式,并在脚本中设置 pgpassfile
' is not recognized脚本包含特殊字符或编码问题用纯文本编辑器重新编写,确保英文标点
中文乱码控制台代码页不一致脚本开头添加 chcp 65001
备份路径错误backup_dir 变量写错检查路径是否存在,建议使用绝对路径

第五步:设置 windows 任务计划

  1. win + r,输入 taskschd.msc 回车,打开“任务计划程序”。
  2. 右侧点击“创建基本任务…”。
  3. 名称:填写任务名称(如 “postgresql 每日备份”)。
  4. 触发器:选择“每天”,设置执行时间(如凌晨 2:00)。
  5. 操作:选择“启动程序”。
    • 程序或脚本:浏览选择你的 backup.bat
    • 起始于(可选):填写脚本所在目录(例如 d:\scripts\)。
  6. 点击“完成”即可。

如需更复杂的调度策略(如每周特定几天),可在创建后编辑任务触发器。

数据恢复方法

1. 准备目标数据库

在本地(或任意 postgresql 实例)创建一个新的空数据库:

create database new_target_db;

2. 恢复整个备份

pg_restore -d new_target_db -u postgres "d:\backup\postgresql\daily\mydb_2026-08-06_085747.backup"

3. 仅恢复指定的表(推荐)

如果备份文件中包含多余的对象,而你只想恢复特定的三张表:

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"

参数说明

4. 查看备份内容(可选)

pg_restore -l "备份文件路径.backup"

总结

通过本方案,你可以实现:

功能实现方式
每日定时备份windows 任务计划 + pg_dump
仅备份指定表-t 参数指定表名列表
免密登录.pgpass 密码文件
备份文件命名数据库名_yyyy-mm-dd_hhmmss.backup
自动清理过期备份forfiles 删除 n 天前文件
快速恢复pg_restore 指定表恢复

扩展建议

本文方案已在 windows 10 + postgresql 16 环境下验证通过,读者可根据自身环境调整相关路径和参数。

以上就是postgresql自动备份之每天定时备份云端指定表到本地的详细步骤的详细内容,更多关于postgresql每天定时备份指定表的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

SQLi-Labs 基础注入实战教程详解(Less-1 ~ Less-5and Less-9)

08-05

SQL image转汉字乱码处理的问题解决

08-03

SQL PARTITION BY用法小结

08-03

SQL中优化IN的几种方法

08-03

SQL Server DML 操作的项目实战

08-03

你以为迁移完事了?其实这些 SQL 逻辑陷阱正悄悄等着你呢(七大逻辑陷阱及修复方案)

08-02

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论