2015-09-04 116 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