mysqldump ignore la table avec un caractère générique

8

J'ai besoin de faire un vidage d'une base de données contenant 50 tables impaires dont je veux exclure environ 15 impaires qui ont un préfixe exam_

J'ai essayé mysqldump --ignore-table=dbname.exam_* et même essayé --ignore-table=dbname.exam_% Cela n'a pas fonctionné comme prévu. J'ai dû utiliser --ignore-tableplusieurs fois.

Edit: j'ai vu quelques scripts shell qui les listent tables not like tablename_%et les transmettent mysqldump.

Cependant, je voudrais savoir s'il existe une option dans mysqldump ou mysql, en tant que telle, pour faire de même sans avoir à le scripter.

Edit-add: finalement utilisé un script pour vider la base de données excluant les tables, en utilisant ignore-table=plusieurs fois.

anup
la source
pouvez-vous publier le script que vous avez utilisé? peut-être l'héberger sur gist.github.com
rubo77
@ rubo77: Je n'ai plus ce script. C'était un script de base. En utilisant la commande mysql, j'ai obtenu une liste des tables que je voulais exclure. Codé en dur la liste dans un script BASH pour produire un vidage chaque fois que nécessaire. Heureusement pour moi, la liste était constante. Alternativement, une solution publiée ici peut être utile en ce qui concerne les scripts.
2015 à 10h26
Mieux encore: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

Réponses:

13

Non, il n'y a pas d'option comme ça dans la mysqldumpcommande, comme le disent les docs :

--ignore-table = db_name.tbl_name

Ne videz pas la table donnée, qui doit être spécifiée à l'aide des
noms de base de données et de table. Pour ignorer plusieurs tables, utilisez cette option
plusieurs fois. Cette option peut également être utilisée pour ignorer les vues.

NickW
la source
mysqldump --all-databasesSoit dit en
passant
Je ne l'ai pas essayé, mais ça sonne bien. Quant à la solution, j'ai écrit un script shell pour éviter les tables.
anup
@NickW Cela pourrait fonctionner. Mais si vous souhaitez plus de flexibilité, vous devez effectuer une requête distincte pour obtenir les noms de table. Voir ma réponse ci-dessous.
Buttle Butkus
version rapide et sale: dupe la base de données. utilisez l'interface Web de phpMyAdmin pour supprimer facilement les tableaux que vous ne voulez pas voir. puis vidage et aucun caractère générique nécessaire. si vous voulez une exécution CLI et ne vous occupez pas d'une troisième étape sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight
3

Vous pouvez obtenir les noms de table que vous voulez à partir de mysql, puis les utiliser pour créer vos paramètres de vidage mysql.

Dans l'exemple ci-dessous, remplacez simplement "someprefix" par votre préfixe (par exemple "exam_").

La SHOW TABLESrequête peut être modifiée pour trouver d'autres ensembles de tables. Ou vous pouvez utiliser une requête sur la INFORMATION_SCHEMAtable pour utiliser encore plus de critères.

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

Ceci a été construit avec l'aide de cette réponse sur l'obtention de "toutes les tables avec exclusion dans bash": https://stackoverflow.com/a/9232076/631764

et cette réponse sur les tables à sauter avec certains bash utilisés: https://stackoverflow.com/a/425172/631764

Buttle Butkus
la source
Sur la base de la réponse sélectionnée, j'ai écrit un script similaire à votre réponse. Merci d'avoir mis ça. Edit: je me souviens juste que j'ai utilisé deux commandes avec un motif d'exclusion de pipe et grep.
2018
0

Je pense que l'utilisation de la information_schemaest une bonne voie à suivre pour cela.

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%';
user3783243
la source