Belirli bir tabloyu veya tablo kümesini, db tablolarının geri kalan kısmını dahil etmeden nasıl bırakabilirim?
Belirli bir tabloyu veya tablo kümesini, db tablolarının geri kalan kısmını dahil etmeden nasıl bırakabilirim?
Yanıtlar:
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 !!!
@RoryDonohue , GROUP_CONCAT işlevinin maksimum uzunluğunun uzatılması gerektiğine işaret etti. Group_concat_max_len oturum değişkenini en fazla 10K uzunluğunda cevaplarıma ekledim . Teşekkürler, @RoryDonohue.
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
için SQL="${SQL} AND table_name NOT LIKE 'foo\_%'"
. Sadece test ettim ve işe yarıyor. 'Foo' içeren tüm tabloları adlarının herhangi bir yerinde ('yemek', 'aptal' vb. Dahil) almak için koşulu '% foo%' olarak değiştirebilirsiniz.
--ignore-table
argümanın varlığına dayanarak gereksiz ve fazla yüklenmemiş midir? Ve eğer öyleyse, betiğinizi cevaptan çıkarmak ve --ignore-table
bunun yerine önermek daha iyi olmaz mıydı ?
Illegal use of option --ignore-table=<database>.<table>
ben belirtmediğim sürece hata veriyor schemaname.tablename
.
RolandoMySQLDBA tarafından cevap genişletmek için bir not .
İçerdiği senaryo, bir tablo listesi ( 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, bunları seçenekle ayrı ayrı dışlayabilirsiniz --ignore-table
:
mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql
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.
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