mysqldump abaikan tabel dengan wildcard

8

Saya perlu mengambil dump database yang berisi 50 tabel aneh yang saya ingin mengecualikan sekitar 15 aneh yang memiliki awalan exam_

Saya mencoba mysqldump --ignore-table=dbname.exam_* dan bahkan mencoba. --ignore-table=dbname.exam_% Itu tidak berhasil seperti yang diharapkan. Saya harus menggunakan --ignore-tablebeberapa kali.

Sunting: Saya telah melihat beberapa skrip shell yang berisi daftar tables not like tablename_%dan meneruskannya mysqldump.

Namun, saya ingin tahu apakah ada opsi di mysqldump atau mysql, untuk melakukan hal yang sama tanpa harus skrip.

Sunting-tambah: Akhirnya menggunakan skrip untuk membuang tabel DB tidak termasuk, menggunakan ignore-table=beberapa kali.

anup
sumber
dapatkah Anda memposting skrip yang Anda gunakan? mungkin host di gist.github.com
rubo77
@ rubo77: Saya tidak punya skrip itu lagi. Itu adalah naskah dasar. Menggunakan perintah mysql saya mendapat daftar tabel yang ingin saya kecualikan. Hard-coded daftar ke skrip BASH untuk menghasilkan dump kapan pun diperlukan. Untungnya bagi saya, daftarnya tetap. Atau, solusi yang diposting di sini mungkin bermanfaat sehubungan dengan skrip.
anup
Lebih baik lagi: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

Jawaban:

13

Tidak, tidak ada opsi seperti itu dalam mysqldumpperintah, seperti yang dikatakan oleh para dokter :

--ignore-table = db_name.tbl_name

Jangan membuang tabel yang diberikan, yang harus ditentukan menggunakan
database dan nama tabel. Untuk mengabaikan beberapa tabel, gunakan opsi ini
beberapa kali. Opsi ini juga dapat digunakan untuk mengabaikan pandangan.

NickW
sumber
Sebagai tambahan, mungkin layak membuat pengguna dump mysql yang tidak memiliki akses ke tabel tersebut, kemudian mencoba mysqldump --all-databaseshanya untuk melihat apakah kesalahan keluar, atau hanya melompat ke dDB berikutnya ..
NickW
Belum mencobanya, tapi kedengarannya bagus. Adapun solusinya, saya menulis skrip shell untuk menghindari tabel.
anup
@NickW Itu mungkin berhasil. Tetapi jika Anda menginginkan lebih banyak fleksibilitas, Anda harus melakukan kueri terpisah untuk mendapatkan nama tabel. Lihat jawaban saya di bawah ini.
Buttle Butkus
versi cepat dan kotor: menipu basis data. gunakan antarmuka web phpMyAdmin untuk dengan mudah menjatuhkan tabel yang tidak ingin Anda lihat. lalu buang dan tidak ada wildcard yang dibutuhkan. jika Anda ingin eksekusi CLI dan tidak keberatan langkah ketiga sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight
3

Anda bisa mendapatkan nama tabel yang Anda inginkan dari mysql, dan kemudian menggunakannya untuk membangun parameter dump mysql Anda.

Pada contoh di bawah ini, ganti saja "someprefix" dengan awalan Anda (mis. "Exam_").

The SHOW TABLESquery dapat diubah untuk menemukan set lain dari tabel. Atau Anda bisa menggunakan kueri terhadap INFORMATION_SCHEMAtabel untuk menggunakan lebih banyak kriteria.

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

Ini dibangun dengan bantuan dari jawaban ini tentang mendapatkan "semua tabel dengan tidak termasuk dalam bash": https://stackoverflow.com/a/9232076/631764

dan jawaban ini tentang melewatkan tabel dengan beberapa bash yang digunakan: https://stackoverflow.com/a/425172/631764

Butkus Buttle
sumber
Berdasarkan jawaban yang dipilih, saya menulis skrip yang mirip dengan jawaban Anda. Terima kasih telah menyiapkan ini. Sunting: baru ingat bahwa saya menggunakan dua perintah dengan pola pipa dan grep mengecualikan.
anup
0

Saya pikir menggunakan information_schemaadalah rute yang baik untuk mengambil ini.

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%';
pengguna3783243
sumber