Nur Mysqldump-Tabellen mit bestimmten Präfix- / Mysqldump-Platzhaltern?

84

Ich habe diese riesige, unordentliche Datenbank, die ich bereinige. Es enthält mehr als 500 Tabellen. Dies ist das Ergebnis der Kombination von Magento Enterprise mit Joomla in einer einzigen Datenbank.

Um die Sache noch schlimmer zu machen, gibt es mehr als 70 Joomla-Tabellen, die überhaupt nicht verwendet werden. Diesen wird alle vorangestellt bak_.

Nur diese bak_Tabellen zu löschen wird einfach sein, aber ich möchte sie zuerst "backen" (siehe, was ich dort gemacht habe?). In meinem Kopf kann ich mir einen Befehl wie diesen vorstellen:

mysqldump -u username -p mydatabase bak_*

Das funktioniert aber nicht. Was wäre der beste Weg, dies zu tun? Vielen Dank!

BEARBEITEN: Ja, ich könnte die 70 einzuschließenden oder die auszuschließenden ~ 430 Tabellen explizit auflisten, aber ich suche nach einer besseren Möglichkeit, dies zu tun, wenn möglich.

thaddeusmt
quelle
Antwort ist die Tabelle durch Abfrage auswählen und die Abfrage mit mysqldump passieren , weil mysqldump nicht die Regex dank viel Glück unterstützt
Daric
1
Ich denke, die Antwort auf Ihre Frage ist hier: stackoverflow.com/questions/2949330/…
raghu
Die Antwort von @minaz ist deutlich besser als die Antwort, die derzeit als am besten markiert ist. Würde helfen, dieses als besser zu markieren, wenn Sie natürlich zustimmen.
Dan Dascalescu

Antworten:

121

Sie können Tabellennamen nacheinander in der Befehlszeile angeben, jedoch ohne Platzhalter. mysqldump databasename table1 table2 table3

Sie können auch verwenden, --ignore-tablewenn das kürzer wäre.

Eine andere Idee ist, die Tabellen in eine Datei mit so etwas wie zu bekommen

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

Bearbeiten Sie die Datei und bringen Sie alle Datenbanken in eine Zeile. Dann mach

mysqldump dbname `cat tables.txt` > dump_file.sql

Um Tabellen in einer Zeile abzulegen (nicht empfohlen), haben Sie folgende Möglichkeiten

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"
sreimer
quelle
4
In beiden Fällen muss ich 70 Tabellen auflisten, die ignoriert werden sollen, oder 430 Tabellen, die eingeschlossen werden sollen. Das versuche ich zu vermeiden. Ich hätte in meiner Frage klarer sein sollen, aber danke für die Antwort. Das würde funktionieren, ja;)
thaddeusmt
1
Eine andere Idee ist, die Tabellen in eine Datei mit so etwas wie " mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtDatei bearbeiten" zu bringen und alle Datenbanken in eine Zeile zu bringen. Dann domysqldump dbname `cat tables.txt`
sreimer
Am Ende habe ich nur die bak_-Tabellen gelöscht, aber ich habe sie trotzdem verwendet, um die Liste der Tabellen zu erhalten. Dann habe ich sie zusammen mit Kommas geguckt, um eine große DROP TABLE-Anweisung zu erstellen gawk '{print $1"," }' tables.txt > baktables.sql. Vielen Dank!
thaddeusmt
Wie kann man das in einem Einzeiler machen? dh: ohne eine temporäre Datei als Vermittler zu verwenden?
Tom Auger
3
Dies würde es tunmysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer
59

Hier ist ein einfacher Weg:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
Minaz
quelle
4
es sollte sein, show tables like "<prefix>\_%"weil _es auch ein Platzhalter ist und maskiert werden sollte ... andernfalls könnten Sie ein Problem mit Tabellen bekommen, die das gleiche Präfix-Präfix wie bak_ und bak2_ haben, die beide ambak_%
reox
5
Sie können -N an übergeben mysqlund müssen das nicht ausführen grep, um die Tables_inZeile herauszufiltern .
Dan Dascalescu
1
Arbeitete für mich aber mit mysql -NB.
wesamly
Wenn show tables like "bak\_%"nichts zurückgegeben wird, wird die gesamte Datenbank gesichert. Wie kann man das verhindern?
Seb33300
57

