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

Amazon Redshift: Copying Data Between Databases

我想在 Amazon Redshift 上的数据库中复制数据。在此之前,我出于分析目的将数据从 Redshift 数据库复制到托管在 EC2 实例上的 PostgreSQL。我有 ruby 脚本可以使用 dblink EXTENSION 来完成。

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

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

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

如果没有其他办法,我应该使用数据管道还是复制到 S3,然后再返回到 Redshift。还是最终本质上是一样的?

P.S。任何 help/leads 将不胜感激。我会努力工作。只需要提个醒。

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

您应该使用卸载命令将数据库中的数据卸载到 s3,然后使用复制命令将其加载到新数据库 table。

这似乎是可行的(自 2016 年 6 月 3 日起)

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

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

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

Copying data from Amazon Redshift to RDS PostgreSQL

The SQL to create the table: (postgres cluster)

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

[...]

The following query shows how to insert data into the tables using the dblink function:

复制是从 (redshift 集群)(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 的首选方法(与复制相反,或者更糟的是,使用 ORM 将数据加载到内存中)

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

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

我在 PostgreSQL-to-Redshift-Data-Loader

中就是这么做的

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;"

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

所以步骤是。

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

2) 将文件扩展名重命名为CSV并上传到指定文件夹的S3 bucket。

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’;