AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 55228
Accepted
MatBailie
MatBailie
Asked: 2013-12-19 01:00:34 +0800 CST2013-12-19 01:00:34 +0800 CST 2013-12-19 01:00:34 +0800 CST

是否可以克隆 RedShift 数据库?

  • 772

对于一些测试和开发工作,我们希望能够定期克隆现有的 RedShift 数据库(所有模式和所有数据)。类似于备份恢复的东西。

我能找到的最好的方法是从创建整个集群的快照开始,这在此时是不切实际的。

我们确实有用于创建数据库和架构的脚本,但我们没有用于从另一个 AWS RedShfit 数据库填充表的简单/整洁的机制。 (我们发现不能使用INSERT INTO db_new.schema.table SELECT * FROM db_old.schema.table,因为不支持跨数据库语法)

有没有人有什么建议?

backup restore
  • 3 3 个回答
  • 11720 Views

3 个回答

  • Voted
  1. Best Answer
    Joe Harris
    2014-06-10T06:22:38+08:002014-06-10T06:22:38+08:00

    您可以执行以下操作:

    • UNLOAD您的数据到 S3 ( http://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html )
    • 针对新数据库运行部署脚本
    • COPY将数据导入新数据库 ( http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html )

    对于开发大小的数据集,此(卸载/复制)将相当快。

    • 5
  2. mike_pdb
    2014-01-16T22:45:57+08:002014-01-16T22:45:57+08:00

    我只是花了很多时间做这件事。这是有问题的,因为 postgres 工具没有捕获 sort 和 dist 键信息。稍后我会将完整的脚本发布到我们的公共 github 存储库,但现在这里有一个脚本,它将所有表定义拉入创建表语句。它还没有解决列压缩类型或主键,但它至少允许我们在另一个数据库中重新创建表。填充它们是一个简单的脚本卸载和加载语句的问题。由于 Redshift sql 的许多限制,该脚本并不漂亮,我花了太多时间查看它,但它运行良好。

    select tm.schemaname||'.'||tm.tablename, 'create table '||tm.schemaname||'.'||tm.tablename
      ||' ('
      ||cp.coldef
      -- primary key
      -- dist key
      || nvl(d.distkey,'')
      --sort key 
      || nvl((select 
             ' sortkey(' ||substr(array_to_string(
                         array( select ','||cast(column_name as varchar(100))  as str from
                               (select column_name from information_schema.columns col where  col.table_schema= tm.schemaname and col.table_name=tm.tablename) c2
                                join 
                                (-- gives sort cols
                                  select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute pa where 
                                  pa.attnum > 0  AND NOT pa.attisdropped AND pa.attsortkeyord > 0
                                ) st on tm.tableid=st.tableid and c2.column_name=st.colname   order by sort_col_order
                              )
                        ,'')
                      ,2,10000) || ')'
       )
      ,'') ||';'
      from 
    -- t  master table list
    (
    SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
    FROM pg_namespace n, pg_class c
    WHERE n.oid = c.relnamespace 
      AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
    ) tm 
    -- cp  creates the col params for the create string
    join
    (select 
      substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)) as tableid
      ,substr(replace(replace(str,'ZZZ',''),'QQQ'||substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)),''),2,10000) as coldef
    from
    ( select array_to_string(array(
      SELECT  'QQQ'||cast(t.tableid as varchar(10))||'ZZZ'|| ','||column_name||' '|| decode(udt_name,'bpchar','char',udt_name) || decode(character_maximum_length,null,'', '('||cast(character_maximum_length as varchar(9))||')'   )
      -- default
      || decode(substr(column_default,2,8),'identity','',null,'',' default '||column_default||' ')
      -- nullable
      || decode(is_nullable,'YES',' NULL ','NO',' NOT NULL ') 
      -- identity 
      || decode(substr(column_default,2,8),'identity',' identity('||substr(column_default,(charindex('''',column_default)+1), (length(column_default)-charindex('''',reverse(column_default))-charindex('''',column_default)   ) )  ||') ', '') as str 
       from  
      -- ci  all the col info
      (
      select cast(t.tableid as int), cast(table_schema as varchar(100)), cast(table_name as varchar(100)), cast(column_name as varchar(100)), 
      cast(ordinal_position as int), cast(column_default as varchar(100)), cast(is_nullable as varchar(20)) , cast(udt_name as varchar(50))  ,cast(character_maximum_length as int),
       sort_col_order  , decode(d.colname,null,0,1) dist_key 
        from (select * from information_schema.columns c where  c.table_schema= t.schemaname and c.table_name=t.tablename) c
      left join 
      (-- gives sort cols
      select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute a where 
       a.attnum > 0  AND NOT a.attisdropped AND a.attsortkeyord > 0
      ) s on t.tableid=s.tableid and c.column_name=s.colname
      left join 
      -- gives dist col
      (select attrelid as tableid, attname as colname from pg_attribute a where
       a.attnum > 0 AND NOT a.attisdropped  AND a.attisdistkey = 't'
      ) d on t.tableid=d.tableid and c.column_name=d.colname
      order by ordinal_position
      ) ci 
      -- for the working array funct
      ), '') as str
     from 
     (-- need tableid
     SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
     FROM pg_namespace n, pg_class c
     WHERE n.oid = c.relnamespace 
       AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
     ) t 
    )) cp on tm.tableid=cp.tableid
    -- add in primary key query here
    -- dist key
    left join
    (  select 
      -- close off the col defs after the primary key 
      ')' ||
      ' distkey('|| cast(column_name as varchar(100)) ||')'  as distkey, t.tableid
      from information_schema.columns c
      join 
      (-- need tableid
      SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
      FROM pg_namespace n, pg_class c
      WHERE n.oid = c.relnamespace 
        AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
      ) t on c.table_schema= t.schemaname and c.table_name=t.tablename
      join 
      -- gives dist col
      (select attrelid as tableid, attname as colname from pg_attribute a where
       a.attnum > 0 AND NOT a.attisdropped  AND a.attisdistkey = 't'
      ) d on t.tableid=d.tableid and c.column_name=d.colname
    ) d on tm.tableid=d.tableid 
    
    • 4
  3. Merlin
    2021-05-28T22:01:16+08:002021-05-28T22:01:16+08:00

    我喜欢将数据库状态捕获为代码的想法,但我认为在备份快照的红移上下文中存在一种更简单的方法并从中恢复。

    这个用于将数据库复制到另一个 AWS 账户的 AWS 文档是一个指南,您可以在账户中执行相同的操作,或者在从快照进行紧急恢复时执行此操作。

    1. 通过控制台拍摄手动快照
    2. 从快照中恢复一个 redshift 集群。

    现在您的模式和数据已经存在,下一个任务是将这个数据库缩小为测试环境并调整集群的大小。还有 dns 端点和其他配置要清理,在文档中提到。

    瘦身步骤是感兴趣的部分,也许其他人会对此发表评论。

    • 0

相关问题

  • 如何使用旧的完整备份和当前日志文件恢复数据库

  • 更改了 max_allowed_pa​​cket 并仍然收到“数据包太大”错误

  • SQL Server Express 的任务计划程序

  • 我可以在使用数据库后激活 PITR 吗?

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve