Amazon Redshift:在数据库之间复制数据

时间:2015-06-01 12:50:14

标签: postgresql amazon-web-services amazon-s3 amazon-redshift amazon-data-pipeline

我希望在Amazon Redshift上复制数据库中的数据。在此之前,我将数据从Redshift数据库复制到EC2实例上托管的PostgreSQL以进行分析。我有使用dblink EXTENSION的ruby脚本。

但是现在由于数据在PostgreSQL实例上无法管理,我们决定将数据复制到同一个Redshift集群上的单独数据库中。

凹凸!我发现dblink不适用于Postgre 8.0(Redshift版本)。有没有办法让我在Redshift上工作。

我不想使用“复制”命令并在中间添加一层S3,甚至是数据管道。你看,它是同一个集群,只是不同的数据库。

如果没有其他办法,我应该使用数据管道还是复制到S3然后再回到Redshift。或者它最终基本相同?

P.S。任何帮助/线索将不胜感激。我会努力工作。只需要抬头。

5 个答案:

答案 0 :(得分:4)

现在看来可能(自2016年6月3日起)

请参阅:https://blogs.aws.amazon.com/bigdata/post/Tx1GQ6WLEWVJ1OX/JOIN-Amazon-Redshift-AND-Amazon-RDS-PostgreSQL-WITH-dblink

在上面的文章中,他们给出了一个从redshift复制到另一个数据库的例子:

为了清晰起见,我将使用(postgres集群)和(redshift集群)进行注释

  

将数据从Amazon Redshift复制到RDS PostgreSQL

  

用于创建表的SQL:(postgres集群)

CREATE TABLE sales_summary (
   saletime timestamp,
   sellerid int,
   sales decimal
);

[...]

  

以下查询显示如何使用dblink函数将数据插入表中:

复制是从(红移群集)(postgres群集)

INSERT INTO sales_summary
SELECT *
FROM dblink('foreign_server',$REDSHIFT$
    SELECT date_trunc('hours', saletime) AS ts, sellerid, sum(pricepaid) sales
    FROM sales 
    WHERE saletime >= '2008-01-01'
    AND saletime < '2008-02-01'
    GROUP BY ts, sellerid 
    ORDER BY sales 
$REDSHIFT$) AS t1 (saletime timestamp, sellerid int, sales decimal);

编辑我在生产中使用它来加载每天有数百万行的表,而且我没有遇到与之相关的单一问题。因此我建议将其作为从Redshift加载到RDS-postgres的首选方法(与COPYing相反,或者更糟糕的是,使用ORM将数据加载到内存中)

答案 1 :(得分:1)

在查询中无法同时从两个不同的数据库访问表。

您应该使用unload命令从数据库卸载数据到s3,然后使用复制命令加载新的数据库表。

答案 2 :(得分:1)

您可以使用Python / psycopg2 / boto编写此管道的脚本。

  • Python连接到源PostgreSQL并打开数据管道 读。
  • 使用multipart压缩数据流并将其泵送到S3 上传。
  • 使用COPY命令
  • 将数据从S3加载到Redshift

我在PostgreSQL-to-Redshift-Data-Loader

中做到了这一点

答案 3 :(得分:0)

Here's the complete shell script - 将导出从MySQL更改为PostgreSQL

s3bucket=s3://yours3bucket/yourfolder
aws s3 ls $s3bucket/yourtable.txt.gz
aws s3 cp /tmp/yourtable.txt.gz $s3bucket/yourtable.txt.gz   
aws s3 ls $s3bucket/yourtable.txt.gz
if [ "$?" = "0" ];
 then
   echo "File sucessfully uploaded to S3 bucket."
 else
   echo "Upload to S3 bucket failed." 
fi

将文件从PostgreSQL导出到Amazon S3后,您可以这样做:

psql -U$postgres_user -h $postgres_host -p $postgres_port $redshift_database -c 
"copy yourdatabase.yourtable from '$s3bucket/yourtable.txt.gz' credentials 
'aws_access_key_id=ajgaslgkshtasj; aws_secret_access_key=shfs/34fiethajthaslthksthask'
delimiter '|' gzip removequotes ESCAPE ACCEPTINVCHARS ACCEPTANYDATE;"

答案 4 :(得分:0)

如果您在两个不同的群集中拥有表格,那么最好在中间使用S3。优点是,如果数据是大量复制,那么从S3到Redshift的数据将比从本地客户端复制到Redshift快得多。由于在aws服务之间使用并行处理,因此速度更快。

所以步骤是。

1)从SQL Workbench / j下载数据作为文件(txt) - &gt;数据库资源管理器 - &gt;表 - &gt;右键单击 - &gt;导出数据 - &gt;类型(文字)&amp;字段分隔符(,逗号)

2)将文件扩展名重命名为CSV,并将其上传到指定文件夹中的S3存储桶。

3)现在登录到您的数据库(通过SQL Workbench / j)并运行以下命令。

copy fact_transaction from ‘s3://bucket_name/folder_name’
CREDENTIALS ‘aws_access_key_id=XXXXXXX;aws_secret_access_key=YYYYYYYY’
delimiter ‘,’
csv
region ‘us-east-1’;