web-dev-qa-db-ja.com

Amazon RDSからcsvファイルにテーブルをエクスポートする

Amazon RDSで実行されているmysqlデータベースがあり、テーブル全体をcsv形式にエクスポートする方法を知りたいです。現在、Windowsでmysqlサーバーを使用してAmazonデータベースを照会していますが、エクスポートを実行しようとすると、おそらくAmazon RDS専用のファイルサーバーがないため、エラーが発生します。これに対する解決策はありますか?

58
Kenny

おそらく、あなたは Amazon RDS データベースからSELECT ... INTO OUTFILEクエリを介してエクスポートしようとしています。 データベースをCSVにエクスポート 。それぞれの AWSチームの応答 は、そのようなエクスポートを妨げるサーバーアクセスがないという仮定を確認し、データのエクスポートによる代替アプローチも提案しますmysqlコマンドラインクライアントでデータを選択し、出力をパイピングしてCSVとしてデータを再フォーマットすることによるCSV形式

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

ユーザーfpalero は、フィールドを事前に知って指定している場合は、代替手段 およびおそらくより単純なアプローチを提供します。

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

がんばろう!

99
Steffen Opel

RDSでMySQLを使用する場合、代替方法は、TABモードで区切られた値を出力し、改行、タブ、その他の特殊文字をエスケープするバッチモードを使用することです。 TABで区切られたデータを処理できないCSVインポートツールをまだ使用していません。たとえば、次のとおりです。

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

上記のHalfgaarで述べたように、--quickオプションはすぐにフラッシュするため、大きなテーブルのメモリ不足エラーを回避できます。文字列を引用するには(推奨)、クエリで少し余分な作業を行う必要があります。

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

REPLACEは、text_column値の二重引用符をエスケープします。日時フィールドにiso8601文字列を使用することもお勧めします。

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

NULL列値がある場合、CONCATはNULLを返すことに注意してください。

かなり大きなテーブルで妥当なパフォーマンスでこれを実行しました。 RDSインスタンスと同じVPCでmysqlコマンドを実行すると、600M行と23GBデータが約30分かかりました。

0
AndyB

まず第一に、Steffenの答えはほとんどの場合うまくいきます。

最近、「sed」では不十分な、より大きく複雑な出力に遭遇したため、まさにそれを行うためのシンプルなユーティリティを考案することにしました。

MySQL CLIの出力を解析できるsql2csvというモジュールを作成します。

$ 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

組み込みのCLIを使用することもできます。

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

詳細 https://github.com/gabfl/sql2csv

0
Gab

私はYii RDS mySQLに接続するEC2のフレームワークを使用しています。キーはfputcsv()を使用することです。以下は私のローカルホストと本番の両方で完全に機能します。

$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