45

在 DynamoDB 中将一个表相同地复制到一个新表的最佳方法是什么?

(我不担心原子性)。

4

8 回答 8

47

创建备份(备份选项)并使用新表名恢复表。这会将所有数据放入新表中。注意:根据表的大小需要相当长的时间

于 2018-08-23T17:22:02.610 回答
43

我只是使用了 python 脚本dynamodb-copy-table,确保我的凭据位于某些环境变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)中,并且它完美地工作。它甚至为我创建了目标表。

python dynamodb-copy-table.py src_table dst_table

默认区域是,使用env 变量us-west-2更改它。AWS_DEFAULT_REGION

于 2017-09-07T19:31:57.160 回答
19

AWS Pipeline 提供了一个可用于此目的的模板:“CrossRegion DynamoDB Copy”

请参阅:http ://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-crossregion-ddb-create.html

结果是一个简单的管道,如下所示:

在此处输入图像描述

尽管它称为 CrossRegion,但只要目标表名称不同,您就可以轻松地将其用于同一区域(请记住,每个帐户和区域的表名称都是唯一的)

于 2014-06-02T14:03:24.710 回答
7

您可以使用Scan读取数据并将其保存到新表中。

在 AWS 论坛上,来自 AWS 团队的一个人发布了另一种使用 EMR 的方法:如何复制表?

于 2012-09-03T13:09:23.177 回答
1

这是一种将所有项目从一个表复制到另一个表的解决方案,只需使用 shell 脚本、AWS CLIjq。适用于小桌子。

# exit on error
set -eo pipefail

# tables
TABLE_FROM=<table>
TABLE_TO=<table>

# read
aws dynamodb scan \
  --table-name "$TABLE_FROM" \
  --output json \
 | jq "{ \"$TABLE_TO\": [ .Items[] | { PutRequest: { Item: . } } ] }" \
 > "$TABLE_TO-payload.json"

# write
aws dynamodb batch-write-item --request-items file://"$TABLE_TO-payload.json"

# clean up
rm "$TABLE_TO-payload.json"

如果两个表相同,则需要先删除 TABLE_TO 中的所有项目。

于 2022-01-28T02:46:13.650 回答
0

2017 年 11 月 29 日,引入了全局表。根据您的用例,这可能很有用,这可能与原始问题不同。以下是博客文章中的一些片段:

全局表– 您现在可以创建跨两个或多个 AWS 区域自动复制的表,完全支持多主写入,只需单击几下。这使您能够为全球用户群构建快速、大规模扩展的应用程序,而无需管理复制过程。

...

您无需对现有代码进行任何更改。您只需将写入请求和最终一致的读取请求发送到任何指定区域中的 DynamoDB 终端节点(与强一致性读取关联的写入应该共享一个公共终端节点)。在幕后,DynamoDB 实现了多主写入,并确保对特定项目的最后一次写入占上风。当您使用全局表时,每个项目都将包含一个时间戳属性,该属性表示最近一次写入的时间。更新通过 DynamoDB Streams 异步传播到其他区域,通常在一秒钟内完成(您可以使用新的ReplicationLatencyPendingReplicationCount指标进行跟踪)。

于 2017-11-29T17:51:04.603 回答
0

正如之前的回复中提到的,Data Pipeline 模板不再存在。

在这个线程中尝试了其他几个提议后,我最终编写了一个 NodeJS 脚本来移动数据。也许这对你有用?如果你想尝试,我在我的博客上记录了我的方法。

于 2019-10-26T16:08:13.237 回答
0

使用这个节点 js 模块:copy-dynamodb-table

于 2020-02-29T21:25:51.290 回答