Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Amazon红移:在数据库之间复制数据_Postgresql_Amazon Web Services_Amazon S3_Amazon Redshift_Amazon Data Pipeline - Fatal编程技术网

Postgresql Amazon红移:在数据库之间复制数据

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,甚至不想添加数据管道。你看,它是同一个集群,只

我希望在Amazon Redshift上复制数据库中的数据。在此之前,出于分析目的,我将数据从红移数据库复制到托管在EC2实例上的PostgreSQL。我有一个ruby脚本,它可以使用dblink扩展来完成

但现在由于数据在PostgreSQL实例上不可管理,我们决定将数据复制到同一个红移集群上的单独数据库中

碰撞!我发现dblink不适用于Postgre8.0(红移版本)。有什么办法可以让红移工作吗

我不想使用Copy命令并在两者之间添加一层S3,甚至不想添加数据管道。你看,它是同一个集群,只是不同的数据库

若并没有其他方法,我应该使用数据管道还是复制到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加载到红移
我只是在

中将导出从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;"

如果你有两个不同的聚类表,那么最好在中间与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’;