95 votes

Décharger une base de données mysql vers une sauvegarde en texte clair (CSV) à partir de la ligne de commande

J'aimerais éviter mysqldump qui produit des données sous une forme qui ne convient qu'à mysql. Le format CSV semble plus universel (un fichier par table suffit). Mais s'il y a des avantages à mysqldump, je suis tout ouïe. De plus, j'aimerais quelque chose que je puisse exécuter à partir de la ligne de commande (linux). Si c'est un mysql script, des indications sur la façon de faire une telle chose seraient utiles.

1 votes

146voto

Alnitak Points 143355

Si vous pouvez vous contenter d'une table à la fois et que vos données ne sont pas binaires, utilisez la fonction -B à l'option mysql commandement. Cette option permet de générer des fichiers TSV (tab separated) qui peuvent être importés dans Excel, etc. assez facilement :

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

Si vous avez un accès direct au système de fichiers du serveur, vous pouvez également utiliser la fonction SELECT INTO OUTFILE qui peut générer de véritables fichiers CSV :

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table

0 votes

Merci ! votre deuxième "table" devrait être "base de données", n'est-ce pas ? pas d'option pour CSV au lieu de TSV à votre connaissance ?

0 votes

Duh - oui, il aurait fallu lire "base de données". Non, il n'y a pas d'option pour le CSV, c'est le meilleur que je connaisse sans utiliser la fonction intégrée de MySQL 'select into outfile', qui puede fait du CSV, mais écrit les fichiers sur le serveur, pas sur le client.

0 votes

Comment forcer l'écrasement du fichier de sortie ?

32voto

Paul Tomblin Points 83687

Dans MySQL lui-même, vous pouvez spécifier une sortie CSV comme :

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

En http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

2 votes

Je n'arrive pas à trouver le fichier déchargé dans le répertoire que j'ai spécifié, pourquoi ?

0 votes

@JCm il se décharge sur le serveur

29voto

chmac Points 797

Vous pouvez vider une base de données entière en une seule fois avec mysqldump's --tab option. Vous fournissez un chemin d'accès à un répertoire et il en crée un .sql avec le fichier CREATE TABLE DROP IF EXISTS et une syntaxe de .txt avec le contenu, séparé par des tabulations. Pour créer des fichiers séparés par des virgules, vous pouvez utiliser ce qui suit :

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

Ce chemin doit être accessible en écriture à la fois par l'utilisateur mysql et par l'utilisateur qui exécute la commande. chmod 777 /tmp/path_to_dump/ d'abord.

1 votes

J'en reviens toujours à cette réponse, c'est certainement la meilleure façon d'exporter tous les tableaux vers un fichier délimité.

0 votes

mysqldump: You must use option --tab with --fields-...

0 votes

En tant que Racine : GRANT FILE ON *.* TO 'user1'@'localhost'; - stackoverflow.com/a/15014385/1707015 . Dans mon cas, j'ai dû prendre /var/lib/mysql-files/ (au lieu de /tmp/ ), définir l'utilisateur à mysql:mysql et définir les droits à 777 - stackoverflow.com/a/32737616/1707015 .

17voto

Sri Points 173

L'option select into outfile n'a pas fonctionné pour moi, mais la méthode détournée ci-dessous, qui consiste à faire passer un fichier délimité par des tabulations par l'intermédiaire de SED, a fonctionné :

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv

1 votes

Cette commande a donné lieu à la lettre t étant remplacée par ", " dans le fichier de sortie. Ce n'est pas exactement ce que je recherchais.

0 votes

Cela ne fonctionne pas. Il ne génère pas de fichier csv

3voto

Zoredache Points 8873

Si vous avez vraiment besoin d'une "sauvegarde", vous avez également besoin du schéma de la base de données, comme les définitions de tables, les définitions de vues, les procédures de stockage, etc. La sauvegarde d'une base de données ne se limite pas aux données.

L'intérêt du format mysqldump pour la sauvegarde est précisément qu'il est très FACILE à utiliser pour restaurer les bases de données mysql. Une sauvegarde qui n'est pas facile à restaurer est beaucoup moins utile. Si vous cherchez une méthode pour sauvegarder de manière fiable des données mysql afin de pouvoir les restaurer sur un serveur mysql, je pense que vous devriez vous en tenir à l'outil mysqldump.

Mysql est gratuit et fonctionne sur de nombreuses plateformes différentes. La mise en place d'un nouveau serveur mysql sur lequel je peux restaurer est simple. Je ne m'inquiète pas du tout de ne pas pouvoir configurer mysql pour pouvoir faire une restauration.

Je serais bien plus inquiet de voir une sauvegarde/restauration personnalisée basée sur un format fragile comme le csv/tsv échouer. Êtes-vous sûr que tous les guillemets, virgules ou tabulations présents dans vos données seront correctement échappés et ensuite analysés par votre outil de restauration ?

Si vous cherchez une méthode pour extraire les données, voyez-en plusieurs dans les autres réponses.

0 votes

Merci, c'est très utile ! vous m'avez convaincu. j'ai cependant d'autres raisons de vouloir un moyen rapide d'obtenir un dump csv via une commande en ligne. j'attends cela pour la "réponse acceptée". Je ne suis pas sûr que ce soit le cas (bien que je puisse probablement l'assembler à partir des réponses actuelles, je suppose avec un mysql script).

0 votes

Je vois bien l'intérêt d'avoir à la fois une sauvegarde utilisant la méthode native et des extraits à d'autres fins.

0 votes

Mk-parallel-restore peut restaurer une sauvegarde CSV créée avec mk-parallel dump, ce qui vous permet d'obtenir le meilleur des deux mondes. En fait, mk-parallel-restore fait un meilleur travail en s'assurant que les déclencheurs que vous avez définis sont restaurés en dernier.

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