Eu criei um novo dump de banco de dados de um servidor de produção com os sinalizadores --data-only
e --column-inserts
, portanto, tenho apenas várias instruções de inserção para inserir dados ao executar uma restauração em um servidor de teste.
pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql
Como excluo todos os dados no banco de dados do servidor de teste primeiro, antes de restaurar os dados do dump de produção?
Eu quero excluir todos os dados apenas para não ter que descartar e criar o banco de dados e todas essas coisas. Eu só quero remover dados e inserir novos dados, isso é tudo.
Não tenho a opção de descartar e criar o banco de dados por vários motivos. Terei que remover todos os dados e apenas inserir apenas, então o que for preciso para descobrir como fazer isso, estou disposto a fazer isso, mas preciso de ajuda, obviamente, para começar.
Também preciso automatizar esse processo. Automatizará "despejar dados do banco de dados de produção", depois "excluir dados no banco de dados de teste" e, em seguida, "restaurar dados no banco de dados de teste". Eu só preciso de ajuda na parte "excluir dados no banco de dados de teste".
Estou executando no PostgreSQL 9.5.2
Você não precisa descartar o banco de dados, deve ser suficiente descartar todos os objetos no banco de dados. Isso pode ser feito usando
Se você criar o dump SQL incluindo as
create table
instruções (portanto, sem a--data-only
opção), tudo ficará bem.Você também pode remover o
--column-inserts
then, o que tornará a importação muito mais rápida.No entanto, se você deseja excluir tudo, pode fazer isso com um pouco de SQL dinâmico:
Isso truncará todas as tabelas no esquema
public
com uma única instrução que também funcionará mesmo se houver muitas restrições de chave estrangeira conectando todas as tabelas. Se suas tabelas estiverem espalhadas por vários esquemas, você precisará adicioná-las nawhere
condição.pg_restore tem um sinalizador --clean (ou possivelmente --create) que excluirá automaticamente os dados antes de executar as operações.
A Excelente Documentação deve te ajudar muito...
Só para esclarecer, caso esteja confuso:
Isso não irá descartar o banco de dados real .. apenas as tabelas/visualizações/etc.
Se, por algum motivo, descartar e recriar as tabelas não for aceitável, você terá que trabalhar mais para criar manualmente um script que crie um
data only
dump do banco de dados de origem, problemasTRUNCATE
ouDELETE
no banco de dados de destino e, em seguida, carrega o dump de dados. Não há uma maneira rápida / esperta de fazer isso, até onde eu saiba.A consulta acima gerará consultas truncadas para todas as tabelas do banco de dados.
Muito simples.
Você pode usar o pgAdmin para fazer isso.
Nota: minha resposta é sobre realmente deletar as tabelas e outros objetos de banco de dados; para excluir todos os dados nas tabelas, ou seja, truncando todas as tabelas , Endre Both forneceu uma instrução similarmente bem executada (execução direta) um mês depois.
Para os casos em que você não pode apenas
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
ou algo assim, aqui está um script SQL autônomo que escrevi, que é seguro para transações (ou seja, você pode colocá-lo entreBEGIN;
eROLLBACK;
apenas testá-lo ouCOMMIT;
realmente fazer a ação) e limpa “todos” os objetos de banco de dados… bem, todos aqueles usados no banco de dados que nosso aplicativo usa ou eu poderia adicionar sensatamente, que é:CHECK
,UNIQUE
)VIEW
s (normal ou materializado)public
ou internos ao banco de dados) que “nós” possuímos: o script é útil quando executado como “não um superusuário de banco de dados”; um superusuário pode descartar todos os esquemas (os realmente importantes ainda são explicitamente excluídos)Não foram descartados (alguns deliberados; alguns apenas porque não tinha exemplo em nosso banco de dados):
public
esquema (por exemplo, para coisas fornecidas por extensão neles)Isso é realmente útil para os casos em que o dump que você deseja restaurar é de uma versão de esquema de banco de dados diferente (por exemplo, com Debian
dbconfig-common
, Flyway ou Liquibase/DB-Manul) do banco de dados em que você deseja restaurá-lo.Também tenho uma versão que apaga “tudo menos duas tabelas e o que pertence a elas” (uma sequência, testada manualmente, desculpe, eu sei, chata) caso alguém se interesse; a diferença é pequena. Entre em contato comigo ou verifique este repositório se estiver interessado.
SQL
Testado, exceto adições posteriores (
extensions
contribuição de Clément Prévost ), no PostgreSQL 9.6 (jessie-backports
). Remoção de agregado testada em 9.6 e 12.2, remoção de procedimento testada em 12.2 também. Correções de bugs e melhorias são bem-vindas!Outra maneira é usar um script de shell:
Ele não trunca
schema_migrations
a tabela caso haja uma. Ele espera que seus nomes de tabela não incluam aspas duplas. O primeiro comando gera um script como:O segundo executa.