it-swarm.com.de

Tabelle aus Amazon RDS in eine CSV-Datei exportieren

Ich habe eine MySQL-Datenbank, die in Amazon RDS ausgeführt wird, und ich möchte wissen, wie eine ganze Tabelle in das CSV-Format exportiert wird. Ich verwende derzeit den Mysql-Server unter Windows, um die Amazon-Datenbank abzufragen, aber wenn ich versuche, einen Export auszuführen, erhalte ich eine Fehlermeldung, wahrscheinlich weil es keinen dedizierten Dateiserver für Amazon RDS gibt. Gibt es dafür eine Lösung?

49
Kenny

Vermutlich versuchen Sie, aus einer Amazon RDS - Datenbank über eine SELECT ... INTO OUTFILE-Abfrage zu exportieren, was zu diesem in der Regel häufig auftretenden Problem führt, siehe z. Datenbank nach CSV exportieren . Die entsprechende Antwort des AWS-Teams bestätigt Ihre Annahme, dass der Serverzugriff nicht möglich ist, was einen solchen Export verhindert, und schlägt einen alternativen Ansatz vor, indem Sie Ihre Daten im CSV-Format exportieren, indem Sie die Daten im mysql-Befehlszeilenclient und im Piping auswählen die Ausgabe, um die Daten als CSV neu zu formatieren:

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

Benutzer fpalero bietet einen alternativen und angeblich einfacheren Ansatz, wenn Sie die Felder vorab kennen und angeben:

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

Viel Glück!

90
Steffen Opel

Wenn Sie MySQL in RDS voraussetzen, ist es eine Alternative, den Batch-Modus zu verwenden, der durch TAB getrennte Werte ausgibt und Zeilenumbrüchen, Registerkarten und anderen Sonderzeichen entgeht. Ich habe noch kein CSV-Importtool gefunden, das mit TAB getrennte Daten nicht verarbeiten kann. Also zum Beispiel:

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

Wie bereits von Halfgaar erwähnt, wird die --quick-Option sofort gelöscht, um Speicherfehler für große Tabellen zu vermeiden. Um Strings (empfohlen) in Anführungszeichen zu setzen, müssen Sie einige zusätzliche Arbeit in Ihrer Abfrage ausführen:

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

Die Variable REPLACE entfernt alle Anführungszeichen in den text_column-Werten. Ich würde auch vorschlagen, iso8601-Strings für datetime-Felder zu verwenden, also:

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

Beachten Sie, dass CONCAT NULL zurückgibt, wenn Sie einen NULL-Spaltenwert haben. 

Ich habe dies auf einigen relativ großen Tischen mit angemessener Leistung ausgeführt. 600M-Zeilen und 23 GB-Daten benötigten ca. 30 Minuten, wenn der Befehl mysql in derselben VPC ausgeführt wurde wie die RDS-Instanz. 

0
AndyB

Zunächst funktioniert die Antwort von Steffen in den meisten Fällen, ich habe sie hochgestimmt und ich selbst benutze sie seit mehreren Jahren.

Ich traf kürzlich auf einige größere und komplexere Ausgaben, bei denen "sed" nicht genug war, und entschied mich für ein einfaches Dienstprogramm, das genau das tun sollte.

Ich baue ein Modul namens sql2csv, das die Ausgabe der MySQL-CLI analysieren kann:

$ 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

Sie können auch die integrierte CLI verwenden:

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

Weitere Informationen https://github.com/gabfl/sql2csv

0
Gab

Ich verwende das Yii Framework auf EC2, um eine Verbindung zu RDS mySQL herzustellen. Der Schlüssel ist die Verwendung von fputcsv (). Das Folgende funktioniert perfekt, sowohl auf meinem localhost als auch auf der Produktion.

$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