Postgresql Amazon红移:在数据库之间复制数据
我希望在Amazon Redshift上复制数据库中的数据。在此之前,出于分析目的,我将数据从红移数据库复制到托管在EC2实例上的PostgreSQL。我有一个ruby脚本,它可以使用dblink扩展来完成 但现在由于数据在PostgreSQL实例上不可管理,我们决定将数据复制到同一个红移集群上的单独数据库中 碰撞!我发现dblink不适用于Postgre8.0(红移版本)。有什么办法可以让红移工作吗 我不想使用Copy命令并在两者之间添加一层S3,甚至不想添加数据管道。你看,它是同一个集群,只是不同的数据库 若并没有其他方法,我应该使用数据管道还是复制到S3,然后返回到红移。还是说最终本质上是一样的Postgresql Amazon红移:在数据库之间复制数据,postgresql,amazon-web-services,amazon-s3,amazon-redshift,amazon-data-pipeline,Postgresql,Amazon Web Services,Amazon S3,Amazon Redshift,Amazon Data Pipeline,我希望在Amazon Redshift上复制数据库中的数据。在此之前,出于分析目的,我将数据从红移数据库复制到托管在EC2实例上的PostgreSQL。我有一个ruby脚本,它可以使用dblink扩展来完成 但现在由于数据在PostgreSQL实例上不可管理,我们决定将数据复制到同一个红移集群上的单独数据库中 碰撞!我发现dblink不适用于Postgre8.0(红移版本)。有什么办法可以让红移工作吗 我不想使用Copy命令并在两者之间添加一层S3,甚至不想添加数据管道。你看,它是同一个集群,只
请注意,如有任何帮助/线索,将不胜感激。我会努力工作。只需要一个提示。在查询中无法同时从两个不同的数据库访问表 您应该使用unload命令将数据从数据库中卸载到s3,然后使用copy命令将其加载到新的数据库表中。现在看来这是可能的(自2016年6月3日起) 见: 在上面的文章中,他们给出了一个从redshift复制到其他数据库的示例: 为了清晰起见,我将使用(postgres集群)和(红移集群)进行注释 将数据从Amazon红移复制到RDS PostgreSQL 创建表的SQL语句:(postgres集群) [……] 以下查询显示了如何使用dblink函数将数据插入表中: 复制从(红移群集)到(postgres群集)
插入到销售摘要中
挑选*
从dblink('foreign_server'),$REDSHIFT$
选择日期(“小时”,销售时间)作为ts、sellerid、销售总额(已支付价格)
来自销售
其中saletime>='2008-01-01'
销售时间<'2008-02-01'
按ts分组,sellerid
销售订单
$REDSHIFT$)作为t1(saletime时间戳、sellerid int、销售小数);
编辑:我已经在生产中使用它来加载每天有数百万行的表,而且我还没有一个与之相关的问题。因此,我建议将其作为从Redshift加载到RDS postgres的首选方法(而不是复制,或者更糟糕的是,使用ORM将数据加载到内存中)您可以使用Python/psycopg2/boto编写此管道的脚本
- Python连接到源PostgreSQL,并为其打开数据管道 阅读李>
- 使用多部分压缩数据流并将其泵送至S3 上传李>
- 使用COPY命令将数据从S3加载到红移
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;"
如果你有两个不同的聚类表,那么最好在中间与S3一起。优势在于,如果数据量很大,那么将数据从S3复制到Redshift将比从本地客户端复制到Redshift快得多。由于在aws服务之间使用并行处理,因此速度更快 因此,步骤很简单 1) 从sqlworkbench/j->databaseexplorer->Table->右键单击->导出数据->键入(文本)和字段分隔符(,逗号)下载数据作为文件(txt) 2) 将文件扩展名重命名为CSV,并将其上载到指定文件夹上的S3 bucket 3) 现在登录到数据库(通过sqlworkbench/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’;
使用AWS数据管道如何?问题是关于从红移数据库复制到同一红移群集上的红移数据库,但这个答案涉及从postgres数据库复制到。@rado。是的,我没有仔细阅读。在这种情况下,似乎是首选方式(尽管OP希望有所不同)。
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;"
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’;