【问题标题】: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,我该怎么办?

【问题讨论】:

    标签: amazon-web-services amazon-redshift


    【解决方案1】:

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

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

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

    3. 如果要从副本中排除的表的数量不大,您可以使用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 提供的解决方案。我想提供一些不同的解决方案,我觉得可能对其他人有帮助。

    有两个问题,

    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
    

    复制数据

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

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      你真的只有两个选择——

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        相关资源
        最近更新 更多