代码之家  ›  专栏  ›  技术社区  ›  JChao

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

  •  0
  • JChao  · 技术社区  · 6 年前

    假设我有一个看起来像

    some_schema
    
     |
      -- table1
      -- table2
      -- table3
    
    another_schema
     |
      -- table4
      -- table5
    

    我想抄t some_schema another_schema . 如果有太多的另一个方案(例如, another_schema2 , another_schema3 , another_schema4

    我知道我能行 UNLOAD some_schema.table1 然后 COPY some_schema.table1 一些方案 ?

    3 回复  |  直到 6 年前
        1
  •  1
  •   demircioglu    6 年前

    我相信unload a schema不可用,但是根据集群的大小和要复制到新集群的表的数量,您有两个选项。

    1. 创建要生成的脚本 UNLOAD LOAD 基于要复制的架构的命令

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

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

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

    更新: 下面是要生成的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

        2
  •  0
  •   Red Boy    6 年前

    有两个问题,

    1. 复制模式和表定义(意思是DDL)
    2. 复制数据

    这是我提出的解决方案,

    我认为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
  •  0
  •   Tony Gibbs    6 年前

    1. mdem7建议使用UNLOAD/COPY。 我不建议使用pg_dump来获取模式,因为它将丢失特定于Redshift的表设置,如DIST/SORT keys+column ENCODING。 Generate Table DDL

    2. 另一种方法是从快照恢复(手动或自动)。但是,当新集群上线时(当它还在恢复时),登录并删除(使用cascade)所有您不需要的模式。这将停止对已删除架构/表的还原。这种方法的唯一缺点是新集群的大小必须与原始集群的大小相同。可能重要,也可能不重要。如果集群在恢复后会相对长寿,那么您可以在恢复完成后向下调整它的大小。