mysqldump ignoriert Tabelle mit Platzhalter

8

Ich muss einen Speicherauszug einer Datenbank erstellen, die 50 ungerade Tabellen enthält, von denen ich etwa 15 ungerade Tabellen mit Präfix ausschließen möchte exam_

Ich habe es versucht mysqldump --ignore-table=dbname.exam_* und sogar versucht. --ignore-table=dbname.exam_% Es hat nicht wie erwartet funktioniert. Ich musste --ignore-tablemehrmals verwenden.

Bearbeiten: Ich habe einige Shell-Skripte gesehen, die diese auflisten tables not like tablename_%und an sie weitergeben mysqldump.

Ich würde jedoch gerne wissen, ob es in mysqldump oder mysql eine Option gibt, um dasselbe zu tun, ohne es skripten zu müssen.

Bearbeiten-Hinzufügen: Verwendete schließlich ein Skript, um die Datenbank ohne Tabellen ignore-table=mehrmals zu sichern .

anup
quelle
Kannst du das Skript posten, das du benutzt hast? Vielleicht hosten Sie es auf gist.github.com
rubo77
@ rubo77: Ich habe das Skript nicht mehr. Es war ein einfaches Skript. Mit dem Befehl mysql erhielt ich eine Liste der Tabellen, die ich ausschließen wollte. Die Liste wurde fest in ein BASH-Skript codiert, um bei Bedarf einen Speicherauszug zu erstellen. Zum Glück war die Liste konstant. Alternativ erzielte eine Lösung hier kann mit Bezug auf Scripting nützlich sein.
Anup
Besser noch: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

Antworten:

13

Nein, es gibt keine solche Option im mysqldumpBefehl, wie in den Dokumenten angegeben :

--ignore-table = Datenbankname.tbl_name

Speichern Sie nicht die angegebene Tabelle, die sowohl mit dem
Datenbank- als auch mit dem Tabellennamen angegeben werden muss . Verwenden Sie diese Option
mehrmals, um mehrere Tabellen zu ignorieren . Diese Option kann auch zum Ignorieren von Ansichten verwendet werden.

NickW
quelle
Abgesehen davon könnte es sich lohnen, einen MySQL-Dump-Benutzer zu erstellen, der keinen Zugriff auf diese Tabellen hat, und dann zu versuchen, mysqldump --all-databasesnur zu sehen, ob ein Fehler vorliegt, oder einfach zur nächsten dDB zu springen.
NickW
Ich habe es nicht versucht, aber es klingt gut. Für die Lösung habe ich ein Shell-Skript geschrieben, um die Tabellen zu vermeiden.
Anup
@ NickW Das könnte funktionieren. Wenn Sie jedoch mehr Flexibilität wünschen, müssen Sie eine separate Abfrage durchführen, um die Tabellennamen abzurufen. Siehe meine Antwort unten.
Buttle Butkus
schnelle und schmutzige Version: Duplizieren Sie die Datenbank. Verwenden Sie die Weboberfläche von phpMyAdmin, um die Tabellen, die Sie nicht sehen möchten, einfach zu löschen. dann Dump und kein Platzhalter benötigt. Wenn Sie die CLI-Ausführung wünschen und sich nicht um einen dritten Schritt kümmern, ist sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight
3

Sie können die gewünschten Tabellennamen von MySQL abrufen und sie dann zum Erstellen Ihrer MySQL-Dump-Parameter verwenden.

Ersetzen Sie im folgenden Beispiel einfach "someprefix" durch Ihr Präfix (z. B. "exam_").

Die SHOW TABLESAbfrage kann geändert werden, um andere Tabellensätze zu finden. Oder Sie können eine Abfrage für die INFORMATION_SCHEMATabelle verwenden, um noch mehr Kriterien zu verwenden.

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

Dies wurde mit Hilfe dieser Antwort zum Abrufen "aller Tabellen mit Ausschluss in Bash" erstellt: https://stackoverflow.com/a/9232076/631764

und diese Antwort zum Überspringen von Tabellen mit einigen verwendeten Bashs: https://stackoverflow.com/a/425172/631764

Buttle Butkus
quelle
Basierend auf der ausgewählten Antwort habe ich ein Skript geschrieben, das Ihrer Antwort ähnelt. Danke, dass du das gemacht hast. Bearbeiten: Ich habe mich gerade daran erinnert, dass ich zwei Befehle mit Pipe- und Grep-Ausschlussmuster verwendet habe.
Anup
0

Ich denke, die Verwendung von information_schemaist ein guter Weg, um dies zu tun.

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
user3783243
quelle