Экспорт таблицы из Amazon RDS в CSV-файл - PullRequest
57 голосов
/ 02 марта 2012

У меня есть база данных mysql, работающая в Amazon RDS, и я хочу знать, как экспортировать всю таблицу в формат csv.В настоящее время я использую MySQL-сервер в Windows для запроса базы данных Amazon, но при попытке выполнить экспорт я получаю сообщение об ошибке, возможно, из-за отсутствия выделенного файлового сервера для Amazon RDS.Есть ли какое-то решение для этого?

Ответы [ 4 ]

95 голосов
/ 02 марта 2012

Предположительно, вы пытаетесь экспортировать из базы данных Amazon RDS с помощью запроса SELECT ... INTO OUTFILE, что приводит к этой действительно часто встречающейся проблеме, см., Например, экспорт базы данных в CSV . Соответствующий ответ команды AWS подтверждает ваше предположение о том, что отсутствует доступ к серверу, препятствующий экспорту, и предлагает альтернативный подход, например, путем экспорта ваших данных в формате CSV путем выбора данных в командной строке mysql. клиент и конвейер вывода, чтобы переформатировать данные как 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

Удачи!

0 голосов
/ 25 января 2019

Предполагая MySQL в RDS, альтернативой является использование пакетного режима, который выводит значения, разделенные 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

Имейте в виду, что CONCAT возвращает NULL, если у вас есть значение столбца NULL.

Я запускал это на некоторых довольно больших таблицах с разумной производительностью.600M строк и 23ГБ данных заняли ~ 30 минут при выполнении команды mysql в том же VPC, что и экземпляр RDS.

0 голосов
/ 18 ноября 2018

Прежде всего, ответ Штеффена работает в большинстве случаев, я проголосовал за него, и я сам использовал его в течение нескольких лет.

Недавно я столкнулся с некоторыми более крупными и более сложными выходами, где «sed» не былодостаточно и решил придумать простую утилиту, чтобы сделать именно это.

Я строю модуль с именем sql2csv, который может анализировать вывод CLI 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

Вы также можете использоватьвстроенный 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 голосов
/ 20 августа 2013

Я использую Yii Framework на EC2 для подключения к RDS mySQL. Ключ должен использовать 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);
...