90 votes

Dump de toutes les tables au format CSV en utilisant 'mysqldump'.

J'ai besoin de jeter tous dans MySQL au format CSV.

Existe-t-il une commande utilisant mysqldump a juste sortir chaque ligne de chaque tableau au format CSV ?

135voto

Marcos Points 942

D'abord, je peux vous donner la réponse pour un table :

Le problème avec toutes ces INTO OUTFILE o --tab=tmpfile (et -T/path/to/directory ) répond qu'il faut exécuter mysqldump sur le même serveur comme le serveur MySQL, et avoir ces droits d'accès.

Ma solution était simplement d'utiliser mysql ( no mysqldump ) avec le -B l'instruction SELECT est mise en ligne avec le paramètre -e puis masser la sortie ASCII avec sed et vous obtenez un CSV comprenant une ligne de champ d'en-tête :

Exemple :

 mysql -B -u username -p password database -h dbhost -e "SELECT * FROM accounts;" \
 | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"

"id", "login", "password", "folder", "email" "8", "mariana", "xxxxxxxxxx", "mariana","" "3", "squaredesign", "xxxxxxxxxxxxx", "squaredesign", "mkobylecki@squaredesign.com" "4", "miedziak", "xxxxxxxxxx", "miedziak", "miedziak@mail.com" "5","Sarko","xxxxxxxxx","Sarko","" "6", "Logitrans Pologne", "xxxxxxxxxxxxxx", "LogitransPoland","" "7", "Amos", "xxx "9", "Annabelle", "xxxxxxxxxxxxxxxx", "Annabelle","" "11", "Brandfathers and Sons", "xxxxxxxxxxxxxxxxx", "BrandfathersAndSons","" "12", "Imagine Group", "xxxxxxxxxxxxxxxx", "ImagineGroup","" "13", "EduSquare.pl", "xxxxxxxxxxxxxxxxx", "EduSquare.pl","" "101", "tmp", "xxxxxxxxxxxxxxxxx","_", "WOBC-14.squaredesign.atlassian.net@yoMama.com"

Ajouter un > outfile.csv à la fin de cette phrase, pour obtenir votre fichier CSV pour cette table.

Ensuite, obtenez une liste de tous vos tables avec

mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"

À partir de là, il ne reste plus qu'une étape pour créer une boucle, par exemple dans le shell Bash, afin d'itérer sur ces tables :

 for tb in $(mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"); do
     echo .....;
 done

Entre le do y ; done insérez la longue commande que j'ai écrite dans la partie 1 ci-dessus, mais remplacez votre nom de tablier par $tb à la place.

34voto

Armance Wissal Points 1575

Cette commande va créer deux fichiers dans /chemin/vers/répertoire nom_table.sql y nom_table.txt .

Le fichier SQL contiendra le schéma de création de la table et le fichier txt contiendra les enregistrements de la table mytable avec les champs délimités par une virgule.

mysqldump -u username -p -t  -T/path/to/directory dbname table_name --fields-terminated-by=','

22voto

Anis Points 122

Si vous utilisez MySQL ou MariaDB, le moyen le plus simple et le plus performant de vider le CSV pour une seule table est - le fichier CSV.

SELECT customer_id, firstname, surname INTO OUTFILE '/exportdata/customers.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM customers;

Vous pouvez maintenant utiliser d'autres techniques pour répéter cette commande pour plusieurs tables. Voir plus de détails ici :

21voto

RolandoMySQLDBA Points 19439

mysqldump dispose d'options pour le formatage CSV :

--fields-terminated-by=name
                  Fields in the output file are terminated by the given
--lines-terminated-by=name
                  Lines in the output file are terminated by the given

En name doit contenir l'un des éléments suivants :

`--fields-terminated-by`

\t o "\""

`--fields-enclosed-by=name`
   Fields in the output file are enclosed by the given

et

--lines-terminated-by

  • \r
  • \n
  • \r\n

Naturellement, vous devez mysqldump chaque table individuellement.

Je vous suggère de rassembler tous les noms de tables dans un fichier texte. Ensuite, parcourez toutes les tables en utilisant mysqldump. Voici un script qui dumpera et gzipera 10 tables à la fois :

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQLSTMT="SELECT CONCAT(table_schema,'.',table_name)"
SQLSTMT="${SQLSTMT} FROM information_schema.tables WHERE table_schema NOT IN "
SQLSTMT="${SQLSTMT} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/DBTB.txt
COMMIT_COUNT=0
COMMIT_LIMIT=10
TARGET_FOLDER=/path/to/csv/files
for DBTB in `cat /tmp/DBTB.txt`
do
    DB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $2}'`
    DUMPFILE=${DB}-${TB}.csv.gz
    mysqldump ${MYSQL_CONN} -T ${TARGET_FOLDER} --fields-terminated-by="," --fields-enclosed-by="\"" --lines-terminated-by="\r\n" ${DB} ${TB} | gzip > ${DUMPFILE}
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

11voto

Kasper Souren Points 1029

Cela a bien fonctionné pour moi :

mysqldump <DBNAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/

Ou si vous voulez seulement vider une table spécifique :

mysqldump <DBNAME> <TABLENAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/

Je dépose à /var/lib/mysql-files/ pour éviter cette erreur :

mysqldump : A obtenu une erreur : 1290 : Le serveur MySQL fonctionne avec l'option --secure-file-priv et ne peut donc pas exécuter cette instruction lors de l'exécution de 'SELECT INTO OUTFILE'.

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