从S3存储桶恢复AWS RDS SQL Server上的备份文件

时间:2017-05-19 19:49:20

标签: sql-server amazon-web-services amazon-s3

我能够使用以下命令成功从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/*"
             ]
        }
    ]
}

6 个答案:

答案 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)

一天中大部分时间都在阅读帖子(包括这篇文章),并仔细检查所有设置以发现该问题是一个愚蠢的问题,我认为我会分享自己的发现。

当还原过程无法访问或读取备份文件时,拒绝访问只是一般错误消息的一部分。

  • 可能要归类为IAM权限
  • 这可能是由于拼写错误(一些人发布的文件名 区分大小写)
  • 可能是由于文件损坏
  • 这可能取决于文件/服务器不兼容,例如版本或为 在我的情况下是压缩备份,其中所选服务器没有 支持压缩

答案 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来修复权限,但是就我而言,它要简单得多:

  1. Source 帐户中创建存储分区
  2. 授予对目标帐户的读取权限
  3. Source 数据库备份到存储桶中,为您提供一个存储桶中的文件,该文件均由 Source 帐户拥有,但可由 Destination < / em>帐户
  4. 将备份还原到目标帐户的数据库中

答案 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/