web-dev-qa-db-fra.com

mysqldump au format CSV

J'ai besoin de dump all tables dans MySQL au format CSV.

Existe-t-il une commande utilisant mysqldump dans seulement sortie toutes les lignes pour chaque table au format CSV?

52
Ken

Premièrement, je peux vous donner la réponse pour UNE table:

Le problème avec toutes ces réponses INTO OUTFILE ou --tab=tmpfile (et -T/path/to/directory) est qu’il faut exécuter mysqldump sur le même serveur que le serveur MySQL et disposer de ces droits d’accès.

Ma solution consistait simplement à utiliser mysql (NOT mysqldump) avec le paramètre -B, insère l'instruction SELECT avec -e, puis modifie la sortie ASCII avec sed, et termine avec CSV, y compris une ligne de champ d'en-tête:

Exemple:

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

"id", "login", "mot de passe", "dossier", "email" "8", "mariana", "xxxxxxxxxx", "mariana", "" "3", "squaredesign", "xxxxxxxxxxxxxxxxxx", "squaredesign", "[email protected]" "4", "miedziak", "xxxxxxxxxx", "miedziak", "[email protected]" "5", "Sarko", "xxxxxxxxx", "Sarko", "" "6", "Logitrans Pologne", "xxxxxxxxxxxxxx", "LogitransPoland", "" "7", "Amos", "xxxxxxxxxxxxxxxxxxxxx", "Amos", "" "9", "Annabelle", "xxxxxxxxxxxxxxxx", "Annabelle", "" "11", "Brandfathers and Sons", "xxxxxxxxxxxxxxxxx", "BrandfathersAndSons", "" "12", "Imagine Groupe", "xxxxxxxxxxxxxxxxx", "ImagineGroup", "" "13", "EduSquare.pl", "xxxxxxxxxxxxxxxxxx", "EduSquare.pl", "" "101", "tmp", "xxxxxxxxxxxxxxxxxxxxxx", "_", "[email protected]"

Ajoutez un > outfile.csv à la fin de cette ligne pour obtenir votre fichier CSV pour cette table.

Ensuite, Obtenir une liste de TOUTES vos tables avec 

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

À partir de là, il ne reste plus qu'une étape pour faire une boucle, par exemple. dans le shell bash pour parcourir ces tables:

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

Entre do et ; done, insérez la commande longue que j'ai écrite dans la partie 1 ci-dessus, mais remplacez plutôt votre nom de table par $tb.

89
Marcos

Cette commande créera 2 fichiers dans/path/to/directory nom_table.sql et 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 des champs délimités par une virgule.

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

mysqldump a des 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

la name devrait contenir l’un des éléments suivants

`--fields-terminated-by`

\t ou "\""

`--fields-enclosed-by=name`

 Les champs du fichier de sortie sont entourés par les données

et 

--lines-terminated-by

  • \r
  • \n
  • \r\n

Naturellement, vous devriez mysqldump chaque table individuellement

Je vous suggère de rassembler tous les noms de table dans un fichier texte. Ensuite, parcourez toutes les tables exécutant mysqldump. Voici un script qui va vider et gzip 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

Essaie !!!

15
RolandoMySQLDBA

On dirait que d'autres ont eu ce problème également, il existe un simple script python maintenant, pour convertir la sortie de mysqldump en fichiers csv.

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
mysqldump -u username -p --Host=rdshostname database table | python mysqldump_to_csv.py > table.csv
7
Vajk Hermecz

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

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:

5
Anis

Vous pouvez également le faire en utilisant l’outil d’exportation de données dans dbForge Studio for MySQL .

Cela vous permettra de sélectionner tout ou partie des tables et de les exporter au format CSV.

1
Devart

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 uniquement vider TABLENAME:

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

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

mysqldump: Got error: 1290: Le serveur MySQL s'exécute avec l'option --secure-file-priv, il ne peut donc pas exécuter cette instruction lors de l'exécution de 'SELECT INTO OUTFILE'.

0
guaka

Vous pouvez utiliser la méthode easy more, outil csvdump pour imprimer un fichier csv distant depuis mysql: https://github.com/bobby96333/csvdump

0
user11297642

C’est beaucoup de déconner juste d’exporter en csv, pourquoi ne pas installer Dbeaver à partir de entrez la description du lien ici

Il couvre la plupart des bases de données populaires, à l'exception de nosql, et peut exporter dans différents formats, notamment csv et sql.

0
minimallinux