拆分大型SQL备份

时间:2016-10-27 10:40:55

标签: sql-server amazon-s3

我有一个大型SQL数据库(~1TB),我试图备份。

我可以支持它,但我们希望将它存储在Amazon S3上,最大对象大小为5GB。

我以为我可以通过使用多个文件来分割它,但似乎最大值是64,所以我仍然最终得到16GB块,这对于S3来说太大了。

还有其他办法吗?

由于

1 个答案:

答案 0 :(得分:0)

S3的最大blob大小为5TB,而不是5GB。 5GB只是可以使用单个HTTP PUT上传的最大对象。

所有云提供商都遵循相同的模式:他们不是上传一个巨大的文件并将其存储为单个blob,而是将它分解为可以跨多个磁盘复制的块。当您请求数据时,提供程序会从所有这些块中检索它。但是,对于客户端,blob显示为单个对象。

上传大文件也需要块。所有提供程序都要求您上载单个块并最终通知提供程序这些块构成一个对象,而不是使用单个上载操作(HTTP PUT)上载大文件。这样,您可以在发生故障时仅重新上传单个故障块,提供程序可以在您发送下一个块时提交每个块,它们不必跟踪和锁定大型blob(在大磁盘上)等待你完成上传等。

在您的情况下,您将不得不使用了解云存储并使用多个块的上传器,可能类似于Cyber​​duck或S3特定的命令行工具。或者编写一个使用Amazon SDK来部分上传备份文件的实用程序。

亚马逊的文档站点提供了Uploading Objects Using Multipart Upload API分段上传的示例。 high-level examples演示了上传大文件的各种方法。所有呼叫都使用多部分上传,例如最简单的呼叫:

var client= new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
var fileTransferUtility = new TransferUtility(client);
fileTransferUtility.Upload(filePath, existingBucketName);

将使用多个部分上传文件,并使用文件的路径作为其键。最高级的示例允许您指定零件尺寸,不同的密钥,冗余选项等:

var fileTransferUtilityRequest = new TransferUtilityUploadRequest
            {
                BucketName = existingBucketName,
                FilePath = filePath,
                StorageClass = S3StorageClass.ReducedRedundancy,
                PartSize = 6291456, // 6 MB.
                Key = keyName,
                CannedACL = S3CannedACL.PublicRead
            };
fileTransferUtilityRequest.Metadata.Add("param1", "Value1");
fileTransferUtilityRequest.Metadata.Add("param2", "Value2");
fileTransferUtility.Upload(fileTransferUtilityRequest);