web-dev-qa-db-fra.com

Exportation d'une table à partir d'Amazon RDS dans un fichier csv

J'ai une base de données mysql s'exécutant sur Amazon RDS et je souhaite savoir comment exporter un tableau complet au format CSV. J'utilise actuellement le serveur mysql sous Windows pour interroger la base de données Amazon, mais un message d'erreur s'affiche lorsque j'essaie d'exécuter une exportation, probablement parce qu'il n'y a pas de serveur de fichiers dédié pour Amazon RDS. Y a-t-il une solution à cela?

49
Kenny

Vraisemblablement, vous essayez d'exporter à partir d'une base de données Amazon RDS via une requête SELECT ... INTO OUTFILE, ce qui génère effectivement ce problème fréquemment rencontré, voir par exemple. exporter la base de données au format CSV . Les réponses de l'équipe AWS respectives confirment votre hypothèse d'absence d'accès au serveur empêchant ainsi une exportation, et suggèrent une autre approche via l'exportation de vos données au format CSV en sélectionnant les données dans le client en ligne de commande mysql. et canalisant la sortie pour reformater les données au format CSV, comme suit:

mysql -u username -p --database=dbname --Host=rdshostname --port=rdsport --batch 
  -e "select * from yourtable" 
  | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > yourlocalfilename

L'utilisateur fpalero fournit une alternative et une approche supposément plus simple, si vous connaissez et spécifiez les champs à l'avance:

mysql -uroot -ppassword --database=dbtest 
  -e "select concat(field1,',',field2,',',field3) FROM tabletest" > tabletest.csv

Bonne chance!

90
Steffen Opel

En supposant que MySQL soit utilisé dans RDS, une autre solution consiste à utiliser le mode de traitement par lots, qui permet de générer des valeurs séparées par des tabulations et d’échapper les nouvelles lignes, les tabulations et autres caractères spéciaux. Je n'ai pas encore trouvé d'outil d'importation CSV qui ne puisse pas gérer les données séparées par une tabulation. Donc par exemple:

$ mysql -h myhost.rds.amazonaws.com -u user -D my_database -p --batch --quick -e "SELECT * FROM my_table" > output.csv

Comme indiqué par Halfgaar ci-dessus, l'option --quick efface immédiatement les données, évitant ainsi les erreurs de mémoire insuffisante pour les tables volumineuses. Pour citer des chaînes (recommandé), vous devez effectuer un peu plus de travail dans votre requête:

SELECT id, CONCAT('"', REPLACE(text_column, '"', '""'), '"'), float_column
  FROM my_table

La REPLACE échappe aux caractères entre guillemets dans les valeurs text_column. Je suggérerais également d'utiliser des chaînes iso8601 pour les champs datetime, donc:

SELECT CONCAT('"', DATE_FORMAT(datetime_column, '%Y%m%dT%T'), '"') FROM my_table

Sachez que CONCAT renvoie NULL si vous avez une valeur de colonne NULL. 

Je l'ai fait sur des tables assez grandes avec des performances raisonnables. 600 millions de lignes et 23 Go de données ont pris environ 30 minutes lors de l'exécution de la commande mysql dans le même VPC que l'instance RDS. 

0
AndyB

Tout d'abord, la réponse de Steffen fonctionne dans la plupart des cas, je l'ai votée contre et je l'utilise moi-même depuis plusieurs années.

J'ai récemment rencontré des sorties plus grandes et plus complexes où "sed" n'était pas suffisant et j'ai décidé de créer un utilitaire simple pour faire exactement cela.

Je construis un module appelé sql2csv qui peut analyser la sortie de la CLI de MySQL:

$ mysql my_db -e "SELECT * FROM some_mysql_table" 

+----+----------+-------------+---------------------+
| id | some_int | some_str    | some_date           |
+----+----------+-------------+---------------------+
|  1 |       12 | hello world | 2018-12-01 12:23:12 |
|  2 |       15 | hello       | 2018-12-05 12:18:12 |
|  3 |       18 | world       | 2018-12-08 12:17:12 |
+----+----------+-------------+---------------------+

$ mysql my_db -e "SELECT * FROM some_mysql_table" | sql2csv

id,some_int,some_str,some_date
1,12,hello world,2018-12-01 12:23:12
2,15,hello,2018-12-05 12:18:12
3,18,world,2018-12-08 12:17:12

Vous pouvez également utiliser la CLI intégrée:

sql2csv -u root -p "secret" -d my_db --query "SELECT * FROM some_mysql_table;"

1,12,hello world,2018-12-01 12:23:12
2,15,hello,2018-12-05 12:18:12
3,18,world,2018-12-08 12:17:12

Plus d'infos https://github.com/gabfl/sql2csv

0
Gab

J'utilise Yii Framework sur EC2 pour me connecter à RDS mySQL. La clé est d'utiliser fputcsv (). Ce qui suit fonctionne parfaitement, à la fois sur mon hôte local et sur la production.

$file = 'path/to/filename.csv';
$export_csv = "SELECT * FROM table";

$qry = Yii::app()->db->createCommand($export_csv)->queryAll();

$fh = fopen($file, "w+");
foreach ($qry as $row) {
    fputcsv($fh, $row, ',' , '"');
}
fclose ($fh);
0
user2700214