Estou tentando copiar um esquema PostgreSQL e seus dados de um banco de dados para outro sem afetar a disponibilidade do esquema atual ( old_schema
). Eu também gostaria de fazer isso para um subconjunto específico de tabelas dentro do esquema e quero que o novo esquema tenha um nome diferente no outro banco de dados.
Estou usando o Python para as etapas 1. e 2. no procedimento a seguir,
- Obtenha uma lista de nomes de tabelas
old_schema
que desejo copiar.
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_.*'
;
- Percorra os nomes das tabelas, criando as mesmas tabelas no
new_schema
create table if not exists {new_schema}.{lime_table} (like {old_schema}.{lime_table} including all);
e também copie os dados do old_schema
para o new_schema
de cada tabela
insert into {new_schema}.{lime_table} (select * from {old_schema}.{lime_table});
- Agora temos uma cópia das tabelas que queremos em
new_schema
.
Aí vem a parte com comportamento inesperado do PostgreSQL. Para migrar new_schema
para o outro banco de dados, primeiro o despejamos em um arquivo usando
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
No entanto, mesmo depois de copiar as tabelas de public
para new_schema
na etapa 2., especificando pg_dump para apenas dump new_schema
, e também especificando para excluir o public
esquema (o esquema de onde os dados se originam), ainda temos public.<table>
o arquivo de despejo! É como o descrito nesta pergunta - pg_dump não honra -n .
- Se o dump funcionar, o plano é usar o seguinte para copiar
new_schema
para um banco de dados diferente.
pg_restore.exe
--host="<HOST>"
--port=<PORT>
--username=<USERNAME>
--verbose -1
--dbname="<DB_NAME>"
C:\Users\<PATH>\backup.sql
As versões do PostgreSQL que estou usando estão descritas nos arquivos de despejo.
-- Despejado do banco de dados versão 10.9.17
-- Despejado pelo pg_dump versão 14.1