阐述下背景:
最近公司项目中有个功能模块,需要使用java实现pgsql数据库整库的数据备份,没有pgsql使用经验的我,在网上寻找了好多大神的帖子,也没发现适合自己当前场景的解决方案,但是我把大神们的帖子按照自己的思路,整合了一下,最终终于解决了,一身轻松呀,也许这就是翻越一座困难大山后的愉悦感,只能说是很爽,坚持就是胜利。
先捋一下思路吧:
1、找到合适的备份命令:
pg_dump -h localhost -U postgres mbssdbnew > E:\postgres_db.sql
2、发现在pgsql安装路径的bin目录下cmd执行上面命令,发现需要输入密码
3、输入密码后可以成功备份,如下图
4、但问题来了,pg_dump命令不支持输入密码,我们在java程序里面如何实现免密备份呢?我也找了好多博主的帖子,没有发现在java执行命令里面输入密码完成备份的案例。但是发现还有另外一种方式可以实现免密方式,那就是通过配置文件.pgpass的方式实现,网上的帖子大多都是linux环境里如何操作配置文件的,我想法找到了windows中.pgpass的存在形态为:
以win10为例,文件路径为:
C:\Users\用户名\AppData\Roaming\postgresql\pgpass.conf,如下图:
在Roaming目录下新建postgresql目录,并新建pgpass.conf配置文件,将要免密备份的数据库信息放到其中:
localhost:5432:需要备份的数据库:用户名:你的密码
5、建好配置文件后,无需重启数据库,直接上代码,发现备份成功!豁然开朗呀老铁。代码拿去不谢。
public static void main(String[] args) throws IOException {
List<String> command = new ArrayList<String>();
command.add("D:\\dev_tools\\postgresql\\bin\\pg_dump");
command.add("-h");
command.add("localhost");
command.add("-U");
command.add("postgres");
command.add("-d");
command.add("mbssdbnew");
command.add("-f");
command.add("E:\postgres_db.sql");
try {
ProcessBuilder pb = new ProcessBuilder(command).redirectErrorStream(true);
Process process = pb.start();
BufferedReader r = new BufferedReader(
new InputStreamReader(process.getInputStream(), "gbk"));
String line = r.readLine();
while (line != null) {
System.err.println(line);
line = r.readLine();
}
r.close();
} catch (Exception e) {
e.printStackTrace();
}
}
最后每日一语:但行好事,莫问前程。