2017-07-19 94 views
0

我在服務器中有三個postgresql數據庫:db1db2db3。現在我想將每個數據庫中的表保存到新的數據庫dbnew並與schemas區分開來。這意味着該數據庫中有三種模式dbnew.db1,dbnew.db2,dbnew.db3。什麼是最簡單的方法來實現它?Postgresql:將不同的數據庫複製到具有不同架構的一個數據庫中

(PS:我有傾倒數據庫的本地文件。)

我測試來自@a_horse_with_no_name答案,似乎工作,但有一個新的問題如下:

如果db1有是postgis的擴展名,然後我加載db1psql,並將public重命名爲db1,然後創建一個名爲public的新模式。我無法爲public架構創建擴展postgis,因爲它顯示extension postgis already exists。但是,如果我使用命令\dx,則表明擴展名在模式db1中,而不在dbnew中。即使我使用create EXTENSION postgis with schema public它也不起作用。

回答

1

基於備份/平原和恢復使用PSQL

我認爲,這是創建於dbnew的模式和架構的權限設置爲用戶做所有使用PSQL恢復。

以某種方式創建sql文件(在pgadmin3中備份爲簡單文件),可以使用psql將結果文件加載到dbnew數據庫中,但它們應通過sed或grep進行管道連接,以便所有表名都獲取模式前綴。

以某種方式我的意思是,從原始備份或首先恢復您的備份到一個臨時數據庫,如果他們沒有SQL,並將它們備份爲純文本。

1

假設所有表都存儲在源數據庫

導入第一轉儲public模式(通過運行psql ... -f dumpfile.sql),然後重命名公共方案,以新的名稱:

alter schema schema public rename to db1; 

然後再 - 創建公共模式:

create schema public; 

現在對其他兩個數據庫腳本做同樣的事情。

+1

解決方案非常好,可以將二進制備份到新數據庫中,速度非常快。但第二次重命名將失敗,因爲該架構已經存在。有效的方法是使用「alter table public。 set schema dbnew;」用於公共模式中的每個表。 – aschoerk

+0

我發現如果我使用擴展名重命名模式,並且如果我想在'public'模式中創建擴展名,則失敗。 – natsuapo

相關問題