我们对Amazon RedShift中的大型数据集进行了一些聚合,我们在MySQL中有一些相对少量的数据。对于RedShift中的一些连接,我们需要MySQL中的数据。将MySql数据同步到RedShift的最佳方法是什么?像oracle中的远程视图那样在redshift中有这样的东西吗?或者我应该以编程方式查询MySql并在RedShift中插入/更新?
答案 0 :(得分:7)
Redshift现在通过SSH支持loading data from remote hosts。这项技术涉及:
清单指定的命令运行一个任意命令,该命令通过Redshift COPY命令在format suitable for ingest中打印文本输出。
答案 1 :(得分:3)
当Redshift中的连接需要MySQL数据时,我们通常只是将它从一个发送到另一个。
暗示:
步骤2到4可以编写脚本,并允许您在必要或定期将新数据发送到Redshift。
答案 2 :(得分:0)
Oracle中的“远程视图”是什么?
无论如何,如果您可以从表格中提取数据到CSV文件,那么您还有一个脚本选项。您可以使用Python / boto / psycopg2组合将CSV加载脚本编写为Amazon Redshift。
在我的MySQL_To_Redshift_Loader中,我执行以下操作:
将MySQL中的数据提取到临时文件中。
loadConf=[ db_client_dbshell ,'-u', opt.mysql_user,'-p%s' % opt.mysql_pwd,'-D',opt.mysql_db_name, '-h', opt.mysql_db_server]
...
q="""
%s %s
INTO OUTFILE '%s'
FIELDS TERMINATED BY '%s'
ENCLOSED BY '%s'
LINES TERMINATED BY '\r\n';
""" % (in_qry, limit, out_file, opt.mysql_col_delim,opt.mysql_quote)
p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env)
p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE)
...
使用boto Python模块和分段上传,将数据压缩并加载到S3。
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket(bucket_name)
k = Key(bucket)
k.key = s3_key_name
k.set_contents_from_file(file_handle, cb=progress, num_cb=20,
reduced_redundancy=use_rr )
使用psycopg2 COPY命令将数据附加到Redshift表。
sql="""
copy %s from '%s'
CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s'
DELIMITER '%s'
FORMAT CSV %s
%s
%s
%s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
答案 3 :(得分:-3)
选中此simplest way以将Mysql数据加载到红移。当您期望将初始数据快照加载到红移时,请尝试使用该免费解决方案。此外,您将获得模式迁移,并排查询控制台以及整个加载过程的一些统计报告(带图表)。