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.
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
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/
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.
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
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
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.
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.
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
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
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