Eu sei que posso alterar o nome do esquema após a restauração, mas o problema é que o nome já pode existir e não quero tocar nesse esquema existente.
O tipo de despejo é "personalizado".
Então, efetivamente, quero algo como:
pg_dump -U postgres --schema "source_schema" --format "c" --create --file "source_schema.bak" my_db
pg_restore -U postgres --exit-on-error --dbname "my_db" "source_schema.bak" --destination-schema "destination_schema"
Se isso for possível, seria bom se eu pudesse copiar (e renomear) o esquema de origem antes do backup.
Se os dados forem pequenos, eu apenas faria o pg_dump, restauraria-o em um servidor de banco de dados temporário apenas para esse propósito, renomearia o esquema nesse servidor temporário (
ALTER SCHEMA...RENAME...
) e o despejaria desse servidor temporário para fazer o final restaurar.a coisa mais fácil é: despejar as coisas. abra o arquivo de despejo no vi. corrigir, o que tem que ser corrigido e reproduzir as coisas.
Estou movendo outros bancos de dados (do esquema público) para novos esquemas em um único banco de dados (assim, uma única conexão pode acessar todos eles). Minha abordagem foi carregar no esquema público e renomeá-lo.
Primeiro, se você tiver algo em seu esquema público, renomeie para salvar. Eu encontrei algumas extensões, "hstore" especificamente, que precisavam ser recriadas no novo esquema. Execute esses comandos SQL em
psql
ou de outra forma.Faça backup e restaure seu banco de dados para o esquema público. Ajuste os comandos para suas configurações de conexão.
Seu banco de dados agora deve estar no esquema público. Agora emita esses comandos SQL para renomear o esquema e renomear o esquema público original.
Se você estiver movendo vários bancos de dados como eu fiz, crie um novo esquema público e itere para cada um. Depois, restaure o esquema original_public.
Como alternativa, se você não tiver colisões de nomenclatura entre as relações públicas existentes (tabelas, sequências, visualizações, etc.) e as importadas, você pode importar tudo junto e depois mover as novas tabelas para o novo esquema.
Apenas lembre-se de testar os comandos e fazer um teste em um banco de dados de teste. Scripting isso é recomendado ;-)
Eu tive que fazer a mesma coisa, acabei despejando em formato de texto e editando o arquivo de despejo com um comando sed.
Padrões para procurar / substituir (pesquisar e substituir toda a linha para não editar dados reais do usuário armazenados em db):
Eu usei em um banco de dados pequeno (menos de 500 MB de despejo), isso pode levar muito tempo para ser executado em um banco de dados grande, conforme indicado no comentário.