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.
Antworten:
Sie können Tabellennamen nacheinander in der Befehlszeile angeben, jedoch ohne Platzhalter.
mysqldump databasename table1 table2 table3
Sie können auch verwenden,
--ignore-table
wenn 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
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 {}"
quelle
mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt
Datei bearbeiten" zu bringen und alle Datenbanken in eine Zeile zu bringen. Dann domysqldump dbname `cat tables.txt`
gawk '{print $1"," }' tables.txt > baktables.sql
. Vielen Dank!mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
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]
quelle
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_%
mysql
und müssen das nicht ausführengrep
, um dieTables_in
Zeile herauszufiltern .show tables like "bak\_%"
nichts zurückgegeben wird, wird die gesamte Datenbank gesichert. Wie kann man das verhindern?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.
quelle
mysql -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
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
quelle
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.
quelle
Ab MySQL 5.7 unterstützt das
mysqlpump
Tool 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).
quelle
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
quelle
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'`
quelle
mysql DATABASE -u USERNAME -p -e 'zeigt Tabellen wie "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql
quelle