mysqldump com INSERT… ON DUPLICATE

21

Quero mesclar dados de um banco de dados para outro. Então, crio o dump com mysqldumpe importo-o para outro banco de dados (com a mesma estrutura de tabelas). Não tenho problemas (como entradas duplicadas ou outra coisa) neste caso.

Mas faço algumas mesclagens para fins de teste e farei a mesclagem final mais tarde. Então, eu quero executar a mesclagem (os dados podem ser alterados) algumas vezes. Observe que minhas linhas nas minhas tabelas nunca são excluídas, apenas podem ser inseridas ou atualizadas.

Posso criar o mysqldump com a opção ON DUPLICATE? Ou posso mesclar despejo que insere novos dados e atualiza dados modificados?

Claro, posso inserir ON DUPLICATEno dump manualmente, mas quero automatizar o processo de mesclagem.

Xupypr MV
fonte

Respostas:

34

Existem opções para ajudá-lo nisso:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

Mantenha esse paradigma em mente

  • mysqldump tudo de DB1 em DUMP1
  • carregar DUMP1 no DB3
  • mysqldump tudo do DB2 usando --replace (ou --insert-ignore) e --no-create-info no DUMP2
  • carregar DUMP2 no DB3
RolandoMySQLDBA
fonte
11
Espere um minuto: usar --replace significa que os dados do DB2 substituirão os dados do DB1 e usar --insert-ignore significa que os dados do DB1 prevalecem. A questão parece perguntar como fazer UPDATE no caso de chaves duplicadas. De qualquer forma, eu gostaria de saber.
Edward Newell
@ EdwardNewell Observe que isso --replaceé equivalente a fazer ON DUPLICATE UPDATEem todas as colunas. Infelizmente, o mysqldump não foi projetado para atualizar colunas específicas devido à natureza de carregamento e despejo em massa do mysqldump. Minha resposta simplesmente revela o que o mysqldump é capaz de fazer. Você teria que escrever um código personalizado, além do mysqldump, para fazer ON DUPLICATE UPDATE.
RolandoMySQLDBA
Desde que DB1 e 2 tenham exatamente o mesmo esquema, você está certo. Mas suponha que o DB1 tenha campos extras. Então --replace fará com que os campos extras retornem aos padrões (ou um erro se não houver padrões) em vez de apenas atualizar os campos compartilhados. Sei que a situação do OP é para dois bancos de dados com os mesmos esquemas, mas apenas apontando que não é uma diferença, e seria útil ter um verdadeiro reserva-tipo de atualização em certos casos (eu estou enfrentando um agora!)
Edward Newell
11
Observe que, se houver chaves estrangeiras apontando para a atualização do registro, o uso REPLACE INTOpoderá falhar porque o registro não pode ser excluído com o rompimento desses relacionamentos. Se você tiver ON DELETE CASCADE, esvaziará as tabelas que dependem da atualização. REPLACE INTOé uma operação bastante perigosa.
Christopher Schultz
11
@RolandoMySQLDBA Agreed. Eu só queria comentar para que qualquer pessoa que leia esta resposta entenda que essas opções (particularmente REPLACE INTO) podem ser perigosas e ter efeitos "surpreendentes". Boa resposta - só queria adicionar uma ressalva.
Christopher Schultz