web-dev-qa-db-fra.com

Sauvegarde une base de données mysql vers une sauvegarde en texte brut (CSV) à partir de la ligne de commande

J'aimerais éviter mysqldump car cela affiche un format qui n'est lisible que par 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. En outre, je voudrais quelque chose que je peux exécuter à partir de la ligne de commande (linux). Si c'est un script mysql, il serait utile de savoir comment faire une telle chose.

88
dreeves

Si vous pouvez gérer table à la fois et que vos données ne sont pas binaires, utilisez le -B option sur la commande mysql. Avec cette option, les fichiers TSV (séparés par des tabulations) peuvent être importés assez facilement:

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

Sinon, si vous avez un accès direct au système de fichiers du serveur, utilisez SELECT INTO OUTFILE pouvant générer de vrais fichiers CSV:

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

Dans MySQL, vous pouvez spécifier une sortie CSV comme suit:

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

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

31
Paul Tomblin

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

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 à l'utilisateur mysql et à l'utilisateur exécutant la commande. Par conséquent, pour des raisons de simplicité, je recommande chmod 777 /tmp/path_to_dump/ première.

21
chmac

L'option select into outfile ne fonctionnerait pas pour moi, mais le moyen de contournement ci-dessous de fichier de tuyauterie délimité par des tabulations via SED:

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

Voici la commande la plus simple pour cela

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

S'il y a une virgule dans la valeur de la colonne, nous pouvons générer .tsv au lieu de .csv avec la commande suivante

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv
8
minhas23

Si vous avez réellement besoin d'une "sauvegarde", vous avez également besoin d'un schéma de base de données, tel que les définitions de table, les définitions d'affichage, les procédures de stockage, etc. Une sauvegarde d'une base de données ne se limite pas aux données.

La valeur du format mysqldump pour la sauvegarde est précisément qu'il est très facile de l'utiliser pour restaurer des bases de données mysql. Une sauvegarde qui n'est pas facilement restaurée est beaucoup moins utile. Si vous cherchez une méthode de sauvegarde fiable des données mysql afin de pouvoir restaurer sur un serveur mysql, alors je pense que vous devriez vous en tenir à l'outil mysqldump.

Mysql est gratuit et fonctionne sur de nombreuses plates-formes différentes. Configurer un nouveau serveur mysql que je peux restaurer est simple. Je ne suis pas du tout inquiet de ne pas pouvoir installer mysql pour pouvoir effectuer une restauration.

Je serais beaucoup plus préoccupé par une sauvegarde/restauration personnalisée basée sur un format fragile tel que csv/tsv qui échoue. Êtes-vous sûr que tous vos guillemets, virgules ou onglets qui se trouvent dans vos données seraient correctement échappés puis analysés correctement par votre outil de restauration?

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

3
Zoredache

Vous pouvez utiliser le script ci-dessous pour obtenir la sortie dans des fichiers csv. Un fichier par table avec en-têtes.

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

utilisateur est votre nom d'utilisateur, mot de passe est le mot de passe si vous ne voulez pas continuer à taper le mot de passe pour chaque table et mydb est le nom de la base de données.

Explication du script: La première expression de sed remplacera les onglets par "," afin que les champs soient placés entre guillemets et séparés par des virgules. Le second insère une citation double au début et le troisième insère une citation double à la fin. Et le dernier prend soin de la\n.

3
Kiran Pathuru

Découvrez mk-parallel-dump qui fait partie de la toujours utile suite d'outils maatkit . Cela peut vider des fichiers séparés par des virgules avec l'option --csv.

Cela peut faire toute votre base de données sans spécifier de tables individuelles, et vous pouvez spécifier des groupes de tables dans une table de sauvegarde.

Notez qu'il draine également les définitions de table, les vues et les déclencheurs dans des fichiers séparés. En plus de fournir une sauvegarde complète sous une forme plus universellement accessible, il peut également être immédiatement restauré avec mk-parallel-restore

2
Paul Dixon

Si vous voulez vider toute la base de données en tant que csv

#!/bin/bash

Host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${Host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${Host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


rm -rf tables_new.txt tables.txt
1
veera

Réponse PowerShell à deux lignes:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

Boom-bata-boom

-D = le nom de votre base de données

-e _ requête

-B = délimité par des tabulations

1
Kolob Canyon