我能够使用以下命令成功从AWS上的SQL Server实例获取数据库备份到S3存储桶:
-- Backup databases - MyDB
exec msdb.dbo.rds_backup_database
@source_db_name='MyDB',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/MyDB.bak',
@overwrite_S3_backup_file=1;
使用以下命令将同一备份还原到同一区域内的其他SQL Server实例时,它不起作用:
-- restore databases - MyDB
EXEC msdb.dbo.rds_restore_database
@restore_db_name='MyDB',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/MyDB.bak';
使用exec msdb.dbo.rds_task_status @db_name='MyDB'
[2017-05-19 19:22:22.127] Aborted the task because of a task failure or a concurrent RESTORE_DB request.
[2017-05-19 19:22:22.150] Error making the request with Error Code Forbidden and Http Status Code Forbidden. No further error information was returned by the service.
到目前为止,我已在多个数据库实例上完成了此备份和还原,从未见过这种错误。需要还原.bak文件的S3存储桶和SQL Server实例位于同一区域,分配的选项组角色也具有在S3存储桶上设置的所有必需权限。以下是选项组角色策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::mybucket"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObjectMetaData",
"s3:GetObject",
"s3:PutObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": [
"arn:aws:s3:::mybucket/*"
]
}
]
}
答案 0 :(得分:1)
问题在于备份(.bak)文件,当它们未正确传输或丢失一些元数据信息时,会出现此错误。最初我使用命令将文件从一个AWS账户(ap-northeast-1
)转移到不同地区的另一个AWS账户(us-east-1
)
aws s3 sync s3://account1bucket s3://account2bucket --source-region ap-northeast-1
但看起来并没有正常工作。现在,我已手动从Source S3存储桶下载文件并上传到目标S3存储桶,它现在开始工作。
这可能会解决使用AWS CLI传输存储桶内容的一些问题:https://github.com/aws/aws-cli/pull/1122
答案 1 :(得分:1)
另外需要注意的一点是SQL备份文件名区分大小写。
exec msdb.dbo.rds_restore_database @ restore_db_name = 'yourdatabasename', @ s3_arn_to_restore_from = 'ARN:AWS:S3 ::: /<的 CASESENSITIVE_SQL_BACKUPNAME 强> .BAK>';
答案 2 :(得分:1)
一天中大部分时间都在阅读帖子(包括这篇文章),并仔细检查所有设置以发现该问题是一个愚蠢的问题,我认为我会分享自己的发现。
当还原过程无法访问或读取备份文件时,拒绝访问只是一般错误消息的一部分。
答案 3 :(得分:0)
在帐户之间传输数据库实例时遇到了这个问题。我在 Destination 帐户中创建了一个S3存储桶,并授予了 Source 帐户的写权限。
当我进入 Source 数据库并将其备份到S3存储桶时,一切正常,但是当我尝试在 Destination 数据库中还原该备份时,得到了错误:
Error making request with Error Code Forbidden and Http Status Code Forbidden. No further error information was returned by the service.
找到该线程并查看了有关权限的线索(包括使备份文件公开可读!)后,我发现,即使备份已写入 Destination 帐户所拥有的存储桶中,其中的文件归 Source 帐户所有,并且 Destination 帐户没有读取权限!这对我来说是意外的。换句话说:
存储桶的所有者可以将写权限授予另一个帐户。然后,该帐户可以写入存储桶所有者不能读取的文件。
现在回头看完全有道理,尽管我没想到它是“默认”行为!
我确定可以通过考虑使用AWS CLI来修复权限,但是就我而言,它要简单得多:
答案 4 :(得分:0)
我所做的只是重新上传.bak 文件。显然,当我最初压缩它时,它遗漏了一些文件。
答案 5 :(得分:0)
从另一个帐户复制时使用 --acl bucket-owner-full-control。
如果您已经复制了它,则必须在将对象添加到存储桶后授予访问权限:
<块引用>将对象添加到存储桶后授予访问权限 如果对象是 已经在另一个账户的存储桶中,对象所有者可以授予 使用 put-object-acl 命令访问存储桶所有者:
aws s3api put-object-acl --bucket destination_DOC-EXAMPLE-BUCKET --key keyname --acl bucket-owner-full-control
来源:https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/