Amazon Redshift-Backup&Restore最佳实践?

Gen*_*sis 7 amazon-s3 amazon-redshift

我们在Redshift中有一组表,其中包含IDENTITY属性的列,用于生成序列.在测试阶段,需要进行备份和恢复,这是每个测试周期的重复活动.我们按照以下流程进行备份然后恢复并面临以下问题:

  1. 传统方式:使用CREATE TABLE XYZ_BKP AS SELECT*FROM XYZ在另一个备份模式中创建备份表.但这样做我们失去了IDENTITY和表的其他属性.因此,在恢复期间,如果您尝试直接从备份创建表,则会丢失属性属性,并且您无法更改添加IDENTITY约束.
  2. 传统方式备份和不同的还原方法:这次我们首先使用DDL删除并重新创建表,然后尝试从备份执行INSERT INTO.但它无法将值插入IDENTITY列.
  3. 卸载和复制:我们还尝试使用UNLOAD等Redshift实用程序在S3中备份表,然后使用副本进行恢复.它工作正常,但后来我们面临其他问题 - a.具有前导零的DATE字段未在UNLOAD提取中正确提取.例如:日期'0001-01-01'被提取为'1-01-01'.然后它在COPY期间失败说不是有效日期.在恢复期间(COPY)还有其他几个错误,例如非空字段的缺失数据或int数据类型的无效值.这意味着UNLOAD和COPY命令一起不能同步和值更改.
  4. 从快照恢复表:我没有尝试过这个,但我知道AWS现在支持表恢复.但同样,为500张桌子单独设置这个是一项繁琐的工作.此外,您还可以长时间保留和跟踪快照.

如果您可以在我的方案或组织遵循的最佳实践中建议最佳的备份和还原方式,将会非常有用.

Red*_*Boy 4

我想在这里逐条回答,所以会有点长,请原谅;),但在我看来,我觉得最好的选择是Unload to S3Copy to table from S3。这里,S3 可以替换为EC2

  1. 传统方式- 如果我们需要进行一些数据替换并且我们希望空运行我们的查询,我们更喜欢这种方式。
  2. 传统方式备份和不同的恢复方法与#1 存在相同的问题,我们不使用。
  3. UNLOAD 和 COPY:这是最方便的方法,甚至 IDENTITIES 也可以保留,因此始终是首选方法。

列出了一些有问题的问题,但大多数问题都是错误的,或者可以通过提供正确的导出/导入参数来避免。我想提供所有必要的步骤和数据来证明我的观点,即加载和卸载过程中dates没有问题。timestamps

在这里我做了大部分数据类型来证明我的观点。

create table sales(
salesid integer not null Identity,
commission decimal(8,2),
saledate date,
description varchar(255),
created_at timestamp default sysdate,
updated_at timestamp);
Run Code Online (Sandbox Code Playgroud)

CSV 中的内容(sales-example.txt)

salesid,commission,saledate,description,created_at,updated_at
1|3.55|2018-12-10|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
2|6.55|2018-01-01|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
4|7.55|2018-02-10|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
5|3.55||Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
7|3.50|2018-10-10|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
Run Code Online (Sandbox Code Playgroud)

date复制将导入、timestamps以及 ID 的命令。

copy sales(salesid,commission,saledate,description,created_at,updated_at) from 's3://****/de***/sales-example.txt' credentials 'aws_access_key_id=************;aws_secret_access_key=***********' IGNOREHEADER  1 EXPLICIT_IDS;
Run Code Online (Sandbox Code Playgroud)

这将复制 5 条记录。我在这里这样做是parallel off为了获取单个数据CSV来证明这一点,尽管不是必需的并且应该避免。

unload ('select salesid,commission,saledate,description,created_at,updated_at from sales') to 's3://assortdw/development/sales-example-2.txt' credentials 'aws_access_key_id=***********;aws_secret_access_key=***********' parallel off;
Run Code Online (Sandbox Code Playgroud)

下面是我的内容,它与导入完全相同,这意味着如果将命令运行Copy到任何其他环境(例如devQA某处),我将获得与集群中完全相同的记录Redshift

5|3.55||Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
1|3.55|2018-12-10|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
7|3.50|2018-10-10|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
2|6.55|2018-01-01|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
4|7.55|2018-02-10|Test description|2018-05-17 23:54:51|2018-05-17 23:54:51
Run Code Online (Sandbox Code Playgroud)
  1. 从快照恢复表:这需要我们的“网络/基础设施组”,因此我们避免这样做,尽管对此不太确定。我们非常欢迎其他专家对此发表评论/分享详细信息。

我希望这能回答这个问题,并提供一个起点discuss/summarize/conclude。欢迎大家踊跃补充积分。