Belirli tablo (ları) nasıl mysqldump yapıyorsunuz?


318

Belirli bir tabloyu veya tablo kümesini, db tablolarının kalanını dahil etmeden nasıl bırakabilirim?

+1

Ayrıca bakınız: [Mysqldump'un yedekleme için veritabanlarını yoksayması seçeneği var mı?] (Http://dba.stackexchange.com/q/35081/1192) 19 mar. 162016-03-19 12:32:16

431

Eğer mydb'den t1, t2 ve t3 tablolarını atıyorsanız

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

Mydb'de bir ton tablonuz varsa ve t1, t2 ve t3 dışındaki her şeyi boşaltmak istiyorsanız, şunu yapın:

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

Bir şans ver !!!

GÜNCELLEME 2014-03-06 10:15 EST

@RoryDonohuebana işaret ettiGROUP_CONCATişlevin maksimum uzunluğunun uzatılması gerekir.Oturum değişkenini ekledimgroup_concat_max_len10K uzunluğunda olan cevabımı[email protected], teşekkürler.

+29

Yalnızca birkaç tabloyu dışlamak için kullanabilirsiniz --ignore-table = Table1 --ignore-table = Table2 --ignore-table = Table3 vb. 13 ara. 122012-12-13 13:06:49

  0

@codecowboy, 'SQL =" $ {SQL} VE table_name NOT IN ('t1', 't2', 't3') "' yi 'SQL =" $ {SQL} AND table_name NOT LIKE 'foo \ _ olarak değiştirebilirsiniz % ' "'.Sadece test ettim ve işe yarıyor.'Foo' içeren tüm tabloları isimlerinin herhangi bir yerinde ('yiyecek', 'aptal' vb. Dahil) almak için koşulu '% foo%' olarak değiştirebilirsiniz. 23 ara. 142014-12-23 02:55:37

  0

Buradaki * dışlama * tabloları yaklaşımı gereksiz - fazlalık - 'tablo tablosu' argümanının varlığına dayanarak yapılmadı mı?Ve eğer öyleyse, betiğinizi cevaptan çıkarmak ve yerine “-ignore-table” önermek daha iyi olmaz mıydı? 26 eyl. 162016-09-26 17:34:31

  0

@codewaggle Bu hatayı verir 'seçeneğinin geçersiz kullanımı --ignore-table =.

Tabloyu “schemaname.tablename” olarak belirtmediğim sürece. – 10 oca. 172017-01-10 14:33:31

  0

harika şeyler, herhangi bir nedenle SQL değişkeni çok satırlı değil mi? 23 haz. 172017-06-23 04:32:56

  0

Sadece çalışmıyor 'Veritabanını seçerken kullanıcının veritabanına t1 girmesi reddedildi' 07 şub. 182018-02-07 12:44:57


24

Birkaç masadan fazlasına sahipseniz, bunun gibi bir şeyi çalıştırmak çok daha iyidir:

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]

Ya da böyle bir şey düşün:

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

Bu komutların yalnızca bir satırda yazılması gerektiğini unutmayın.


65

the answer by RolandoMySQLDBA genişletilecek bir not.

İçerdiği senaryo, bir tablo listesini dahil etmek (and table_name in) veya dışlamak (and table_name NOT in) için harika bir yaklaşımdır.

Yalnızca bir veya iki tabloyu dışlamanız gerekiyorsa, --ignore-table seçeneğiyle bunları tek tek hariç tutabilirsiniz:

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

8

Basitçe aşağıdaki komutu kullanarak yapabilirsiniz:

mysqldump -uusername -ppassword dbname \
    --ignore-table=schema.tablename1  \
    --ignore-table=schema.tablename2  \
    --ignore-table=schema.tablename3 > mysqldump.sql
+3

--ignore-table, belirli tabloları dahil etmemek yerine mysqldump öğesinin dışında bırakmaktır.:) 16 eyl. 132013-09-16 07:02:50

+1

Ancak bir kişi hariç tutulacak tüm tabloları listeleyebildi ve geriye kalanları dökecek :-) 07 oca. 152015-01-07 18:17:40