mysqldump ignora la tabella con caratteri jolly


8

Devo prendere un dump di un database contenente 50 tabelle dispari di cui voglio escludere circa 15 dispari con prefisso exam_

Ho provato mysqldump --ignore-table=dbname.exam_* e persino provato --ignore-table=dbname.exam_% Non ha funzionato come previsto. Ho dovuto usare --ignore-tablepiù volte.

Modifica: ho visto alcuni script di shell che elencano tables not like tablename_%e li passano mysqldump.

Tuttavia, vorrei sapere se esiste un'opzione in mysqldump o mysql, in quanto tale per fare lo stesso senza dovere copiarlo.

Modifica-aggiunta: alla fine ha utilizzato uno script per eseguire il dump del DB escludendo le tabelle, usando ignore-table=più volte.


puoi pubblicare lo script che hai usato? magari ospitalo
rubo77

@ rubo77: non ho più quello script. Era una sceneggiatura di base. Usando il comando mysql ho ottenuto un elenco di tabelle che volevo escludere. L'elenco è stato codificato in modo rigido su uno script BASH per produrre dump ogni volta che era necessario. Fortunatamente per me, l'elenco era costante. In alternativa, una soluzione pubblicata qui può essere utile per quanto riguarda gli script.
Anup

Meglio ancora: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
fino al

Risposte:


13

No, non esiste alcuna opzione simile nel mysqldumpcomando, come dicono i documenti :

--ignore-table = db_name.tbl_name

Non eseguire il dump della tabella specificata, che deve essere specificata utilizzando sia il
database sia i nomi delle tabelle. Per ignorare più tabelle, utilizzare questa opzione
più volte. Questa opzione può anche essere utilizzata per ignorare le viste.


A parte questo, potrebbe valere la pena creare un utente di dump mysql che non ha accesso a quelle tabelle, quindi provare mysqldump --all-databasesa vedere semplicemente se si verificano errori o saltare al successivo dDB ..
NickW,

Non l'ho provato, ma suona bene. Per quanto riguarda la soluzione, ho scritto uno script di shell per evitare le tabelle.
fino al

@NickW Potrebbe funzionare. Ma se si desidera maggiore flessibilità, è necessario eseguire una query separata per ottenere i nomi delle tabelle. Vedi la mia risposta qui sotto.
Buttle Butkus,

versione veloce e sporca: duplicare il database. usa l'interfaccia web di phpMyAdmin per eliminare facilmente le tabelle che non vuoi vedere. quindi dump e nessun carattere jolly necessario. se desideri l'esecuzione della CLI e non ti dispiace un terzo passaggio sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight

3

È possibile ottenere i nomi delle tabelle desiderati da mysql e quindi utilizzarli per creare i parametri di dump di mysql.

Nell'esempio seguente, sostituisci semplicemente "someprefix" con il prefisso (ad es. "Esame_").

La SHOW TABLESquery può essere modificata per trovare altri set di tabelle. Oppure puoi utilizzare una query sulla INFORMATION_SCHEMAtabella per utilizzare ancora più criteri.

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

Questo è stato creato con l'aiuto di questa risposta su come ottenere "tutte le tabelle con l'esclusione in bash": https://stackoverflow.com/a/9232076/631764

e questa risposta su come saltare le tabelle con alcuni bash usati: https://stackoverflow.com/a/425172/631764


Sulla base della risposta selezionata, ho scritto uno script simile alla tua risposta. Grazie per averlo presentato. Modifica: ho appena ricordato che ho usato due comandi con pipe e grep exclude pattern.
anup

0

Penso che usare la information_schemasia una buona strada da prendere per questo.

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%';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.