it-swarm.com.de

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

Ich habe diese riesige, unordentliche Datenbank, die ich aufräumt. Es beherbergt mehr als 500 Tische. Dies ist das Ergebnis der Kombination von Magento Enterprise und Joomla in einer einzigen Datenbank.

Zu allem Überfluss gibt es eine Reihe von über 70 Joomla-Tischen, die überhaupt nicht verwendet werden. Diesen ist alles mit bak_ vorangestellt.

Das Löschen dieser bak_-Tabellen wird einfach sein, aber ich möchte sie zuerst "backen" (sehen, was ich dort gemacht habe?). In meinem Kopf kann ich mir einen Befehl so vorstellen:

mysqldump -u username -p mydatabase bak_*

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

BEARBEITEN: Ja, ich könnte die 70 einzufügenden Tabellen explizit auflisten oder die ~ 430 Tabellen ausschließen, aber ich suche nach einem besseren Weg, dies zu tun, wenn möglich.

70
thaddeusmt

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

Sie können auch --ignore-table verwenden, wenn dies kürzer wäre.

Eine andere Idee ist, die Tabellen mit etwas in eine Datei zu bringen

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), können Sie Folgendes tun

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"
98
sreimer

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]
54
minaz

Mein Favorit:

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

Alle Antworten verwenden fast denselben Ansatz, dies ist jedoch die prägnanteste Syntax.

46

Ein weiterer Oneliner, um die Liste der Tabellennamen mit mysql -sN … zu extrahieren und dann jedes Element in einer Shell-Schleife "for ... in ..." 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 sie 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 1024, vgl. Ihre 70 Tabellen), können stören.


Gleiches Prinzip, jedoch zum Speichern aller Tabellen mit Ausnahme der Tabellen, 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
2
eleg

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 mit der Maske wie% mask% aus der Datenbank eine Tabelle erstellt - in eine einzige Datei.

2

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

Beachten Sie, dass es sich um ein halbfertiges Tool handelt. Sie müssen also sicherstellen, dass es die erforderlichen Funktionen unterstützt und es korrekt ausführt (z. B. bei MySQL 5.7.12 ist der Export der Trigger defekt).

2
Marcus

Basierend auf den anderen Antworten von Nice 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. brauche es 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
1
dtbarne

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'`
0
user3453061

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

0
bhrached