使用AWS SDK迁移MySQL数据至DynamoDB无报错但未上传问题
排查MySQL到DynamoDB无报错但未写入数据的问题
以下是几个关键排查方向和修复建议:
1. 检查批量写入返回的未处理项
batchWriteItem不会因部分写入失败抛出异常,只会在返回结果中包含UnprocessedItems字段。你的代码目前未检查这部分内容,可能存在静默失败的情况。修改代码:
try { const data = await dynamoDB.batchWriteItem(batchWriteParams).promise(); console.log('Success Items deployed to DynamoDB', data); // 新增:检查未处理项 if (Object.keys(data.UnprocessedItems).length > 0) { console.error('存在未处理的项,需重试', data.UnprocessedItems); // 可在此添加重试逻辑,根据AWS建议最多重试5次 } } catch (err) { console.error('Error', err); }
2. 确认MySQL查询是否返回有效数据
在生成DynamoDB写入项之前,先打印MySQL查询结果,确认是否成功获取到数据:
const result = await db.query(query); console.log('MySQL查询结果', result); // 确认数组内有数据
同时检查你的Database类的query方法是否正确封装为Promise——如果是回调模式,await会拿到undefined,导致dynamoDBItems为空数组,自然不会写入任何数据。
3. 核对DynamoDB主键配置
你的PK写的是固定值AppsAli#ID,需确认是否与目标DynamoDB表的主键定义匹配:
- 如果表的主键是
PK(分区键)+SK(排序键)的组合,需确保PK+SK的组合是唯一的(或符合业务逻辑); - 注释提到"PK format: TableNameid",是否应该将PK设置为动态值?比如
AppsAli#${row.ID}?需根据表的实际设计调整。
4. 验证AWS SDK区域配置
确保DynamoDB客户端初始化时指定了正确的区域,与你的目标表所在区域一致:
const dynamoDB = new AWS.DynamoDB({ region: 'us-east-1' }); // 替换为你的表所在区域
如果未指定区域,SDK会从环境变量或本地凭证文件读取,可能导致写入到错误区域的表(而你查看的是另一个区域的表)。
5. 检查IAM权限
确认执行代码的IAM实体(用户/角色)拥有dynamodb:BatchWriteItem权限,且资源范围包含目标表的ARN(格式为arn:aws:dynamodb:区域:账号ID:table/xyz)。部分权限不足的场景下,不会抛出明确错误,但会导致写入失败。
6. 确认表名和表存在性
检查tableName变量中的xyz是否是目标表的正确名称,且该表确实存在于指定区域中。
内容的提问来源于stack exchange,提问作者Ali Haydar
相关产品推荐
相关产品推荐

