postgresql不像mysql备份可以在一句命令中执行
pg数据库只能运行备份命令再输入密码的方式登录备份
以下批处理脚本中,我们通过vbs来完成自动键入密码的交互工作
原设想把所有公用的变量参数提到顶部设置,但是其中有部分不可一用变量就失败,故可以看见下方实现时还是会有具体位置或数据库名出现
echo off
rem 功能:postgresql windows 平台 自动备份脚本
rem 设置pgsql的bin目录
set pgPath=
E:/database/postgresql/bin/
rem 设置备份的数据库名
set databasename=
dbname
rem 设置备份目录
set backupDir=
d:/backup
rem 获取日期
echo %date%
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set Filename=%databasename%_%year%%month%%day%.bak
rem 输出密码脚本,缺点很明显密码暴露 (我找到的自动输入密码的方法)
echo set pws=WScript.CreateObject("WScript.Shell")>
d:/backup/pws.vbs
echo pws.SendKeys "
asdf1234{ENTER}">>
d:/backup/pws.vbs
rem 执行脚本自动输入密码(我找到的自动输入密码的方法)
wscript
d:/backup/pws.vbs&"%pgPath%/pg_dump.exe" -i -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -f "d:/backup/%Filename%"
dbname
rem 删除脚本
cd %backupDir%
set delvbs=
pws.vbs
echo %backupDir%/pws.vbs
del %delvbs%
rem 将备份文件打包成rar格式,并删除原始备份文件。(确保你已经安装了winrar,如果你没有安装在默认目录,请根据winrar文件的位置修改路径)
rem @if exist d:/backup/"%Dirname%/%Filename%" ("%ProgramFiles%/winrar/winrar" a -df "d:/backup/%Dirname%/%Filename%.rar" "d:/backup/%Dirname%/%Filename%")
echo 开始删除%database%数据库,只保留最近两天
REM ----------------删除前天的数据库,保留最近两天的库
@echo off & setlocal ENABLEEXTENSIONS
call :Date2Day %date:~0,10% sdays
set /a sdays-=2
call :Day2Date %sdays% difdate
echo.&echo.
echo %difdate%
set yy=%difdate:~0,4%
set mm=%difdate:~5,2%
set dd=%difdate:~8,2%
set delfilename=%databasename%_%yy%%mm%%dd%.bak
echo delete file %delfilename%
cd %backupDir%
del %delfilename%
:Date2Day
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (
set yy=%%a & set mm=%%b & set dd=%%c
)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF
:Day2Date
setlocal ENABLEEXTENSIONS
set /a i=%1,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%-%mm%-%dd%&goto :EOF
@echo on
标红为需要根据实际环境修改的,最下方为两个函数