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?
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
.
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=','
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 !!!
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
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:
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.
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'.
Vous pouvez utiliser la méthode easy more, outil csvdump pour imprimer un fichier csv distant depuis mysql: https://github.com/bobby96333/csvdump
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.