web-dev-qa-db-fra.com

Base de données d'importation MySQL mais ignorer une table spécifique

J'ai un gros fichier SQL avec une base de données et environ 150 tables. J'aimerais utiliser mysqlimport pour importer cette base de données. Toutefois, j'aimerais que le processus d'importation ignore ou ignore quelques tables. Quelle est la syntaxe appropriée pour importer toutes les tables, mais en ignorer certaines? Je vous remercie.

30
DanielAttard

mysqlimport n'est pas le bon outil pour importer des instructions SQL. Cet outil est destiné à importer des fichiers texte formatés tels que CSV. Ce que vous voulez faire, c'est envoyer votre dump SQL directement au client mysql avec une commande comme celle-ci:

bash > mysql -D your_database < your_sql_dump.sql

Ni mysql ni mysqlimport ne fournissent la fonctionnalité dont vous avez besoin. Votre meilleure chance serait d’importer l’ensemble du dump, puis de supprimer les tables que vous ne voulez pas.

Si vous avez accès au serveur d'où provient le cliché, vous pouvez créer un nouveau cliché avec mysqldump --ignore-table=database.table_you_dont_want1 --ignore-table=database.table_you_dont_want2 ....


faites défiler vers le bas pour une meilleure option

8
RandomSeed

La réponse acceptée par RandomSeed pourrait prendre beaucoup de temps! Importer la table (juste pour la supprimer plus tard) peut être très coûteux, selon la taille.

Pour un fichier créé avec

mysqldump -u user -ppasswd --opt --routines DBname > DBdump.sql

Je reçois actuellement un fichier d'environ 7 Go, dont 6 Go sont des données pour une table de consignation dont je n'ai pas besoin. Le rechargement de ce fichier prend quelques heures. Si j'ai besoin de recharger (à des fins de développement, ou si cela est nécessaire pour une récupération en direct), j'écrase le fichier de la manière suivante:

sed '/INSERT INTO `TABLE_TO_SKIP`/d' DBdump.sql > reduced.sql

Et recharger avec:

mysql -u user -ppasswd DBname < reduced.sql

Cela me donne une base de données complète, avec la table "indésirable" créée mais vide. Si vous ne voulez vraiment pas du tout les tables, supprimez simplement les tables vides une fois le chargement terminé.

Pour plusieurs tables, vous pouvez faire quelque chose comme ceci:

sed '/INSERT INTO `TABLE1_TO_SKIP`/d' DBdump.sql | \
sed '/INSERT INTO `TABLE2_TO_SKIP`/d' | \
sed '/INSERT INTO `TABLE3_TO_SKIP`/d' > reduced.sql

Il y a IS un 'gotcha' - surveillez les procédures de votre vidage pouvant contenir "INSERT INTO TABLE_TO_SKIP".

103
Don

Si vous le souhaitez, vous pouvez réaliser cette table une à la fois: 

mysqldump -p sourceDatabase tableName > tableName.sql
mysql -p -D targetDatabase < tableName.sql
1
Domenic D.

Pour tous ceux qui travaillent avec des fichiers .sql.gz; J'ai trouvé la solution suivante très utile. Notre base de données était de 25 Go + et j'ai dû supprimer les tables de journalisation.

gzip -cd "./mydb.sql.gz" | sed -r '/INSERT INTO `(log_table_1|log_table_2|log_table_3|log_table_4)`/d' | gzip > "./mydb2.sql.gz"

Merci à la réponse de Don et au commentaire de Xosofox et à ce message connexe: Utilisez zcat et sed ou awk pour modifier le fichier texte .gz compressé

1
feskr

Voici mon script pour exclure certaines tables de mysql dump Je l'utilise pour restaurer une base de données lorsqu'il est nécessaire de conserver les commandes et les données de paiement.

exclude_tables_from_dump.sh  

#!/bin/bash

if [ ! -f "$1" ];
then
    echo "Usage: $0 mysql_dump.sql"
    exit
fi

declare -a TABLES=(
user
order
order_product
order_status
payments
)

CMD="cat $1"
for TBL in "${TABLES[@]}";do
    CMD+="|sed 's/DROP TABLE IF EXISTS \`${TBL}\`/# DROP TABLE IF EXIST \`${TBL}\`/g'"
    CMD+="|sed 's/CREATE TABLE \`${TBL}\`/CREATE TABLE IF NOT EXISTS \`${TBL}\`/g'"
    CMD+="|sed -r '/INSERT INTO \`${TBL}\`/d'"
    CMD+="|sed '/DELIMITER\ \;\;/,/DELIMITER\ \;/d'"
done

eval $CMD

Cela évite la suppression et la répétition de tables et l’insertion de données dans ces tables ..__ De plus, il supprime toutes les fonctions et procédures stockées entre DELIMITER ;; et DELIMITER;

0
Alexey Muravyov

Un peu vieux, mais sachez qu'il pourrait encore être utile ...

J'ai bien aimé la réponse de @Don ( https://stackoverflow.com/a/26379517/1446005 ) mais je trouvais cela très ennuyeux de devoir écrire dans un autre fichier au préalable ...
Dans mon cas particulier, cela prendrait trop de temps et d’espace disque

J'ai donc écrit un petit script bash:

#!/bin/bash

tables=(table1_to_skip table2_to_skip ... tableN_to_skip)


tableString=$(printf "|%s" "${tables[@]}")
trimmed=${tableString:1}
grepExp="INSERT INTO \`($trimmed)\`"

zcat $1 | grep -vE "$grepExp" | mysql -uroot -p

cela ne génère pas un nouveau script SQL mais le dirige directement vers la base de données
de plus, cela crée les tables, mais n’importe pas les données (ce qui était le problème que j’avais avec d’énormes tables de journalisation)

0
dGo

Je ne l'emploierais pas en production, mais si je devais importer rapidement une sauvegarde contenant de nombreuses tables plus petites et une table de monstres volumineuse pouvant prendre des heures, il est fort probable que je "grep -v unwanted_table_name" 

puis mysql -f <réduit.sql

0
Zoran