将多个表(或整个架构)从一个集群复制到另一个

时间:2018-08-17 14:45:17

标签: amazon-web-services amazon-redshift

我了解到,AWS不支持将给定表从一个群集直接复制到另一个群集。我们需要从一个卸载,然后再复制到另一个。但这适用于表。它也适用于架构吗?

说我有一个看起来像

的架构
some_schema

 |
  -- table1
  -- table2
  -- table3

another_schema
 |
  -- table4
  -- table5

,我想将t some_schema复制到另一个群集,但是不需要another_schema。如果another_schema过多(例如another_schema2another_schema3another_schema4等,每个都有多个表),则制作快照没有任何意义

我知道我可以先做UNLOAD some_schema.table1然后再做COPY some_schema.table1,但是如果我只想复制整个some_schema怎么办?

3 个答案:

答案 0 :(得分:1)

我认为无法卸载架构,但是根据集群的大小和要复制到新集群的表的数量,您有几个选择。

  1. 创建脚本以根据您要复制的架构生成UNLOADLOAD命令

  2. 创建快照,有选择地还原表。 https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-snapshots.html

  3. 如果要从副本中排除的表的数量不多,则可以使用CTAS选项BACKUP NO将它们UNLOAD,因此在创建快照时将不包括这些表。

对我来说,选项1看起来最简单,如果您需要任何帮助,请告诉我。

更新: 这是生成select 'unload (''select * from '||n.nspname||'.'||c.relname||''') to ''s3_location'' access_key_id ''accesskey'' secret_access_key ''secret_key'' delimiter ''your_delimiter'' PARALLEL ON GZIP ;' as sql from pg_class c left join pg_namespace n on c.relnamespace=n.oid where n.nspname in ('schema1','schema2'); 语句的SQL

c.relname

如果您想为表格添加其他过滤器,请使用var load = function(){ // your jQuery code goes here $('#hello').html('jQuery Loaded'); }; (function(window, loadCallback){ if(!window.jQuery){ var script = document.createElement("script"); script.type = "text/javascript"; script.src = "https://code.jquery.com/jquery-3.3.1.min.js"; script.onload = loadCallback; document.head.appendChild(script); }else{ loadCallback(); } })(window, load);

答案 1 :(得分:0)

我同意@ mdem7提供的解决方案。我想提供一些我认为可能对其他人有所帮助的解决方案。

有两个问题,

  1. 复制架构和表定义(意味着DDL)
  2. 复制数据

这是我建议的解决方案,

  

复制架构和表定义(意味着DDL)

我认为pg_dump命令最适合这里,它将在SQL文件中导出完整的架构定义,可以直接将其导入到另一个集群中。

pg_dump --schema-only -h your-host -U redshift-user -d redshift-database -p port > your-schema-file.sql

然后将其导入其他集群。

psql -h your-other-cluster-host -U other-cluster-username -d your-other-cluster-database-name -a -f your-schema-file.sql
  

复制数据

如其他答案中所建议的,unload中的S3Copy中的S3最合适。

希望有帮助。

答案 2 :(得分:0)

您实际上只有两个选择-

  1. mdem7建议使用UNLOAD / COPY。 我不建议使用pg_dump来获取模式,因为它将错过Redshift特定的表设置,例如DIST / SORT键+列编码。 而是查看此视图​​-Generate Table DDL

  2. 替代方法是您提到的从快照还原(手动或自动)。但是,在新群集联机(仍在还原时)之后,登录并删除(使用级联)所有您不需要的架构。这将停止对已删除的架构/表的还原。这种方法的唯一缺点是新群集的大小必须与原始群集相同。可能无关紧要。如果群集一旦还原就可以使用较长的时间,并且有意义的话,您可以在还原完成后向下调整其大小。