POSTGRES逻辑备份与恢复(bat脚本)
项目需求:java实现postgreSQL数据库的备份恢复,研究一番中文文档,决定使用逻辑备份,查阅大量资料没有完整解决方案,星星点点。最后自己整合一下在项目中的使用(仅适用于自己)。
备份
我在程序中使用,前提是配置了postgreSQL的系统环境变量,所以bat(批处理)文件在哪里都能执行生效,如果没有配置系统环境变量,只能把批处理文件放在和pg_dump.exe工具所在的文件夹下(不建议)。
脚本文件名(自定义):我的叫pgdump.bat,简单明了
内容:
@echo off (这玩意儿加不加都可以,我没加,至于怎么用,自行百度)
set database=%1 //此为数据库名
set server=localhost //此为ip,我的项目不需要远程连接,根据实际情况定
set port=%2 //端口
set username=%3 //用户名
set PGPASSWORD=%4 //此为设置临时系统变量,数据库密码,此举为解决psql交互式登录问题
set back_path=%5 //备份文件需要存放的路径,按需而定
if not exist %back_path% md %back_path% //不存在就创建
set file_string=%back_path%%6 //参数6代表备份出来的文件叫啥名
set file=%file_string%.tar
pg_dump -U%username% -Fc -d %database% -f %file% //备份命令
完整命令:
pg_dump -U用户名 -Fc -d 数据库名 -f 存储路径\文件名.后缀名
例如:
pg_dump -Upostgres -Fc -d abc -f D:\files\abc.tar
参数:%1、%2、%3…在代码中按指定顺序传入,不能乱。
我的代码写的比较垃圾,贴出来喷一喷
代码:
String dirpath = System.getProperty(“user.dir”);//获取我的程序所在的目录(因为我的bat脚本放在这个目录下)
String[] split = dirpath.split("\\");//截取路径
String base = split[0];//获取盘符
String backupName=xxx;//我获取的数据库名
stringBuffer.append(“pgdump.bat “”)
.append(database).append(”" “)
.append(port).append(” “)//空格必须拼上
.append(user).append(” “)
.append(pwd).append(” “)
.append(filepath).append(” “)
.append(filename);
String cmd=stringBuffer.toString();
String baseCmd=“cmd /c “+base+”&&”+“cd “”+dirpath+””&&"+cmd;
Process process = Runtime.getRuntime().exec(baseCmd);//执行程序,往下就不写了
完整命令长这样():
cmd /c E:&&cd “E:\abc”&&pgdump.bat “postgres” 5432 postgres root D:\backup\postgres backuppostgres
恢复
恢复所作的工作比较多,复杂但不算难,对于我这种没接触过的小白来说,头发挺费的。
不废话,恢复脚本和备份脚本放在一个路径下,一会儿代码会省略些东西。
脚本名(自定义):pgrestore.bat
为什么用restore不用psql:
pg_restore处理数据量大的数据库非常有优势,psql可能会恢复失败或丢失数据(不精通,可能我说的有问题),这是我自己操作过程中发生的。所以选择了pg_restore方式,
但请注意我备份脚本中命令的参数 -Fc ,此设置生成的备份文件为自定义的二进制归档文件(不要纠结这个),此参数生成的文件只能用pg_restore来进行恢复。
脚本内容:
@echo off
set database=%1
set server=localhost
set port=%2
set username=%3
set PGPASSWORD=%4
set back_path=%5
if not exist %back_path% md %back_path%
set file_string=%back_path%%6
set file=%file_string%.tar
pg_restore -U%username% -Fc -d %database% %file%
这里边的参数就不解释了,和上边一样。
完整命令:
pg_restore -Upostgres -Fc -d abc -f D:\files\abc.tar
使用过程:
1.先清理要恢复的数据库正在使用的连接:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname=‘dbName(要恢复的数据库名)’ AND pid<>pg_backend_pid();
2.先删除数据库(我的比较暴力,不知道有没有别的方法可以不删除)
3.创建同名数据库(记得用模板):
create database “dbName” WITH TEMPLATE template0;
4.恢复:
代码:
String backupName=xxx;//我获取的数据库名
stringBuffer.append(“pgrestore.bat “”)
.append(database).append(”" “)
.append(port).append(” “)//空格必须拼上
.append(user).append(” “)
.append(pwd).append(” “)
.append(filepath).append(” “)
.append(filename);
String cmd=stringBuffer.toString();
String baseCmd=“cmd /c “+base+”&&”+“cd “”+dirpath+””&&"+cmd;
Process process = Runtime.getRuntime().exec(baseCmd);
这里边的脚本参数填充后,数据库系统环境变量配置完成后,可以桌面直接执行试试,就这样吧,写不下去了,改bug去了。