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 / 3653
Accepted
Spredzy
Spredzy
Asked: 2011-07-06 02:16:21 +0800 CST2011-07-06 02:16:21 +0800 CST 2011-07-06 02:16:21 +0800 CST

Como fazer uma carga em massa de um banco de dados quando o aplicativo depende dele?

  • 772

Em uma rotina diária, preciso descartar e fazer uma carga em massa de um banco de dados.

O problema é que tenho uma WebApp contando com esse banco de dados. Portanto, não posso descartar o banco de dados assim.

Qual seria uma boa maneira de resolver esse problema?

database-design
  • 6 6 respostas
  • 168 Views

6 respostas

  • Voted
  1. BillThor
    2011-07-06T05:28:29+08:002011-07-06T05:28:29+08:00

    Você precisa descartar e recarregar o banco de dados? Em um caso como o seu, eu procuraria uma maneira de sincronizar o banco de dados com o conjunto de referência (os dados que você está carregando).

    Uma abordagem alternativa seria ter dois bancos de dados. Carregue um diferente a cada dia. Configure o aplicativo da web para que você possa trocar bancos de dados em tempo real.

    • 6
  2. Best Answer
    Gaius
    2011-07-07T10:45:49+08:002011-07-07T10:45:49+08:00

    Bem, isso é direto na maioria dos bancos de dados. Enquanto seu aplicativo está em execução, no trabalho de carregamento:

    1. Inicie uma transação (isso pode ser implícito ou pode exigir um comando, você não especifica qual banco de dados está usando)
    2. DELETEtodos os dados das tabelas ( não descartar ou truncar)
    3. INSERTos novos dados
    4. COMMITa transação

    Enquanto as etapas 1 a 3 estiverem em execução, o aplicativo verá a versão "antiga" dos dados e poderá continuar normalmente. Assim que a etapa 4 for concluída, o aplicativo verá os novos dados assim que executar a próxima consulta.

    • 5
  3. mrdenny
    2011-07-06T18:11:05+08:002011-07-06T18:11:05+08:00

    Trunque as tabelas e carregue os dados em massa. Se necessário, bloqueie o aplicativo da Web da tabela antes de truncar a tabela.

    • 3
  4. ik_zelf
    2011-07-06T02:32:16+08:002011-07-06T02:32:16+08:00

    isso depende de como estão as árvores de dependência. Se você tiver muitos objetos dependentes na tabela [s] onde você carrega os dados, o melhor é não alterar o objeto, a tabela porque muitas invalidações ocorrerão.

    truncar a tabela elimina os dados muito rapidamente, mas não funcionará quando houver restrições referenciais. Também não funcionará quando o aplicativo estiver em execução devido a problemas de bloqueio.

    O melhor para o aplicativo será uma sequência normal de exclusão/inserção. Não é a opção mais rápida, mas é a melhor para disponibilidade e tem menos problemas com travamento.

    Outras opções podem ser carregamento de troca de partição. As restrições podem ser problemáticas e levar muito tempo para serem validadas. Nunca derrube uma tabela apenas para se livrar dos dados. Uma tabela deve ser considerada como a infraestrutura do aplicativo e deve estar sempre disponível, pois o aplicativo lançará muitos erros para seus usuários.

    • 2
  5. alex
    2011-07-06T04:32:50+08:002011-07-06T04:32:50+08:00
    1. Pare o aplicativo da web.
    2. Solte/restaure o banco de dados.
    3. Inicie o aplicativo da web novamente.
    • 2
  6. maletin
    2012-04-17T05:54:41+08:002012-04-17T05:54:41+08:00

    carrego os novos dados em uma tabela temporária. desta forma, tenho que bloquear apenas as linhas que preciso atualizar. Depois, excluo as linhas ausentes e insiro novas linhas.

    create table permanent ( key int primary key, field1 int, field2 text );
    create temporary table temporary as select * from permanent where false;
    \copy temporary from 'actual_data.dump'
    alter table temporary add constraint temporary_pkey primary key ( key );
    
    update permanent                              
       set field1 = temporary.field1,
           field2 = temporary.field2
      from temporary
     where permanent.key = temporary.key
       and (     permanent.field1 is distinct from temporary.field1
             or  permanent.field2 is distinct from temporary.field2
           );
    
    delete from permanent where not exists ( select 1
                                               from temporary
                                              where key = permanent.key );
    insert into permanent ( select *
                              from temporary
                             where not exists ( select 1
                                                  from permanent
                                                 where key = temporary.key ) );

    isso funciona pelo menos para postgresql.

    para oracle eu uso o seguinte:

    update ( select p.field1 p_field1,
                    p.field2 p_field2,
                    t.field1 t_field1,
                    t.field2 t_field2
               from permanent p, temporary t
              where p.key = t.key )
       set p_field1 = t_field1,
           p_field2 = t_field2
     where p_field1 <> t_field1
        or p_field1 is null and t_field1 is not null
        or p_field1 is not null and t_field1 is null
        or p_field2 <> t_field2
        or p_field2 is null and t_field2 is not null
        or p_field2 is not null and t_field2 is null
    quando tenho valores impossíveis, posso usar NVL:

     where nvl(p_field1, -1) <> nvl(t_field1, -1)
        or nvl(p_field2, '{null}') <> nvl(t_field2, '{null}')
    • 1

relate perguntas

  • Os índices filtrados podem ajudar a melhorar as consultas baseadas em uma hora inserida ou isso deve ser evitado?

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

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