AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 3394
Accepted
Zilk
Zilk
Asked: 2011-06-21 14:53:22 +0800 CST2011-06-21 14:53:22 +0800 CST 2011-06-21 14:53:22 +0800 CST

É possível criar/restaurar rapidamente instantâneos de banco de dados com o PostgreSQL?

  • 772

Em primeiro lugar, sou um desenvolvedor, não um DBA ou administrador de sistemas; por favor, seja gentil :)

Estou trabalhando em um fluxo de trabalho de aplicativo em que uma única ação do usuário acionará alterações complexas no banco de dados - criando centenas de registros em algumas tabelas, atualizando centenas de registros em outras, etc. Ao todo, cerca de 12 tabelas (de ~ 100 ) são tocados por esta ação. Devido à complexidade, é muito difícil para mim reverter manualmente todas as alterações antes de poder executar outro teste. Durante a maior parte do meu tempo de desenvolvimento, posso simplesmente inserir uma instrução "ROLLBACK" perto do final do fluxo de trabalho, mas quando chego perto de confirmar minhas alterações, preciso testar a coisa real.

Eu tenho uma cópia local do banco de dados de produção para trabalhar. No meu caso, despejar e restaurar entre os testes é mais rápido do que escrever um script para desfazer todas as alterações. É mais rápido, mas ainda está me deixando muito lento (a restauração leva cerca de 20 minutos no meu laptop antigo). Existe alguma maneira de salvar um instantâneo do estado atual do banco de dados e restaurá-lo rapidamente?

Tenho a garantia de ser o único usuário no sistema e tenho acesso root. O dump do banco de dados é ~ 100 MB quando tar'ed e gzip'ed. A versão do PostgreSQL é 8.3.

Agradecemos antecipadamente por quaisquer idéias úteis.

postgresql restore
  • 8 8 respostas
  • 35608 Views

8 respostas

  • Voted
  1. Best Answer
    Peter Eisentraut
    2011-06-23T12:43:15+08:002011-06-23T12:43:15+08:00

    Você pode usar instantâneos no nível do sistema de arquivos, mas isso geralmente é bastante complicado, precisa de sistemas de arquivos especiais e nem sempre está disponível, especialmente em laptops antigos. ;-)

    Que tal você criar seu estado base como um banco de dados e, em seguida, criar um novo banco de dados a partir dele para sua execução de teste, usando a CREATE DATABASE ... TEMPLATEfuncionalidade. Após o teste, você joga esse banco de dados fora. Então sua restrição de velocidade é essencialmente apenas o tempo para cp -Ro diretório do banco de dados. Isso é o mais rápido que você obterá sem a mágica do instantâneo do sistema de arquivos.

    • 45
  2. David Portabella
    2016-06-13T09:00:14+08:002016-06-13T09:00:14+08:00

    Use Stellar , é como git para bancos de dados:

    Stellar permite restaurar rapidamente o banco de dados quando você está, por exemplo, escrevendo migrações de banco de dados, trocando de ramificações ou mexendo com SQL. PostgreSQL e MySQL (parcialmente) são suportados.

    • 14
  3. wildpeaks
    2011-07-02T04:45:36+08:002011-07-02T04:45:36+08:00

    Se seu banco de dados é executado no Virtualbox , você pode facilmente salvar instantâneos e restaurar instantâneos do estado do banco de dados e do próprio sistema operacional em alguns segundos (ou 1-2 minutos se você realmente tiver muitos dados no banco de dados ou no sistema operacional ou muito pouca memória alocada para a máquina virtual) gratuitamente.

    Na maioria dos casos, seria melhor instalar um linux leve (do que um servidor Windows) para executar a máquina virtual onde o banco de dados está hospedado, desde que você mencione que tem poucos recursos disponíveis em seu laptop.


    No site de produção, eu uso os backups de instantâneos do MediaTemple para obter o mesmo resultado (mas são 20$ por slot de backup e específico para esse serviço de hospedagem, então isso pode não servir para você).

    • 5
  4. Jack Douglas
    2011-06-22T00:12:03+08:002011-06-22T00:12:03+08:00

    Provavelmente não é a resposta que você está esperando, mas você considerou algum nível mais baixo de instantâneo - LVM, por exemplo?

    • 3
  5. user92843
    2016-04-23T06:59:41+08:002016-04-23T06:59:41+08:00

    Encontrei esta pergunta ao tentar fazer o mesmo e acabei usando o git no diretório de dados do postgresql. Descartar as alterações é tão fácil quanto:

    git reset --hard
    
    • 2
  6. Hvisage
    2019-10-21T11:06:07+08:002019-10-21T11:06:07+08:00

    Embora eu tenha que dizer que Stellare git reset --hardé uma solução interessante, terei um problema com bancos de dados e testes maiores, e uso as Virtualboxsoluções etc., no entanto, em testes maiores, elas se tornam um pouco mais "problemáticas" quando você estão usando soluções bare metal etc.

    Assim, TENHO que mencionar ZFScomo um sistema de arquivos a ser considerado no futuro pelas seguintes razões que @Peter Eisentraut também mencionou:

    1. Snapshots - especialmente quando você faz replicação de Prod para QA/DR, você pode usar esse mesmo "sistema de arquivos" para os testes:
    #On a replication node, rather stop, snap, restore for a "consistent" backup ;)
    su -l -c "/usr/bin/m2ee stop" acw_qa
    pg_ctlcluster ${=QA} stop --force
    zfs destroy -R $SNAPSHOT
    pg_ctlcluster ${=REPLICATION} stop --force
    zfs snapshot $SNAPSHOT
    pg_ctlcluster ${=REPLICATION} start
    
    zfs destroy $CLONE
    zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
    rm $CLONEDIR/$CLUSTER/recovery.conf
    pg_ctlcluster ${=QA} start
    su -l -c "/usr/bin/m2ee start" acw_qa
    
    1. para fazer um teste, logo antes do teste, faça uma parada postgresql como acima, zfs snapshot $SNAPSHOTinicie o postgresql, depois faça o rollback, pare o postgresql e apenaszfs rollback $SNAPSHOT

    2. Compactação - O Postgresql obtém uma compactação típica de 3:1 em meus bancos de dados, para que você possa fazer muito mais testes;)

    • 1
  7. Noam Nol
    2022-02-08T01:46:08+08:002022-02-08T01:46:08+08:00

    Seguindo a TEMPLATEresposta de Peter, estes são os comandos que eu uso:

    Listar bancos de dados:

    psql -h localhost -l
    

    Copiar banco de dados:

    createdb -T <db_to_be_cloned> <clone_name>
    

    Excluir banco de dados:

    dropdb <db_name>
    

    Com estes comandos podemos fazer snapshots:

    Crie um instantâneo para mydbdb:

    createdb -h localhost -T mydb sshot-mydb-001
    

    Restaurar mydba partir do instantâneo:

    dropdb -h localhost mydb
    createdb -h localhost -T sshot-mydb-001 mydb
    
    • 1
  8. Haroldo_OK
    2017-01-17T02:38:40+08:002017-01-17T02:38:40+08:00

    Ainda outra opção que poderia ser experimentada seria salvar uma cópia do diretório de dados postgresql, então apenas reescrever o diretório existente com a cópia quando você quiser restaurá-lo. Isso exigirá mais espaço no disco, mas definitivamente será mais rápido do que restaurar a partir de um backup. Não tenho certeza se isso seria mais rápido que o método de modelo, portanto, seria uma boa ideia fazer alguns testes primeiro.

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve