我在MySQL RDS中有一个很大的表(大约500M行),我需要将其中的特定列导出到CSV,以便能够导入到questDb.

通常我会使用into outfile,但RDS不支持这一点,因为无法访问文件系统.

我try 使用工作台进行导出,但由于表的大小,我一直遇到内存不足的问题.

推荐答案

最终在这个帮助下算出了:Exporting a table from Amazon RDS into a CSV file

只要您有某种类型的顺序列,例如自动递增的整数主键或日期列,这种解决方案就可以很好地工作.如果您有大量数据,请确保您的日期列已被索引!

#!bin/bash

# Maximum number of rows to export/total rows in table, set a bit higher if live data being written
MAX=500000000
# Size of each export batch
STEP=1000000

mkdir -p parts

for (( c=0; c<= $MAX; c = c + $STEP ))
do
   mysql --port 3306 --protocol=TCP -h <rdshostname> -u <username> -p<password> --quick --database=<db> -e "select column1, column2, column3 <table> order by <timestamp> ASC limit $STEP offset $c" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > export$c.csv

   # split down in to chunks under questdbs 65k line limit
   split -d -l 64999 --additional-suffix=.csv $FILE_NAME.csv ./parts/$FILE_NAME

done

# print out import statements to a file
for i in $(ls -v ./parts); do echo "COPY reading from '$i';" >> import.sql; done;

一种稍微不同的方法可能会更快,这取决于您已建立的索引,即逐月逐个查看数据:

#!bin/bash
START_YEAR=2020
END_YEAR=2022

mkdir -p parts

for (( YEAR=$START_YEAR; YEAR<=$END_YEAR; YEAR++ ))
do
   for (( MONTH=1; MONTH<=12; MONTH++ ))
   do

      NEXT_MONTH=1
      let NEXT_YEAR=$YEAR+1
      if [ $MONTH -lt 12 ]
      then
         let NEXT_MONTH=$MONTH+1
         NEXT_YEAR=$YEAR
      fi

      FILE_NAME="export-$YEAR-$MONTH-to-$NEXT_YEAR-$NEXT_MONTH"

      mysql --port 3306 --protocol=TCP -h <rdshost> -u app -p<password> --quick --database=<database> -e "select <column1>, <column2>, round(UNIX_TIMESTAMP(<dateColumn>)) * 1000000 as date from <table> where <table>.<dateColumn> >= '$YEAR-$MONTH-01 00:00:00' and table.<dateColumn> < '$NEXT_YEAR-$NEXT_MONTH-01 00:00:00' order by <table>.<dateColumn> ASC" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $FILE_NAME.csv

      # split down in to chunks under questdbs 65k line limit
      split -d -l 64999 --additional-suffix=.csv $FILE_NAME.csv ./parts/$FILE_NAME
   done
done

# print out import statements to a file
for i in $(ls -v ./parts); do echo "COPY reading from '$i';" >> import.sql; done;

上述脚本将输出一个import.sql,其中包含导入数据所需的所有SQL语句.请参阅:https://questdb.io/docs/guides/importing-data/

Mysql相关问答推荐

查找关联数据库表的超集

为什么MySQL不考虑在联接中使用(JSON)函数索引,而考虑在生成的列上使用索引?

如何在WooCommerce中更新pm_Virtual.meta_Value=#39;否

奇怪的MySQL SELECT循环;但不是\G

使用Check查看过go 两个月是否完成了IRM Meetup

如何用sql找出两次之间的差异

为大表优化 Django 模型

看不懂mysql自左连接查询

条件触发mysql

如果其中一个表为空,则 mysql 中的查询会给出 0 个结果

根据 Power Query 中的条件替换值

我在 mysql 查询中需要帮助,我想在年龄之间按年龄过滤器分组,并显示 0 计数之间找不到的数据

如何解决这个特定的 SQL 查询?我的解决方案还返回不想要的值

从 SQL 中的左连接和内连接中减go 计数

MySQL 5.6 DATETIME 不接受毫秒/微秒

用序列号mysql更新列

如何在mysql select查询中获取两个日期之间的日期列表

授予用户对 MySQL 中有限数量表的访问权限

MySQL:按字段排序,将空单元格放在末尾

仅在 MYSQL DATEDIFF 中显示小时数