Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Inserção em massa de tabelas relacionadas ao MySQL do bash


Existem vários requisitos conflitantes expressos em sua pergunta. Esta resposta se concentra no aspecto de “manter o bloqueio”.

Para manter um bloqueio de tabela para toda a operação, você terá que manter uma única conexão com o servidor sql. Uma maneira seria passar tudo como uma entrada de vários comandos de várias linhas para uma única invocação do cliente de linha de comando mysql. Basicamente assim:
{ echo "LOCK TABLES Table1 WRITE"
  for i in "${infiles[@]}"; do
    echo "LOAD DATA LOCAL INFILE '${i}'"
  done
} | mysql

Isso funcionaria desde que você possa gerar todas as instruções necessárias sem fazer perguntas do banco de dados (como identificador máximo) enquanto o bloqueio é mantido.

Para misturar operações de leitura (como solicitar um valor máximo) e operações de gravação (como carregar conteúdo de alguns arquivos), você precisará de uma comunicação bidirecional com o servidor. Conseguir isso através do bash é muito complicado, então eu desaconselho isso. Mesmo que você não precise fazer perguntas, a conexão unidirecional fornecida por um bash pipe é uma fonte de perigo:Se algo der errado no lado do mysql, o bash não perceberá e emitirá o próximo comando de qualquer maneira. Você pode acabar cometendo dados inconsistentes.

Por esses motivos, prefiro sugerir alguma linguagem de script para a qual as ligações mysql estejam disponíveis, como as opções Perl ou Pyhon que você mencionou. Ler arquivos CVS nesses idiomas é fácil, portanto, você pode fazer o seguinte em um único script:
  1. bloquear tabelas
  2. iniciar transação
  3. ler arquivos csv de entrada
  4. faça perguntas como id máximo
  5. ajuste os dados de entrada para corresponder ao layout da tabela
  6. inserir dados em tabelas
  7. se nenhum erro ocorreu, confirme a transação