Exporting table from Amazon RDS into a csv file

前端 未结 6 1359
后悔当初
后悔当初 2020-11-29 17:43

I have a mysql database running in Amazon RDS, and I want to know how to export an entire table to csv format. I currently use mysql server on Windows to query the Amazon da

相关标签:
6条回答
  • 2020-11-29 18:17

    I'm using Yii Framework on EC2 connecting to RDS mySQL. The key is to use fputcsv(). The following works perfectly, both on my localhost as well as 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 讨论(0)
  • 2020-11-29 18:22

    Assuming MySQL in RDS, an alternative is to use batch mode which outputs TAB-separated values and escapes newlines, tabs and other special characters. I haven't yet struck a CSV import tool that can't handle TAB-separated data. So for example:

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

    As noted by Halfgaar above, the --quick option flushes immediately so avoids out-of-memory errors for large tables. To quote strings (recommended), you'll need to do a bit of extra work in your query:

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

    The REPLACE escapes any double-quote characters in the text_column values. I would also suggest using iso8601 strings for datetime fields, so:

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

    Be aware that CONCAT returns NULL if you have a NULL column value.

    I've run this on some fairly large tables with reasonable performance. 600M rows and 23GB data took ~30 minutes when running the mysql command in the same VPC as the RDS instance.

    0 讨论(0)
  • 2020-11-29 18:22

    If you use the solution marked as correct, you'll notice that it generates a header that includes the 'concat' string literal. Obviously this is not what you want. Most likely you will want the corresponding headers of your data. This query will work without any modifications, other than substituting column names and table names:

    mysql -h xxx.xxx.us-east-2.rds.amazonaws.com 
    --database=mydb -u admin -p 
    -e "SELECT 'column1','column2' 
    UNION ALL SELECT column1,column2 
    FROM table_name WHERE condition = value" > dataset.csv
    

    I just opened the results in the Numbers osx app and the output looks perfect.

    0 讨论(0)
  • 2020-11-29 18:30

    There is new way from AWS how to do it. Just use their DMS(Database Migration Service).

    Here is documentation how to export table(s) to files on S3 storage: https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html

    You will have possibility to export in 2 formats: CSV or parquet.

    0 讨论(0)
  • 2020-11-29 18:38

    First of all, Steffen's answer works in most cases, I up-voted it and I have myself used it for several years.

    I recently encountered some larger and more complex outputs where "sed" was not enough and decided to come up with a simple utility to do exactly that.

    I build a module called sql2csv that can parse the output of the MySQL CLI:

    $ 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
    

    You can also use the built in 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
    

    More info https://github.com/gabfl/sql2csv

    0 讨论(0)
  • 2020-11-29 18:42

    Presumably you are trying to export from an Amazon RDS database via a SELECT ... INTO OUTFILE query, which yields this indeed commonly encountered issue, see e.g. export database to CSV. The respective AWS team response confirms your assumption of lacking server access preventing an export like so, and suggests an alternative approach as well via exporting your data in CSV format by selecting the data in the mysql command line client and piping the output to reformat the data as CSV, like so:

    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
    

    User fpalero provides an alternative and supposedly simpler approach, if you know and specify the fields upfront:

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

    Good luck!

    0 讨论(0)
提交回复
热议问题