Mysqldump yalnızca belirli önek / Mysqldump joker karakterlerine sahip tablolar mı?


84

Temizlediğim devasa, dağınık bir veritabanına sahibim. Magento Enterprise'ı Joomla ile tek bir DB'de birleştirmenin sonucu olan 500'den fazla tabloyu barındırır.

İşleri daha da kötüleştirmek için, hiç kullanılmayan 70'den fazla Joomla tablosu var. Bunların hepsinin önünde bak_.

Sadece bu bak_tabloları silmek kolay olacak, ancak önce onları 'pişirmek' istiyorum (orada ne yaptığımı gördün mü?). Aklımda şöyle bir komut hayal edebiliyorum:

mysqldump -u username -p mydatabase bak_*

Ama bu işe yaramıyor. Bunu yapmanın en iyi yolu ne olabilir? Teşekkürler!

DÜZENLEME: Evet, dahil edilecek 70 tabloyu veya dışlanacak ~ 430 tabloyu açıkça listeleyebilirim, ancak mümkünse bunu yapmanın daha iyi bir yolunu arıyorum.


cevap o tabloyu sorgu ile seçin ve mysqldump ile bu sorguyu iletin çünkü mysqldump normal ifadeyi desteklemiyor, teşekkürler iyi şanslar
Daric

1
Sanırım sorunuzun cevabı burada: stackoverflow.com/questions/2949330/…
raghu

@Minaz tarafından verilen cevap, şu anda en iyi olarak işaretlenen cevaptan açıkça daha iyi. Elbette kabul ediyorsanız, bunu daha iyi olarak işaretlemenize yardımcı olur.
Dan Dascalescu

Yanıtlar:


121

Komut satırında tablo adlarını birbiri ardına ancak joker karakterler olmadan belirtebilirsiniz. mysqldump databasename table1 table2 table3

Daha --ignore-tablekısa olacaksa da kullanabilirsiniz .

Başka bir fikir de tabloları şöyle bir dosyaya almaktır:

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

Dosyayı düzenleyin ve tüm veritabanlarını tek bir satıra alın. O zaman yap

mysqldump dbname `cat tables.txt` > dump_file.sql

Tabloları tek satıra bırakmak için (önerilmez) aşağıdakileri yapabilirsiniz

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4
Ama her iki durumda da, yok sayılacak 70 tabloyu veya dahil edilecek 430 tabloyu listelemem gerekecek. Yapmaktan kaçınmaya çalıştığım şey bu. Sorumda daha net olmalıydım, ama cevabın için teşekkürler. Bu işe
yarar

1
Başka bir fikir, tabloları dosyayı mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtdüzenle gibi bir dosyaya almak ve tüm veritabanlarını tek bir satıra almaktır. Öyleyse yapmysqldump dbname `cat tables.txt`
sreimer

Bak_ masalarını düşürdüm, ama yine de bunu tablo listesini almak için kullandım. Sonra büyük bir DROP TABLE ifadesi oluşturmak için virgüllerle birlikte onlara baktım gawk '{print $1"," }' tables.txt > baktables.sql. Teşekkürler!
thaddeusmt

Bunu tek satırda yapmanın bir yolu var mı? yani: aracı olarak bir geçici dosya kullanmadan mı?
Tom Auger

3
Bu yapardımysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer

59

İşte kolay bir yol:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4
Olması gerektiği show tables like "<prefix>\_%", çünkü _aynı zamanda bir joker ve kaçan edilmelidir aksi takdirde bak_ ve bak2_ gibi aynı önek ön eki tablolar ile ilgili bir sorun alabilir ... olur hem maçbak_%
REOX

5
-N'yi iletebilirsiniz ve satırı filtrelemek mysqliçin çalıştırmanız gerekmez . grepTables_in
Dan Dascalescu

1
Benim için çalıştı ama mysql -NB ile.
wesamly

Eğer show tables like "bak\_%"döner şey, tüm veritabanı dökülüyor. Bunu önlemenin bir yolu var mı?
Seb33300

57

Benim favorim:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

Tüm yanıtlar neredeyse aynı yaklaşımı benimsiyor, ancak bu en kısa sözdizimidir.


11
merak edenler için bu bayraklar -B toplu -e çalıştır -s sessiz mod (daha az çıktı) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh

Bunu seviyorum. Bu pasajı almak için buraya birçok kez geldim!
Jason Galuten

Biraz aldım: Hem mysqldump hem de mysql komutları için kullanıcı adı ve parola parametrelerini doldurmanız gerekebilir. Ve mysql çağrısı başarısız olursa, mysqldump varsayılan olarak tüm veritabanını boşaltmaya başlar; bu, özellikle verilerin yalnızca bir alt kümesini dökmeye meyilli olduğunuz durumlarda çok büyük olabilir.
gwideman

bu çalışmıyormysql -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
cloudbud

2

Tablo adlarının listesini çıkarmak için başka bir oneliner mysql -sN …ve ardından her öğeyi bir "for… in…" kabuk döngüsünde kullanarak onları bırakmak için kullanın:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

veya (genişletilmiş versiyon)

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

Veya yeterince kısaysa, tablo adlarını * birleştirmek için "group_concat" kullanın:

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"

* "group_concat_max_len" değeri gibi bazı sınırlar (tipik olarak 1024'e eşittir, 70 tablonuza göre) karışabilir.


Aynı prensip, ancak "bak_" ile başlayanlar dışındaki tüm tabloların dökümünü çıkarmak için:

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

2

Zaten pek çok iyi cevap var, ama ben buraya böyle bir çeşitlilikle geldim

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`

Bu eylemle veritabanından tek bir dosyaya % mask% gibi maske ile bir tablo dökümü yaptım . Umarım birisi onu faydalı bulacaktır.


2

MySQL 5.7'den itibaren, mysqlpumparaç, desenlerle tablo adı filtrelemesini destekler.

Bunun yarı pişmiş bir araç olduğuna dikkat edin, bu nedenle gerekli işlevleri desteklediğinden ve bunları doğru şekilde gerçekleştirdiğinden emin olmanız gerekir (örn. MySQL 5.7.12'den itibaren, tetikleyici dışa aktarım bozuktur).


3
"Mysqlpump" ın bir yazım hatası olmadığı ortaya çıktı. dev.mysql.com/doc/refman/5.7/en/mysqlpump.html . Evet, --include-tables abc% seçeneği, tabloların joker karakter kullanılarak dökümü yapılmasına izin verir. Ancak görünümleri dışlamak için mysqlpump'ı almanın bir yolu yok gibi görünüyor. Evet, gerçekten yarı pişmiş.
gwideman

1

Buradaki diğer güzel cevaplardan bazılarına dayanarak, bunu daha da kolaylaştırmak için kabuk komut dosyası oluşturdum. Bu komut dosyası, çıktıda 3 dosya oluşturur - biri tüm tabloların yapısını, biri hariç tutulmayan tüm tabloların verilerini içeren ve diğeri tüm "hariç tutulan" tabloların verilerini içerir (gerçekten yapmazsanız, bunu yorumlayabilirsiniz. ihtiyacım yok). O zaman hangisine ihtiyacınız olduğunu kullanabilirsiniz.

#!/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

0

Çözümüm:

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'`

0

mysql VERİTABANI -u KULLANICI ADI -p -e '"PREFIX%" gibi tabloları gösterir' | grep -v Tablolar_in | xargs mysqldump VERİTABANI -u KULLANICI ADI -p> DUMP.sql

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.