我正在尝试将 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 指定为仅 dump new_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 转储