79 votes

Comment utiliser mysqldump pour une partie d'une table ?

Je ne peux donc exporter qu'un tableau comme celui-ci :

mysqldump -u root -p db_name table_name > table_name.sql

Existe-t-il un moyen d'exporter seulement une partie d'une table avec mysqldump ? Par exemple, 0 à 1 000 000 de lignes, 1 000 000 à 2 000 000 de lignes, etc.

Dois-je le faire avec mysqldump ou une requête ?

158voto

Neo Points 1468
mysqldump -uroot -p db_name table_name --where='id<1000000'

ou vous pouvez utiliser

SELECT * INTO OUTFILE 'data_path.sql' from table where id<100000

11 votes

Si vous l'utilisez pour une sauvegarde incrémentielle de quelque sorte que ce soit, assurez-vous d'inclure --skip-create-options et éventuellement --skip-add-drop-table juste pour être sûr. Sinon, vous supprimerez toutes les lignes de toute table préexistante.

2 votes

Vous avez oublié de mentionner -t et > dump_file_name.dump donc ça devrait être comme ça ; mysqldump -t -uroot -p db_name table_name -w"id<1000000" > file_name.dump

0 votes

La première solution semble ne pas permettre de joindre des tables et de ne vider qu'une table spécifique ? La deuxième solution fonctionne en joignant des tables et en vidant une table spécifique. Mais la sortie ne peut pas être renvoyée directement à SQL. Comment contourner ce problème ? Merci.

6voto

noisex Points 51
mysqldump --skip-triggers --compact --no-create-info --user=USER --password=PASSWORD -B DATABASE --tables MY_TABLE --where='SOME_COLUMN>=xxxx' > out.sql

2voto

user2755358 Points 79

Le fichier vidangé est différent du fichier que vous utilisez pour sélectionner SQL. Pour la 2ème approche, vous ne pouvez pas simplement utiliser : mysql database < table pour vider la table dans une base de données.

1voto

John Points 869

La question est toujours d'actualité, la plupart des gens trouveront ce genre de questions car elles souffrent de la conception monofilaire de mysql et mysqldump.
Si vous avez des millions ou des milliards de lignes, l'exportation peut prendre des jours (voire des semaines) et vous finissez par n'exporter que des parties des données.

Une solution rapide pour résoudre ce problème consiste à exporter des parties des données, ce qui fonctionne mieux si vous avez une clé numérique (comme un identifiant à incrémentation automatique).
Vous trouverez ci-dessous un exemple pour linux/unix sur la façon d'exporter une table 20 à 100 fois plus vite que la normale.

Assumed column "id" is from 1 to 10000000
Assumed cpu has 16 threads
Assumed disk is an ssd or nvme
seq 0 1000 | xargs -n1 -P16 -I{} | mysqldump -h localhost --password=PASSWORD --single-transaction DATABASE TABLE --where "id > {}*10000 AND id < {}*10000+10000" -r output.{}

Le code ci-dessus fera tourner 16 threads, réduisant ainsi le temps d'exportation à 1/10 de la normale. Il crée 16 fichiers qui peuvent également être chargés en parallèle, ce qui accélère le chargement jusqu'à 10 fois.
Sur un serveur puissant, j'utilise jusqu'à 150 threads parallèles, cela dépend du type de disque et de processeur que vous utilisez.
Cette méthode, un peu raffinée, peut réduire à quelques heures le chargement ou l'exportation d'une semaine.

Lorsque vous effectuez cette opération sur le réseau, le paramètre --compress peut être d'une grande aide. De même, ignorer les instructions d'insertion peut aider à résoudre les problèmes d'indexation de mysql, qui sont inévitables pour les données volumineuses.

P.S. N'utilisez jamais les options mysql pour ajouter des index et des clés à la fin sur les grandes tables.

0voto

sadanand patel Points 40
mysqldump -uroot -p db_name table_name --where'id<1000000' > yourdumpname.sql

1 votes

En revenant en arrière, vous passez à la réponse acceptée parce que : la documentation utilise la réponse = pour l'option where dev.mysql.com/doc/refman/8.0/fr/ (idem dans 5.7 dev.mysql.com/doc/refman/5.7/fr/ ). Les alternatives sont --where 'condition' o --w'condition' mais votre version actuelle --where'condition' donne mysqldump: unkown option '--wherecondition' . S'il existe des différences spécifiques à une version, veuillez en préciser les conditions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X