sql >> Database teknologi >  >> RDS >> Mysql

Masseindlæg af MySQL-relaterede tabeller fra bash

Der er forskellige modstridende krav udtrykt i dit spørgsmål. Dette svar koncentrerer sig om "hold lås"-aspektet af det.

For at opretholde en tabellås for hele operationen, bliver du nødt til at opretholde en enkelt forbindelse til sql-serveren. En måde ville være at sende alt som en multi-line multi-command input til en enkelt invokation af mysql kommandolinje klienten. Grundlæggende sådan her:

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

Det ville fungere, så længe du kan generere alle de nødvendige udsagn uden at stille spørgsmål fra databasen (såsom maksimal identifikator), mens låsen bevares.

For at blande læseoperationer (som at bede om en maksimal værdi) og skriveoperationer (som at indlæse indhold af nogle filer), skal du bruge en tovejskommunikation med serveren. At opnå dette gennem bash er meget vanskeligt, så jeg vil fraråde det. Selvom du ikke behøver at stille spørgsmål, er den ensrettede forbindelse fra et bash-pipe en kilde til fare:Hvis noget går galt på mysql-siden, vil bash ikke bemærke det og vil alligevel udstede den næste kommando. Du kan ende med at begå inkonsistente data.

Af disse grunde vil jeg hellere foreslå et eller andet scriptsprog, som mysql-bindinger er tilgængelige for, såsom Perl- eller Pyhon-indstillingerne, du nævnte. Det er nemt at læse CVS-filer på disse sprog, så du kan gøre alt af følgende i et enkelt script:

  1. lås tabeller
  2. start transaktion
  3. læs input csv-filer
  4. stil spørgsmål som f.eks. max id
  5. juster inputdata til at matche tabellayout
  6. indsæt data i tabeller
  7. hvis der ikke opstod nogen fejl, forpligt transaktionen



  1. MySQL VARCHAR-længder og UTF-8

  2. Kan ikke starte postgresql-tjenesten på CentOS 7

  3. Opdater data til tabel fra dynamisk oprettet inputfelt

  4. Sådan opretter du Snapshot-replikering