将多个表(或整个模式)从一个集群复制到另一个集群
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_schema2
、another_schema3
、another_schema4
等,每个都有多个表),则创建快照没有意义
我知道我可以先做UNLOAD some_schema.table1
,然后再做COPY some_schema.table1
,但如果我只想复制整个some_schema
,我该怎么办?
【问题讨论】:
【参考方案1】:我认为卸载架构不可用,但根据集群的大小和要复制到新集群的表数量,您有几个选项。
创建脚本以根据您要复制的架构生成 UNLOAD
和 LOAD
命令
创建快照,有选择地还原表。 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
语句,你可以类似地创建LOAD
s。如果您认为这回答了您的问题,请接受。谢谢
我建议添加一个子句以仅限制表,这样您就不会尝试卸载视图等: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
复制数据
正如其他答案中所建议的那样,unload
到 S3
和 Copy
从 S3
最适合。
希望对你有帮助。
【讨论】:
【参考方案3】:你真的只有两个选择——
mdem7 建议使用 UNLOAD/COPY。 我不建议使用 pg_dump 来获取架构,因为它会错过 Redshift 特定的表设置,如 DIST/SORT 键 + 列编码。 请查看此视图 - Generate Table DDL
替代方法是您提到的从快照还原(手动或自动)。但是,当新集群上线(仍在恢复时)时,登录并删除(使用级联)所有您不想要的模式。这将停止对删除的模式/表的恢复。这种方法的唯一缺点是新集群需要与原始集群大小相同。这可能或可能不重要。如果集群在恢复后的寿命相对较长并且有意义,您可以在恢复完成后向下调整其大小。
【讨论】:
以上是关于将多个表(或整个模式)从一个集群复制到另一个集群的主要内容,如果未能解决你的问题,请参考以下文章
如何通过脚本将redshift集群快照从一个账户复制到另一个账户