Postgresql
將 PostgreSQL 模式及其數據從一個數據庫複製到另一個數據庫
我正在嘗試將 PostgreSQL 架構及其數據從一個數據庫複製到另一個數據庫,而不會影響目前架構 (
old_schema
) 的可用性。我還想對模式中的特定表子集執行此操作,並希望新模式在另一個數據庫中具有不同的名稱。在以下過程中,我將 Python 用於步驟 1. 和 2.,
old_schema
從中獲取我要複製的表名列表。select distinct information_schema.columns.table_name as table_name from information_schema.columns where information_schema.columns.table_schema = 'public' and information_schema.columns.table_name ~ 'lime_.*' ;
- 遍歷表名,在
new_schema
create table if not exists {new_schema}.{lime_table} (like {old_schema}.{lime_table} including all);
並將數據從每個表複製
old_schema
到new_schema
insert into {new_schema}.{lime_table} (select * from {old_schema}.{lime_table});
- 現在我們有了我們想要的表的副本
new_schema
。這是 PostgreSQL 出現意外行為的部分。為了將其遷移
new_schema
到另一個數據庫,我們首先將其轉儲到一個文件中pg_dump.exe --host="<HOST>" --port=<PORT> --username=<USERNAME> --table="lime*" // redundant because of step 1. --format=c --schema=new_schema // our `new_schema` --exclude-schema="public" // doesn't work, public still being written in dump file "<DB_NAME>" > C:\Users\<PATH>\backup.sql
但是,即使在步驟 2 中將表從
public
to複製到之後new_schema
,將 pg_dump 指定為僅 dumpnew_schema
,並且還指定排除public
模式(數據源自的模式),我們仍然會public.<table>
進入轉儲文件!就像這個問題中概述的一樣 - pg_dump 不尊重 -n。
- 如果轉儲工作,計劃是使用以下複製
new_schema
到不同的數據庫。pg_restore.exe --host="<HOST>" --port=<PORT> --username=<USERNAME> --verbose -1 --dbname="<DB_NAME>" C:\Users\<PATH>\backup.sql
我正在使用的 PostgreSQL 版本在轉儲文件中進行了概述。
– 從數據庫版本 10.9.17 轉儲
– 由 pg_dump 版本 14.1 轉儲
如果有人參考手冊,就會發現
-n
和開關在使用-N
時無效-t
,因為-t
無論這些開關如何,都會轉儲by 選擇的表這似乎正是您的情況。與您的評論(
--table="lime*" // redundant because
)相反,該開關實際上覆蓋了您的架構規範。你應該省略--table
.