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 ?
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 ?
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.
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=','
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 :
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
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 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.