Mein Favorit:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

Alle Antworten verfolgen fast den gleichen Ansatz, dies ist jedoch die präziseste Syntax.

Stephen M. Harris
quelle
11
Für diejenigen, die neugierig sind, sind diese Flags -B Batch -e Execute -s Silent Mode (weniger Ausgabe) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh
Ich liebe es. Ich bin schon oft hierher zurückgekommen, um mir diesen Ausschnitt zu schnappen!
Jason Galuten
Leichtes Problem: Möglicherweise müssen Sie die Parameter für Benutzername und Kennwort sowohl für den Befehl mysqldump als auch für den Befehl mysql eingeben. Und wenn der MySQL-Aufruf fehlschlägt, wird standardmäßig die gesamte Datenbank ausgegeben, was sehr groß sein kann, insbesondere in Fällen, in denen Sie dazu neigen, nur eine Teilmenge der Daten zu sichern.
Gwideman
Das funktioniert nichtmysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
Cloudbud
2

Ein weiterer Oneliner, mit dem Sie die Liste der Tabellennamen extrahieren mysql -sN …und dann jedes Element in einer "for ... in ..." - Shell-Schleife verwenden können, um sie zu löschen:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

oder (erweiterte Version)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

Oder verwenden Sie "group_concat", um * Namen von Tabellen zu verketten, wenn diese kurz genug sind:

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

* Einige Grenzwerte wie der Wert von "group_concat_max_len" (normalerweise gleich 1024, siehe Ihre 70 Tabellen) können stören.


Gleiches Prinzip, aber zum Ablegen aller Tabellen außer denen, die mit "bak_" beginnen:

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done
eleg
quelle
2

Es gibt bereits viele gute Antworten, aber ich bin mit einer solchen Variation hierher gekommen:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

Durch diese Aktion habe ich einen Tabellendump durch die Maske wie% mask% aus der Datenbank in eine einzelne Datei erstellt. Hoffentlich findet es jemand nützlich.

Andrinux
quelle
2

Ab MySQL 5.7 unterstützt das mysqlpumpTool das Filtern von Tabellennamen mit Mustern.

Beachten Sie, dass es sich um ein halbgebackenes Tool handelt. Sie müssen daher sicherstellen, dass es die erforderlichen Funktionen unterstützt und diese korrekt ausführt (z. B. ab MySQL 5.7.12 ist der Trigger-Export unterbrochen).

Marcus
quelle
3
Es stellt sich heraus, dass "mysqlpump" kein Tippfehler ist. dev.mysql.com/doc/refman/5.7/de/mysqlpump.html . Ja, mit der Option --include-tables abc% können Tabellen angegeben werden, die mit einem Platzhalter ausgegeben werden sollen. Es scheint jedoch keine Möglichkeit zu geben, mysqlpump dazu zu bringen, Ansichten auszuschließen. Ja, in der Tat ziemlich halbgebacken.
Gwideman
1

Aufbauend auf einigen der anderen netten Antworten hier habe ich ein Shell-Skript erstellt, um dies noch einfacher zu machen. Dieses Skript generiert 3 Dateien in der Ausgabe - eine mit der Struktur für alle Tabellen, eine mit den Daten für alle nicht ausgeschlossenen Tabellen und eine mit den Daten für alle "ausgeschlossenen" Tabellen (Sie können dies auskommentieren, wenn Sie es wirklich nicht tun). brauche ich nicht). Dann können Sie verwenden, welche Sie benötigen.

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz
dtbarne
quelle
0

Meine Lösung:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`
user3453061
quelle
0

mysql DATABASE -u USERNAME -p -e 'zeigt Tabellen wie "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql

bhrached
quelle