
Ich habe eine MySQL-Datenbank auf einem gemeinsam genutzten Webhost. Sie ist zu groß geworden und ein einzelner Dump-Prozess mit Zip-Komprimierung wird beendet. Ich möchte jede Tabelle einzeln dumpen und zippen. Mit diesem Befehl
mysqldump -uuser -ppass database < show_tables.sql
Ich kann es so einrichten, dass alle Namen der Tabellen zurückgegeben werden:
table1
table2
etc
...
Wie kann ich dies in ein Bash-Skript einspeisen, sodass ich jede Zeile in einen Befehl dieser Syntax einspeisen kann?
mysqldump -uuser -ppass database table_name_goes_here > and_here.sql
?
BearbeitenTut mir leid, Leute, mir ist bei der ursprünglichen Formatierung ein Fehler unterlaufen. Die Ausgabe der show tables
Abfrage ist keine einzelne Zeile mit durch Leerzeichen getrennten Tabellennamen, sondern tatsächlich ein Tabellenname pro Zeile, so wie es jetzt formatiert ist. Ich entschuldige mich für die Verwirrung.
Antwort1
mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
Antwort2
Vorausgesetzt, die Tabellennamen dürfen keine Zeilenumbrüche enthalten,
mysqldump -uuser -ppass database < show_tables.sql |
while IFS= read -r table; do
mysqldump -uuser -ppass database "$table" > and_here.sql
done
Antwort3
DerHandbuchsagt
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),
Sie müssen also nur eine Möglichkeit finden, die Ausgabe Ihres Befehls dort einzufügen, wo sie steht value1 ... valuen
.
Das können Sie so machen
databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )
und dann wie folgt über sie iterieren
for database in ${databases[*]}; do
...
done
aber nur für den Fall, dass Ihr Tabellenname wirklich seltsam ist und einige Zeilenumbrüche enthält, würde ich empfehlen, mysql -Bse
zum Auflisten der Datenbanken und/oder Tabellen zu verwenden und es while read IFS=
wie von jw013 vorgeschlagen zu verwenden (möglicherweise ohne die -r
Option).
Antwort4
mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done
Funktioniert auch mit Leerzeichen in den Tabellen.