Postgresql

將 PostgreSQL 模式及其數據從一個數據庫複製到另一個數據庫

  • December 23, 2021

我正在嘗試將 PostgreSQL 架構及其數據從一個數據庫複製到另一個數據庫,而不會影響目前架構 ( old_schema) 的可用性。我還想對模式中的特定表子集執行此操作,並希望新模式在另一個數據庫中具有不同的名稱。

在以下過程中,我將 Python 用於步驟 1. 和 2.,

  1. 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_.*'
   ;
  1. 遍歷表名,在new_schema
   create table if not exists {new_schema}.{lime_table} (like {old_schema}.{lime_table} including all);

並將數據從每個表複製old_schemanew_schema

   insert into {new_schema}.{lime_table} (select * from {old_schema}.{lime_table});
  1. 現在我們有了我們想要的表的副本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 中將表從publicto複製到之後new_schema,將 pg_dump 指定為僅 dump new_schema,並且還指定排除public模式(數據源自的模式),我們仍然會public.<table>進入轉儲文件!就像這個問題中概述的一樣 - pg_dump 不尊重 -n

  1. 如果轉儲工作,計劃是使用以下複製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.

引用自:https://dba.stackexchange.com/questions/305343