Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion en bloc de tables liées à MySQL à partir de bash

Il existe diverses exigences contradictoires exprimées dans votre question. Cette réponse se concentre sur l'aspect "garder le verrou".

Afin de maintenir un verrou de table pour toute l'opération, vous devrez maintenir une seule connexion au serveur sql. Une façon serait de tout transmettre en tant qu'entrée multi-commande multiligne à une seule invocation du client de ligne de commande mysql. En gros comme ceci :

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

Cela fonctionnerait tant que vous pouvez générer toutes les déclarations requises sans poser de questions à partir de la base de données (comme l'identifiant maximal) pendant que le verrou est conservé.

Afin de mélanger les opérations de lecture (comme demander une valeur maximale) et les opérations d'écriture (comme charger le contenu de certains fichiers), vous aurez besoin d'une communication bidirectionnelle avec le serveur. Réaliser cela via bash est très délicat, donc je le déconseille. Même si vous n'avez pas besoin de poser de questions, la connexion unidirectionnelle fournie par un tube bash est une source de danger :si quelque chose ne va pas du côté de mysql, bash ne le remarquera pas et lancera quand même la commande suivante. Vous pourriez finir par valider des données incohérentes.

Pour ces raisons, je suggérerais plutôt un langage de script pour lequel des liaisons mysql sont disponibles, comme les options Perl ou Pyhon que vous avez mentionnées. La lecture de fichiers CVS dans ces langues est facile, vous pouvez donc effectuer toutes les opérations suivantes dans un seul script :

  1. verrouiller les tables
  2. démarrer la transaction
  3. lire les fichiers CSV d'entrée
  4. posez des questions comme max id
  5. ajuster les données d'entrée pour qu'elles correspondent à la disposition du tableau
  6. insérer des données dans des tableaux
  7. si aucune erreur ne s'est produite, validez la transaction