Wie mysqldump Sie bestimmte Tabelle (n)?

Antworten:

540

Wenn Sie die Tabellen t1, t2 und t3 von mydb sichern

mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql

Wenn Sie eine Menge Tabellen in mydb haben und alles außer t1, t2 und t3 sichern möchten, gehen Sie folgendermaßen vor:

DBTODUMP=mydb
SQL="SET group_concat_max_len = 10240;"
SQL="${SQL} SELECT GROUP_CONCAT(table_name separator ' ')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='${DBTODUMP}'"
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
TBLIST=`mysql -u... -p... -AN -e"${SQL}"`
mysqldump -u... -p... ${DBTODUMP} ${TBLIST} > mydb_tables.sql

Versuche es !!!

UPDATE 06.03.2014 10:15 EST

@RoryDonohue hat mich darauf hingewiesen, dass die maximale Länge der GROUP_CONCAT- Funktion verlängert werden muss. Ich habe meiner Antwort die Sitzungsvariable group_concat_max_len mit einer maximalen Länge von 10 KB hinzugefügt . Danke, @RoryDonohue.

RolandoMySQLDBA
quelle
43
Um auszuschließen , nur ein paar Tabellen können Sie verwenden --ignore-table = Tabelle 1 --ignore-table = Table2 --ignore-table = usw. Table3
codewaggle
@codecowboy, können Sie ändern SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"zu SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Ich habe es gerade getestet und es funktioniert. Sie können die Bedingung in "% foo%" ändern, um alle Tabellen mit "foo" an einer beliebigen Stelle im Namen abzurufen (einschließlich "food", "fool" usw.).
Buttle Butkus
1
Ist der Ansatz zum Ausschließen von Tabellen hier angesichts des vorliegenden --ignore-tableArguments nicht redundant und übertrieben ? Und wenn ja, wäre es nicht besser, Ihr Skript aus der Antwort zu streichen und --ignore-tablestattdessen nur zu empfehlen ?
Mark Amery
@codewaggle Das gibt den Fehler, es Illegal use of option --ignore-table=<database>.<table>sei denn, ich gebe die Tabelle als schemaname.tablename.
WAF
coole Sachen, aus irgendeinem Grund SQL-Variable ist nicht mehrzeilig?
SDKKS
72

Ein Hinweis zur Antwort von RolandoMySQLDBA .

Das Skript, das er einfügte, ist ein großartiger Ansatz, um eine Liste von Tabellen and table_name ineinzuschließen ( and table_name NOT in) oder auszuschließen ( ).

Wenn Sie nur eine oder zwei Tabellen ausschließen müssen, können Sie diese mit der folgenden --ignore-tableOption einzeln ausschließen :

mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql
Codewaggle
quelle
29

Wenn Sie mehr als ein paar Tabellen haben, ist es viel besser, so etwas auszuführen:

mysql databasename -u [user] -p[password] -e 'show tables like "table_name_%"' 
       | grep -v Tables_in 
       | xargs mysqldump [databasename] -u [root] -p [password] > [target_file]

Oder so ähnlich:

mysqldump -u [user] -p[password] databasename `echo "show tables like 'table_name_%';" 
       | mysql -u[user] -p[password] databasename 
       | sed '/Tables_in/d'` > [target_file]

Denken Sie daran, dass diese Befehle nur in einer Zeile eingegeben werden dürfen.

grosshat
quelle
11

Sie können es einfach mit dem folgenden Befehl tun:

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.tablename1    \
  --ignore-table=schema.tablename2    \
  --ignore-table=schema.tablename3 > mysqldump.sql
Vaibhav
quelle
4
--ignore-table soll bestimmte Tabellen von mysqldump ausschließen, nicht einschließen. :)
Praveen Prasannan
3
Dennoch könnte man alle auszuschließenden Tabellen auflisten und es würden nur die verbleibenden gelöscht :-)
Colin 't Hart