Bash String Array
Hallo Leute ich schon wieder
Zur Info: Grund für meine vielen Fragen ist, weil ich ein Projekt bekommen habe und von all dem bis vor kurzem eigentlich keine Ahnung hatte...
Hab da son Bash Scritp mit dem ich aus 96 Datenbanken eine bestimmte Spalte(introtext) auslesen muss und das gesammte Ergebniss in einer CSV Datei speichern soll. Leider haben die Tabellen in der sich die Spalte befindet auch bei jeder DB einen anderen Namen/prefix.
Da es nicht möglich ist in einer mySQL Abfrage im Namen der Tabelle, Variablen zu gebrauchen musste ich die ganze Abfrage in eine Variable packen und diese zuvor mit Funktionien wie String & Array zusammenstellen.
Nun ist das Problem, dass momentan beim ausführen des Scripts, die Abfrage viel zu viel Abfragt.
Das heisst es versucht in jeder Datenbank nach allen 96 Tabellen zu suchen, nur sollte sie das ja nicht da es immer nur 1 richtige gibt... und das ganze dan mal 96 -.-
Als ich das Script erstellte testete ich es mit nur 4 DB's und dementsprechen nur 4 Tabellen. Wobei es nicht alzu schlimm war wen es zu viel arbeitete aber nun dauert das Ausführen des Scripts um die 1.5 Stunden...
Die DB-Namen und Tabellennamen sind in der gleichen Reihenfolge aufgelistet.
Wie kann ich meinem Script sagen das es jeweils nur die richtige DB mit der richtigen Tabelle zusammenstellen soll? sowas wiene Nummerierung...
Hier noch das Script (hab die Tabellen und DBs ein wenig gekürzt^^)
Zur Info: Grund für meine vielen Fragen ist, weil ich ein Projekt bekommen habe und von all dem bis vor kurzem eigentlich keine Ahnung hatte...
Hab da son Bash Scritp mit dem ich aus 96 Datenbanken eine bestimmte Spalte(introtext) auslesen muss und das gesammte Ergebniss in einer CSV Datei speichern soll. Leider haben die Tabellen in der sich die Spalte befindet auch bei jeder DB einen anderen Namen/prefix.
Da es nicht möglich ist in einer mySQL Abfrage im Namen der Tabelle, Variablen zu gebrauchen musste ich die ganze Abfrage in eine Variable packen und diese zuvor mit Funktionien wie String & Array zusammenstellen.
Nun ist das Problem, dass momentan beim ausführen des Scripts, die Abfrage viel zu viel Abfragt.
Das heisst es versucht in jeder Datenbank nach allen 96 Tabellen zu suchen, nur sollte sie das ja nicht da es immer nur 1 richtige gibt... und das ganze dan mal 96 -.-
Als ich das Script erstellte testete ich es mit nur 4 DB's und dementsprechen nur 4 Tabellen. Wobei es nicht alzu schlimm war wen es zu viel arbeitete aber nun dauert das Ausführen des Scripts um die 1.5 Stunden...
Die DB-Namen und Tabellennamen sind in der gleichen Reihenfolge aufgelistet.
Wie kann ich meinem Script sagen das es jeweils nur die richtige DB mit der richtigen Tabelle zusammenstellen soll? sowas wiene Nummerierung...
Hier noch das Script (hab die Tabellen und DBs ein wenig gekürzt^^)
#!/bin/bash
#MySQL Login Variablen
user=root
pass=password123
#Tebellenname Variablen
STRtbl="ebn8r_content,h4akd_content,vbm6h_content,fb2tz_content,x4fve_content,gbty6_content,psf7w_content"
#DB Variablen
STRDB="DB1,DB2,DB3,DB4,DB5,DB6,DB7"
#String Array für Tabelle in Variable y
STR_ARRAYtbl=(`echo $STRtbl | tr "," "\n"`)
echo "loop1 $STR_ARRAYtbl"
for y in "${STR_ARRAYtbl[@]}"
do
#MySQL Abfrage Variable
query="SELECT introtext FROM $y INTO OUTFILE '/tmp/dbexport.csv' LINES TERMINATED BY '\n';"
#String Array für Datebnbanken in Variable x
STR_ARRAYDB=(`echo $STRDB | tr "," "\n"`)
echo "loop2 $STR_ARRAYDB"
for x in "${STR_ARRAYDB[@]}"
do
#Abfrage zusammenstellen und ausführen
for table in $(mysql -u$user -p$pass -D$x -Be "SHOW TABLES"); do
echo "exporting $x"
echo "mysql -u $user -p$pass -D$x -Be $query"
mysql -u$user -p$pass -D$x -Be "$query"
echo "[$x]"
done
done
done
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 229067
Url: https://administrator.de/contentid/229067
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
7 Kommentare
Neuester Kommentar
Öhm... ich hoffe das is nicht das echte root passwort eures Servers... sowas solltest du vielleicht zensieren ;)
Und zur Frage vielleicht wenigstens noch ein Tipp:
Scheinbar heißen die Tabellen ja alle *_content. Ich würde also versuchen den passenden Tabellennamen für die aktuelle DB so zu finden.
So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen
SELECT
TABLE_NAME
FROM information_schema.TABLES
Grüße
Und zur Frage vielleicht wenigstens noch ein Tipp:
Scheinbar heißen die Tabellen ja alle *_content. Ich würde also versuchen den passenden Tabellennamen für die aktuelle DB so zu finden.
So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen
SELECT
TABLE_NAME
FROM information_schema.TABLES
Grüße
Zitat von @SIPSIP:
Danke für die schnelle Antwort
> Zitat von @ChrFriedel:
>
> Öhm... ich hoffe das is nicht das echte root passwort eures Servers... sowas solltest du vielleicht zensieren ;)
uups, ganz vergessen aber war nur mein Testsystem^^
> So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen
> SELECT
> TABLE_NAME
> FROM information_schema.TABLES
Auf diese Wiese hab ich schon meine Nerven verloren, weil sich rausstellte, dass mySQL Variablen im Tabellenname nicht erkennt und
so also z.B. $prefix_content als Abfrage benutzt
Danke für die schnelle Antwort
> Zitat von @ChrFriedel:
>
> Öhm... ich hoffe das is nicht das echte root passwort eures Servers... sowas solltest du vielleicht zensieren ;)
uups, ganz vergessen aber war nur mein Testsystem^^
> So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen
> SELECT
> TABLE_NAME
> FROM information_schema.TABLES
Auf diese Wiese hab ich schon meine Nerven verloren, weil sich rausstellte, dass mySQL Variablen im Tabellenname nicht erkennt und
so also z.B. $prefix_content als Abfrage benutzt
*g* nein ich glaub da hast du was falsch verstanden, ich meinte es anders.
Gesetzt den Fall deine DBs haben jeweils nur eine Tabelle die irgendwas_content heißt würde deine Abfrage ungefähr (sorry ich nutzte sonst nur MSSQL, wenn die Syntax falsch ist dann bitte mal über MySQL like informieren) so aussehen:
SELECT
TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_Name like '%_content'
Das Ergebnis für diese Abfrage wäre dann im Falle deiner DB1 z. B. ebn8r_content
Und in einer 2ten Abfrage fragst du dann explizit nach dem Introtext in der ermittelten Tabelle. Dadurch reduzieren sich deine Abfragen von 96 *96 (welches übrigens auch keine 1,5h dauern sollte) auf 96 * 2
Es geht sicher noch um einiges effizienter aber dieses Vorgehen sollte völlig ausreichen.
Zitat von @SIPSIP:
> *g* nein ich glaub da hast du was falsch verstanden, ich meinte es anders.
>
> Gesetzt den Fall deine DBs haben jeweils nur eine Tabelle die irgendwas_content heißt würde deine Abfrage
ungefähr
> (sorry ich nutzte sonst nur MSSQL, wenn die Syntax falsch ist dann bitte mal über MySQL like informieren) so aussehen:
>
> SELECT
> TABLE_NAME
> FROM information_schema.TABLES
> WHERE TABLE_Name like '%_content'
>
> Das Ergebnis für diese Abfrage wäre dann im Falle deiner DB1 z. B. ebn8r_content
>
> Und in einer 2ten Abfrage fragst du dann explizit nach dem Introtext in der ermittelten Tabelle. Dadurch reduzieren sich
deine
> Abfragen von 96 *96 (welches übrigens auch keine 1,5h dauern sollte) auf 96 * 2
>
> Es geht sicher noch um einiges effizienter aber dieses Vorgehen sollte völlig ausreichen.
Okay ehm... versteh ich das richtig, dann müsste ich diese Abfrage die du oben gennant hast 96 mal separat scheiben?
> *g* nein ich glaub da hast du was falsch verstanden, ich meinte es anders.
>
> Gesetzt den Fall deine DBs haben jeweils nur eine Tabelle die irgendwas_content heißt würde deine Abfrage
ungefähr
> (sorry ich nutzte sonst nur MSSQL, wenn die Syntax falsch ist dann bitte mal über MySQL like informieren) so aussehen:
>
> SELECT
> TABLE_NAME
> FROM information_schema.TABLES
> WHERE TABLE_Name like '%_content'
>
> Das Ergebnis für diese Abfrage wäre dann im Falle deiner DB1 z. B. ebn8r_content
>
> Und in einer 2ten Abfrage fragst du dann explizit nach dem Introtext in der ermittelten Tabelle. Dadurch reduzieren sich
deine
> Abfragen von 96 *96 (welches übrigens auch keine 1,5h dauern sollte) auf 96 * 2
>
> Es geht sicher noch um einiges effizienter aber dieses Vorgehen sollte völlig ausreichen.
Okay ehm... versteh ich das richtig, dann müsste ich diese Abfrage die du oben gennant hast 96 mal separat scheiben?
Natürlich nicht Das wäre ja völlig gegen den Sinn der Automation. Das % ist ein Platzhaltersymbol.
Die Abfrage bedeutet also in etwa:
Liebe DB zu der ich gerade verbunden bin, nenne mir doch bitte mal alle Tabellen in dir deren Name mit "_content" endet. Die Datenbank liefert dir dann alle Namen zurück die passen, und wenn es nur eine Tabelle gibt die auf _content endet dann erhälst du den vollständigen Namen dieser Mit diesem Namen kannst du dann eine 2te Abfrage nach dem Introtext formulieren.