sql >> Base de Datos >  >> RDS >> Mysql

Inserción masiva de tablas relacionadas con MySQL desde bash

Hay varios requisitos contradictorios expresados ​​en su pregunta. Esta respuesta se concentra en el aspecto de "mantener bloqueado".

Para mantener un bloqueo de tabla para toda la operación, deberá mantener una única conexión con el servidor sql. Una forma sería pasar todo como una entrada de comando múltiple de varias líneas a una sola invocación del cliente de línea de comando mysql. Básicamente así:

{ echo "LOCK TABLES Table1 WRITE"
  for i in "${infiles[@]}"; do
    echo "LOAD DATA LOCAL INFILE '${i}'"
  done
} | mysql

Eso funcionaría siempre que pueda generar todas las declaraciones requeridas sin hacer preguntas de la base de datos (como el identificador máximo) mientras se mantiene el bloqueo.

Para combinar operaciones de lectura (como solicitar un valor máximo) y operaciones de escritura (como cargar contenido de algunos archivos), necesitará una comunicación bidireccional con el servidor. Lograr esto a través de bash es muy complicado, por lo que desaconsejaría hacerlo. Incluso si no necesita hacer preguntas, la conexión unidireccional proporcionada por una tubería bash es una fuente de peligro:si algo sale mal en el lado de mysql, bash no lo notará y emitirá el siguiente comando de todos modos. Podrías terminar entregando datos inconsistentes.

Por estas razones, prefiero sugerir algún lenguaje de secuencias de comandos para el cual los enlaces mysql estén disponibles, como las opciones de Perl o Pyhon que mencionó. Leer archivos CVS en esos idiomas es fácil, por lo que puede hacer todo lo siguiente en un solo script:

  1. bloquear tablas
  2. iniciar transacción
  3. leer archivos csv de entrada
  4. hacer preguntas como id máximo
  5. ajustar los datos de entrada para que coincidan con el diseño de la tabla
  6. insertar datos en tablas
  7. si no se produjeron errores, confirme la transacción