AWS DynamoDB 命令
DynamoDB 命令实战:建表与键设计、增删改查、索引与事务、流/TTL 与备份恢复。
学习目标
本文是「云计算」模块的第 48 篇,难度定位为入门。重点内容:DynamoDB 命令实战:建表与键设计、增删改查、索引与事务、流/TTL 与备份恢复。
主要章节:
- 表创建与管理
- 数据写入
- 数据查询
- 扫描与过滤
- 索引管理
- 事务操作
- ……共 9 个章节
表创建与管理
基本写法:创建表
aws dynamodb create-table --table-name <表名> --attribute-definitions <属性> --key-schema <键> --billing-mode <计费>
# 创建按用户 ID 分区的表
aws dynamodb create-table \
--table-name Users \
--attribute-definitions AttributeName=UserId,AttributeType=S \
--key-schema AttributeName=UserId,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
基本写法:创建带排序键的表
aws dynamodb create-table --table-name <表名> --attribute-definitions <属性> --key-schema <键>
# 创建复合主键表(分区键 + 排序键)
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions AttributeName=UserId,AttributeType=S AttributeName=OrderId,AttributeType=S \
--key-schema AttributeName=UserId,KeyType=HASH AttributeName=OrderId,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST
基本写法:列出所有表
aws dynamodb list-tables
# 查看当前账户所有表
aws dynamodb list-tables
基本写法:查看表描述
aws dynamodb describe-table --table-name <表名>
# 查看表结构详情
aws dynamodb describe-table --table-name Users
基本写法:删除表
aws dynamodb delete-table --table-name <表名>
# 删除指定表及其所有数据
aws dynamodb delete-table --table-name Users
基本写法:更新表配置
aws dynamodb update-table --table-name <表名> --billing-mode PROVISIONED --provisioned-throughput <吞吐量>
# 切换为预置计费模式
aws dynamodb update-table \
--table-name Users \
--billing-mode PROVISIONED \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
数据写入
基本写法:写入单条数据
aws dynamodb put-item --table-name <表名> --item <项>
# 写入一条用户记录
aws dynamodb put-item \
--table-name Users \
--item '{"UserId":{"S":"u001"},"Name":{"S":"Alice"},"Age":{"N":"30"}}'
基本写法:条件写入
aws dynamodb put-item --table-name <表名> --item <项> --condition-expression <条件>
# 仅在用户不存在时写入
aws dynamodb put-item \
--table-name Users \
--item '{"UserId":{"S":"u001"},"Name":{"S":"Alice"}}' \
--condition-expression 'attribute_not_exists(UserId)'
基本写法:批量写入
aws dynamodb batch-write-item --request-items <请求>
# 一次写入多条记录到多张表
aws dynamodb batch-write-item \
--request-items '{
"Users": [{"PutRequest":{"Item":{"UserId":{"S":"u002"},"Name":{"S":"Bob"}}}}],
"Orders": [{"PutRequest":{"Item":{"UserId":{"S":"u002"},"OrderId":{"S":"o001"}}}}]
}'
基本写法:更新条目
aws dynamodb update-item --table-name <表名> --key <键> --update-expression <表达式> --expression-attribute-values <值>
# 更新用户姓名和年龄
aws dynamodb update-item \
--table-name Users \
--key '{"UserId":{"S":"u001"}}' \
--update-expression 'SET #n = :name, Age = :age' \
--expression-attribute-names '{"#n":"Name"}' \
--expression-attribute-values '{":name":{"S":"Alice Smith"},":age":{"N":"31"}}'
基本写法:原子计数器更新
aws dynamodb update-item --table-name <表名> --key <键> --update-expression <表达式>
# 原子自增计数
aws dynamodb update-item \
--table-name Counters \
--key '{"CounterId":{"S":"views"}}' \
--update-expression 'SET Value = Value + :inc' \
--expression-attribute-values '{":inc":{"N":"1"}}'
数据查询
基本写法:按主键读取
aws dynamodb get-item --table-name <表名> --key <键>
# 根据用户 ID 获取单条记录
aws dynamodb get-item \
--table-name Users \
--key '{"UserId":{"S":"u001"}}'
基本写法:投影指定字段
aws dynamodb get-item --table-name <表名> --key <键> --projection-expression <字段>
# 仅返回 Name 字段
aws dynamodb get-item \
--table-name Users \
--key '{"UserId":{"S":"u001"}}' \
--projection-expression '#n' \
--expression-attribute-names '{"#n":"Name"}'
基本写法:查询分区键
aws dynamodb query --table-name <表名> --key-condition-expression <条件>
# 查询指定用户所有订单
aws dynamodb query \
--table-name Orders \
--key-condition-expression 'UserId = :uid' \
--expression-attribute-values '{":uid":{"S":"u001"}}'
基本写法:范围查询排序键
aws dynamodb query --table-name <表名> --key-condition-expression <范围条件>
# 查询用户订单 ID 在 o001-o099 之间
aws dynamodb query \
--table-name Orders \
--key-condition-expression 'UserId = :uid AND OrderId BETWEEN :start AND :end' \
--expression-attribute-values '{":uid":{"S":"u001"},":start":{"S":"o001"},":end":{"S":"o099"}}'
基本写法:索引分页
aws dynamodb query --table-name <表名> --key-condition-expression <条件> --limit <数量> --exclusive-start-key <键>
# 翻页查询下 10 条
aws dynamodb query \
--table-name Orders \
--key-condition-expression 'UserId = :uid' \
--expression-attribute-values '{":uid":{"S":"u001"}}' \
--limit 10 \
--exclusive-start-key '{"UserId":{"S":"u001"},"OrderId":{"S":"o010"}}'
扫描与过滤
基本写法:全表扫描
aws dynamodb scan --table-name <表名>
# 扫描表所有记录
aws dynamodb scan --table-name Users
基本写法:扫描过滤
aws dynamodb scan --table-name <表名> --filter-expression <过滤> --expression-attribute-values <值>
# 过滤年龄大于 25 的用户
aws dynamodb scan \
--table-name Users \
--filter-expression 'Age > :minAge' \
--expression-attribute-values '{":minAge":{"N":"25"}}'
基本写法:扫描分页
aws dynamodb scan --table-name <表名> --limit <数量> --exclusive-start-key <键>
# 每次扫描 100 条
aws dynamodb scan --table-name Users --limit 100
基本写法:并行扫描
aws dynamodb scan --table-name <表名> --total-segments <段数> --segment <段号>
# 并行扫描第 0 段(总共 4 段)
aws dynamodb scan \
--table-name Users \
--total-segments 4 \
--segment 0
基本写法:删除条目
aws dynamodb delete-item --table-name <表名> --key <键>
# 删除指定用户记录
aws dynamodb delete-item \
--table-name Users \
--key '{"UserId":{"S":"u001"}}'
索引管理
基本写法:创建全局二级索引
aws dynamodb update-table --table-name <表名> --attribute-definitions <属性> --global-secondary-index-updates <索引>
# 为 Users 表创建按 Email 查询的 GSI
aws dynamodb update-table \
--table-name Users \
--attribute-definitions AttributeName=Email,AttributeType=S \
--global-secondary-index-updates '[{"Create":{"IndexName":"EmailIndex","KeySchema":[{"AttributeName":"Email","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"},"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":5}}}]'
基本写法:查询全局二级索引
aws dynamodb query --table-name <表名> --index-name <索引名> --key-condition-expression <条件>
# 通过 Email 索引查询
aws dynamodb query \
--table-name Users \
--index-name EmailIndex \
--key-condition-expression 'Email = :email' \
--expression-attribute-values '{":email":{"S":"alice@example.com"}}'
基本写法:创建本地二级索引
aws dynamodb update-table --table-name <表名> --attribute-definitions <属性> --local-secondary-index-updates <索引>
# 创建按 CreatedAt 排序的 LSI
aws dynamodb update-table \
--table-name Orders \
--attribute-definitions AttributeName=CreatedAt,AttributeType=S \
--local-secondary-index-updates '[{"Create":{"IndexName":"CreatedIndex","KeySchema":[{"AttributeName":"UserId","KeyType":"HASH"},{"AttributeName":"CreatedAt","KeyType":"RANGE"}],"Projection":{"ProjectionType":"ALL"}}}]'
基本写法:删除索引
aws dynamodb update-table --table-name <表名> --global-secondary-index-updates <删除>
# 删除 EmailIndex 索引
aws dynamodb update-table \
--table-name Users \
--global-secondary-index-updates '[{"Delete":{"IndexName":"EmailIndex"}}]'
事务操作
基本写法:事务写入
aws dynamodb transact-write-items --transact-items <项>
# 原子写入用户和订单(要么都成功,要么都失败)
aws dynamodb transact-write-items \
--transact-items '[
{"Put":{"TableName":"Users","Item":{"UserId":{"S":"u003"},"Name":{"S":"Charlie"}}}},
{"Put":{"TableName":"Orders","Item":{"UserId":{"S":"u003"},"OrderId":{"S":"o003"}}}}
]'
基本写法:事务读取
aws dynamodb transact-get-items --transact-items <项>
# 一次性原子读取多个条目
aws dynamodb transact-get-items \
--transact-items '[
{"Get":{"TableName":"Users","Key":{"UserId":{"S":"u001"}}}},
{"Get":{"TableName":"Users","Key":{"UserId":{"S":"u002"}}}}
]'
基本写法:条件检查事务
aws dynamodb transact-write-items --transact-items <带条件>
# 带条件的事务写入
aws dynamodb transact-write-items \
--transact-items '[
{"Put":{"TableName":"Users","Item":{"UserId":{"S":"u004"}},"ConditionExpression":"attribute_not_exists(UserId)"}},
{"Update":{"TableName":"Counters","Key":{"CounterId":{"S":"users"}},"UpdateExpression":"SET Value = Value + :inc","ExpressionAttributeValues":{":inc":{"N":"1"}}}}
]'
流与 TTL
基本写法:启用 DynamoDB Streams
aws dynamodb update-table --table-name <表名> --stream-specification <规格>
# 启用 NEW_AND_OLD_IMAGES 流
aws dynamodb update-table \
--table-name Users \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
基本写法:查看流描述
aws dynamodb describe-table --table-name <表名> --query 'Table.StreamSpecification'
# 查看表的流配置
aws dynamodb describe-table \
--table-name Users \
--query 'Table.StreamSpecification'
基本写法:启用 TTL
aws dynamodb update-time-to-live --table-name <表名> --time-to-live-specification <规格>
# 启用 TTL 自动删除 30 天前的记录
aws dynamodb update-time-to-live \
--table-name Sessions \
--time-to-live-specification Enabled=true,AttributeName=expireAt
基本写法:查看 TTL 配置
aws dynamodb describe-time-to-live --table-name <表名>
# 查看表 TTL 状态
aws dynamodb describe-time-to-live --table-name Sessions
备份与恢复
基本写法:创建备份
aws dynamodb create-backup --table-name <表名> --backup-name <备份名>
# 创建表备份
aws dynamodb create-backup \
--table-name Users \
--backup-name Users-backup-20260731
基本写法:列出备份
aws dynamodb list-backups
# 列出所有备份
aws dynamodb list-backups
基本写法:从备份还原表
aws dynamodb restore-table-from-backup --target-table-name <新表> --backup-arn <备份ARN>
# 从备份还原到新表
aws dynamodb restore-table-from-backup \
--target-table-name Users-restored \
--backup-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/01234567890123-Users-backup
基本写法:跨表还原
aws dynamodb restore-table-to-point-in-time --source-table-name <源表> --target-table-name <目标表>
# 时间点恢复(PITR)到新表
aws dynamodb restore-table-to-point-in-time \
--source-table-name Users \
--target-table-name Users-recovered \
--use-latest-restorable-time
基本写法:导出到 S3
aws dynamodb export-table-to-point-in-time --table-arn <表ARN> --s3-bucket <桶> --s3-prefix <前缀> --export-format <格式>
# 导出表数据到 S3
aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users \
--s3-bucket my-bucket \
--s3-prefix dynamodb-exports/Users/ \
--export-format DYNAMODB_JSON
容量与计费
基本写法:自动扩容
aws application-autoscaling register-scalable-target --service-namespace dynamodb --resource-id <资源> --scalable-dimension <维度>
# 注册表的写入容量为可伸缩目标
aws application-autoscaling register-scalable-target \
--service-namespace dynamodb \
--resource-id table/Users \
--scalable-dimension dynamodb:table:WriteCapacityUnits \
--min-capacity 5 \
--max-capacity 100
基本写法:配置扩容策略
aws application-autoscaling put-scaling-policy --policy-name <策略> --service-namespace dynamodb --resource-id <资源> --policy-type TargetTrackingScaling
# 目标追踪策略保持利用率 70%
aws application-autoscaling put-scaling-policy \
--policy-name UsersWriteScaling \
--service-namespace dynamodb \
--resource-id table/Users \
--scalable-dimension dynamodb:table:WriteCapacityUnits \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{"TargetValue":70.0,"PredefinedMetricSpecification":{"PredefinedMetricType":"DynamoDBWriteCapacityUtilization"}}'
基本写法:查看表消费容量
aws cloudwatch get-metric-statistics --namespace AWS/DynamoDB --metric-name ConsumedReadCapacityUnits
# 查询表已消费读容量
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name ConsumedReadCapacityUnits \
--dimensions Name=TableName,Value=Users \
--start-time 2026-07-31T00:00:00Z \
--end-time 2026-07-31T01:00:00Z \
--period 300 \
--statistics Sum