Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Masseneinfügung von MySQL-bezogenen Tabellen aus Bash

In Ihrer Frage werden verschiedene widersprüchliche Anforderungen ausgedrückt. Diese Antwort konzentriert sich auf den Aspekt „Sperre beibehalten“.

Um eine Tabellensperre für den gesamten Vorgang aufrechtzuerhalten, müssen Sie eine einzige Verbindung zum SQL-Server aufrechterhalten. Eine Möglichkeit wäre, alles als mehrzeilige Eingabe mit mehreren Befehlen an einen einzelnen Aufruf des mysql-Befehlszeilenclients zu übergeben. Im Grunde so:

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

Das würde funktionieren, solange Sie alle erforderlichen Anweisungen generieren können, ohne Fragen aus der Datenbank zu stellen (z. B. maximaler Bezeichner), während die Sperre beibehalten wird.

Um Leseoperationen (wie das Abfragen nach einem Maximalwert) und Schreiboperationen (wie das Laden des Inhalts einiger Dateien) zu mischen, benötigen Sie eine bidirektionale Kommunikation mit dem Server. Dies durch Bash zu erreichen ist sehr schwierig, daher würde ich davon abraten. Auch wenn Sie keine Fragen stellen müssen, ist die unidirektionale Verbindung, die eine Bash-Pipe bietet, eine Gefahrenquelle:Wenn auf der MySQL-Seite etwas schief geht, merkt die Bash das nicht und setzt trotzdem den nächsten Befehl. Sie könnten am Ende inkonsistente Daten übertragen.

Aus diesen Gründen würde ich lieber eine Skriptsprache vorschlagen, für die MySQL-Bindungen verfügbar sind, wie die von Ihnen erwähnten Perl- oder Python-Optionen. Das Lesen von CVS-Dateien in diesen Sprachen ist einfach, sodass Sie alle folgenden Schritte in einem einzigen Skript ausführen können:

  1. Tabellen sperren
  2. Transaktion starten
  3. CSV-Eingabedateien lesen
  4. stellen Sie Fragen wie max. ID
  5. Eingabedaten an Tabellenlayout anpassen
  6. Daten in Tabellen einfügen
  7. Wenn keine Fehler aufgetreten sind, Transaktion ausführen