2015-09-04 53 views
6

我使用pg_dump的当前备份整个数据库的一部分:PHP备份整个PostgreSQL数据库,然后恢复表

<?php 

include_once("../db.php"); 

$password = getPGPassword(); 
$user = getPGUser(); 
$db = getPGDb(); 

putenv("PGPASSWORD=" . $password); 
$dumpcmd = array("pg_dump", "-i", "-U", escapeshellarg($user), "-F", "c", "-b", "-v", "-f", escapeshellarg('/var/www/backups/backup-'.time().'.sql'), escapeshellarg($db)); 
exec(join(' ', $dumpcmd), $cmdout, $cmdresult); 
putenv("PGPASSWORD"); 

?> 

我知道我可以使用PSQL恢复整个数据库,但有什么办法我可以选择性地使用查询恢复表的一部分?我能想到的最简单的事情是用psql创建一个临时数据库,从所需的表中读取行,根据主要序列键删除冲突的行,然后插入表中。

有没有更好的方法来做到这一点?我需要完整的SQL查询功能。

+2

为什么要将PHP带入图片? – e4c5

+0

我有一个用户界面和一个管理界面。从用户界面可以更改数据库。从管理界面我希望能够使用PHP脚本恢复一行,因此不必手动/从命令行完成。 – maxhud

+0

在这种情况下,如果您以'纯文本'格式创建转储文件,则PHP脚本应能够遍历文件,直到找到感兴趣的主键并仅插入该行。 – e4c5

回答

1

在我看来,最简单有效的解决方法是:

  • 另一台机器上安装一个备份服务器,
  • 执行dump /定期或根据需要恢复,
  • 连接主,备使用外部数据封装器的服务器postgres_fdw

在我的实践中,即使是相对较小的项目,备份服务器也是强制性的。数据复制可以通过多种方式完成。 转储/恢复(可能使用cron)是最简单的一种,但配置流式复制也不是特别困难。

如果我们必须考虑到成本,备份服务器可以是任何带有任何操作系统的PC或笔记本电脑。 我认为即使在家里也可以轻松完成。

拥有备份服务器的好处是多方面的。有时候它是节省生命的解决方案。

+0

很棒的回答。谢谢。 Idk为什么我没有使用单独的服务器。 – maxhud