【问题标题】:Exporting a table from Amazon RDS into a CSV file将表从 Amazon RDS 导出到 CSV 文件
【发布时间】:2012-03-21 03:05:50
【问题描述】:

我有一个在Amazon RDS 中运行的 MySQL 数据库,我想知道如何将整个表导出为 CSV 格式。

我目前在 Windows 上使用 MySQL 服务器来查询 Amazon 数据库,但是当我尝试运行导出时出现错误,可能是因为没有用于 amazon RDS 的专用文件服务器。有解决办法吗?

【问题讨论】:

  • mysql--batch 标志输出制表符分隔的字段,内容转义。这是一种常见格式,不需要转换为 .csv,当使用 sed 完成转换时,可能会在极端情况下导致数据损坏。

标签: mysql amazon-web-services amazon-rds


【解决方案1】:

如果您使用Steffen Opel's solution,您会注意到它会生成一个包含“concat”字符串文字的标头。显然这不是你想要的。您很可能需要数据的相应标题。

除了替换列名和表名之外,此查询无需任何修改即可工作:

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

我刚刚在 Numbers OS X 应用中打开了结果,结果看起来很完美。

【讨论】:

    【解决方案2】:

    AWS 提供了一种新的方法来做到这一点。只需使用他们的 DMS(数据库迁移服务)。

    以下是有关如何将表导出到 S3 存储上的文件的文档:Using Amazon S3 as a target for AWS Database Migration Service - AWS Database Migration Service

    您可以导出两种格式:CSVParquet

    【讨论】:

      【解决方案3】:

      假设 MySQL 在 RDS 中,另一种选择是使用批处理模式,它输出 TAB 分隔的值并转义换行符、制表符和其他特殊字符。我还没有找到无法处理 TAB 分隔数据的 CSV 导入工具。比如:

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

      noted by 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 命令时,6 亿行和 23 GB 数据大约需要 30 分钟。

      【讨论】:

        【解决方案4】:

        首先,Steffen's answer 在大多数情况下都有效。

        我最近遇到了一些更大、更复杂的输出,其中“sed”还不够,我决定想出一个简单的实用程序来做到这一点。

        我构建了一个名为 sql2csv 的模块,它可以解析 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
        

        您也可以使用内置的 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
        

        更多信息请访问 sql2csv (GitHub)。

        【讨论】:

          【解决方案5】:

          我在 EC2 上使用Yii 框架连接到 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);
          

          【讨论】:

          • 使用 PHP 并引导整个 Yii 应用程序只是为了使用它的 db 连接器并运行 SELECT * FROM table... 不太好。
          【解决方案6】:

          大概,您正在尝试通过SELECT ... INTO OUTFILE 查询从Amazon RDS 数据库导出,这会产生这个确实常见的问题,请参见例如export database to CSV。各自的AWS team response 确认您假设缺少服务器访问权限以防止像这样的导出,并通过在 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 provides an alternative 和据说更简单的方法:

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

          【讨论】:

          • 收到错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
          • 这里的问题是如果你有大量的数据要转储,你会得到一个内存不足的错误。
          • 实际上,我刚刚注意到mysql 也有一个--quick 选项,使其立即刷新到磁盘。
          • gsed 's/"/""/g;s/^/"/;s/$/"/;s/\t/","/g',关于csv规范,哪个更正式?
          • 您可能希望将“--skip-column-names”添加到您的参数中。谢谢!
          猜你喜欢
          • 2020-04-23
          • 2016-01-05
          • 2017-11-14
          • 1970-01-01
          • 2016-07-29
          • 2012-12-22
          • 1970-01-01
          相关资源
          最近更新 更多