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

Posted

技术标签:

【中文标题】将多个表(或整个模式)从一个集群复制到另一个集群【英文标题】:Copying multiple tables (or entire schema) from one cluster to another 【发布时间】:2018-08-17 14:45:16 【问题描述】:

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

假设我有一个看起来像这样的架构

some_schema

 |
  -- table1
  -- table2
  -- table3

another_schema
 |
  -- table4
  -- table5

我想将 tsome_schema 复制到另一个集群,但不需要 another_schema。如果 another_schema 太多(例如,another_schema2another_schema3another_schema4 等,每个都有多个表),则创建快照没有意义

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

【问题讨论】:

【参考方案1】:

我认为卸载架构不可用,但根据集群的大小和要复制到新集群的表数量,您有几个选项。

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

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

    如果要从副本中排除的表的数量不大,您可以使用BACKUP NO 选项CTAS 它们,这样在创建快照时它们将不会被包括在内。

    李>

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

更新: 这是生成UNLOAD语句的SQL

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');

如果您想为表格添加额外的过滤器,请使用c.relname

【讨论】:

我知道如何迁移/同步单个表,但这意味着我可能需要某种 for 循环来获取我想要的所有表。它确实通过不复制给定模式中不必要的表来节省空间,但我觉得它有点难以维护。但如果这是唯一的方法,我想它就是这样 你不需要一个循环,更新答案轮胎一个SQL来创建UNLOAD语句,你可以类似地创建LOADs。如果您认为这回答了您的问题,请接受。谢谢 我建议添加一个子句以仅限制表,这样您就不会尝试卸载视图等:where n.nspname in ('schema1','schema2') AND relkind = 'r'【参考方案2】:

我同意@mdem7 提供的解决方案。我想提供一些不同的解决方案,我觉得可能对其他人有帮助。

有两个问题,

    复制架构和表定义(意思是 DDL) 复制数据

这是我提出的解决方案,

复制模式和表定义(意思是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

复制数据

正如其他答案中所建议的那样,unloadS3CopyS3 最适合。

希望对你有帮助。

【讨论】:

【参考方案3】:

你真的只有两个选择——

    mdem7 建议使用 UNLOAD/COPY。 我不建议使用 pg_dump 来获取架构,因为它会错过 Redshift 特定的表设置,如 DIST/SORT 键 + 列编码。 请查看此视图​​ - Generate Table DDL

    替代方法是您提到的从快照还原(手动或自动)。但是,当新集群上线(仍在恢复时)时,登录并删除(使用级联)所有您不想要的模式。这将停止对删除的模式/表的恢复。这种方法的唯一缺点是新集群需要与原始集群大小相同。这可能或可能不重要。如果集群在恢复后的寿命相对较长并且有意义,您可以在恢复完成后向下调整其大小。

【讨论】:

以上是关于将多个表(或整个模式)从一个集群复制到另一个集群的主要内容,如果未能解决你的问题,请参考以下文章

如何通过脚本将redshift集群快照从一个账户复制到另一个账户

如何复制MySQL数据库或表到另外一台服务器

当表在集群中的多个节点之间复制时,COPY 如何在 cassandra 中工作?

Redis(主从复制哨兵模式集群)概述及部署

在 Cassandra 中将数据从一个集群传输到另一个集群

如何将一个数据库中的一个表复制到另一个数据库中去