Windows 10下如何将PostgreSQL 14.1的实时数据库目录原子同步至多个本地磁盘
Windows 10下如何将PostgreSQL 14.1的实时数据库目录原子同步至多个本地磁盘
我完全懂你的痛点:要把正在运行的PostgreSQL数据目录实时、一致地镜像到多块本地磁盘,不想装额外软件,还得保证镜像能直接用来恢复——毕竟定时Robocopy会有数据丢失窗口,直接复制运行中的PG文件又会损坏数据。结合Windows 10 Pro自带的工具,给你一套可行的方案:
核心思路:用VSS快照+Robocopy+任务计划实现准实时一致同步
PostgreSQL 10+支持Windows的卷影复制服务(VSS),能在不停止服务的情况下创建数据目录的一致快照。我们可以用命令行版的VSS工具diskshadow生成快照,再用robocopy从快照同步到目标磁盘,最后用任务计划高频触发这个流程,把数据丢失窗口压缩到最小。
步骤1:编写VSS快照脚本
创建两个文本文件,放在同一个目录下(比如C:\PGSyncScripts):
1.1 创建快照脚本 create_snapshot.dsh
set context persistent add volume C: alias PGVol create expose %PGVol% P:
这个脚本会给C盘创建一个持久化快照,并把快照挂载为P:盘(如果P盘被占用,换成其他闲置盘符即可)。
1.2 清理快照脚本 cleanup_snapshot.dsh
delete shadows volume C: unexpose P:
用来同步完成后删除快照、释放挂载盘符。
步骤2:编写同步批处理脚本
创建SyncPGDB.bat,同样放在C:\PGSyncScripts目录:
@echo off setlocal enabledelayedexpansion :: 定义路径(根据你的实际情况修改) set SOURCE_PATH=P:\whatever\PGDB set TARGET_D=D:\mirror\PGDB set TARGET_E=E:\mirror\PGDB set TARGET_F=F:\mirror\PGDB set SCRIPT_DIR=C:\PGSyncScripts echo 开始创建VSS快照... diskshadow /s "%SCRIPT_DIR%\create_snapshot.dsh" if errorlevel 1 ( echo 创建快照失败! goto cleanup_and_exit ) echo 同步到D盘... robocopy "%SOURCE_PATH%" "%TARGET_D%" /MIR /COPYALL /R:0 /W:0 /NP :: Robocopy返回值0-7是成功,8及以上是错误 if errorlevel 8 ( echo D盘同步失败! goto cleanup_and_exit ) echo 同步到E盘... robocopy "%SOURCE_PATH%" "%TARGET_E%" /MIR /COPYALL /R:0 /W:0 /NP if errorlevel 8 ( echo E盘同步失败! goto cleanup_and_exit ) echo 同步到F盘... robocopy "%SOURCE_PATH%" "%TARGET_F%" /MIR /COPYALL /R:0 /W:0 /NP if errorlevel 8 ( echo F盘同步失败! goto cleanup_and_exit ) echo 所有磁盘同步完成! goto cleanup_and_exit :cleanup_and_exit echo 清理VSS快照... diskshadow /s "%SCRIPT_DIR%\cleanup_snapshot.dsh" endlocal exit /b
/MIR:镜像模式,会删除目标目录中源目录没有的文件,保持完全一致/COPYALL:复制所有文件属性(权限、时间戳等),保证镜像和源目录完全一致/R:0 /W:0:遇到错误不重试、不等待,适合批量自动化执行
步骤3:用任务计划程序实现高频触发
- 打开「任务计划程序」,点击「创建任务」
- 常规标签:勾选「使用最高权限运行」(VSS需要管理员权限),设置任务名称比如「PGDB实时同步」
- 触发器标签:点击「新建」,选择「每天」,设置重复间隔为1分钟,持续时间「24小时」,这样每分钟执行一次同步
- 操作标签:点击「新建」,操作选择「启动程序」,程序或脚本选择你的
SyncPGDB.bat路径 - 设置标签:勾选「如果任务运行时间超过X小时就停止」(比如2小时),勾选「如果任务失败,每隔X分钟重试」(比如5分钟)
关键注意事项
- 验证VSS Writer:打开命令提示符(管理员),运行
vssadmin list writers,找到「PostgreSQL Writer」,确保状态是「稳定」,如果没有,检查PostgreSQL服务是否正常运行 - 盘符冲突:如果
P:被占用,修改两个.dsh脚本里的盘符为其他闲置字母 - 磁盘空间:确保D/E/F盘有足够空间容纳PG数据目录,Robocopy会在空间不足时报错
- 恢复测试:定期测试恢复流程——停止PostgreSQL服务,把镜像目录复制回C盘的原路径,启动服务,确认数据库能正常运行
这样一套下来,用的全是Windows 10 Pro自带工具,不需要额外软件,而且每次同步的都是一致的快照,镜像目录可以直接用来恢复,数据丢失窗口最多1分钟,比每日备份靠谱多了。
备注:内容来源于stack exchange,提问作者Kabe
相关产品推荐
相关产品推荐

