我希望在Amazon Redshift上复制数据库中的数据。在此之前,我将数据从Redshift数据库复制到EC2实例上托管的PostgreSQL以进行分析。我有使用dblink EXTENSION的ruby脚本。
但是现在由于数据在PostgreSQL实例上无法管理,我们决定将数据复制到同一个Redshift集群上的单独数据库中。
凹凸!我发现dblink不适用于Postgre 8.0(Redshift版本)。有没有办法让我在Redshift上工作。
我不想使用“复制”命令并在中间添加一层S3,甚至是数据管道。你看,它是同一个集群,只是不同的数据库。
如果没有其他办法,我应该使用数据管道还是复制到S3然后再回到Redshift。或者它最终基本相同?
P.S。任何帮助/线索将不胜感激。我会努力工作。只需要抬头。
答案 0 :(得分:4)
现在看来可能(自2016年6月3日起)
在上面的文章中,他们给出了一个从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编写此管道的脚本。
答案 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’;