【问题标题】:Split large SQL backup拆分大型 SQL 备份
【发布时间】:2020-03-12 19:22:39
【问题描述】:

我有一个正在尝试备份的大型 SQL 数据库 (~1TB)。

我可以很好地备份它,但我们想将它存储在 Amazon S3 上,最大对象大小为 5GB。

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

还有其他方法吗?

【问题讨论】:

  • 这与编程无关。只需检查有关备份的文档以及是否/如何使用多个文件。简单地搜索“sql server backup multiple files”会返回很多答案(是的,你可以,只需在对话框中添加它们)
  • @AndrewDeighton 非编程问题,没有努力寻找解决方案,甚至没有尝试谷歌。这不是一个好问题。也不要强迫 me 投反对票。顺便说一句,数据库变大了。 1TB 不再被认为是那么大 - 1PB 是最新的单机 SQL Server 参考架构。在谈到备份等关键业务问题时,文件拆分/加入绝对是一个非常非常非常非常的坏主意。
  • @BenDurkin Azure 为 SQL Server 提供云备份。您可能应该考虑 this 而不是将完整备份拆分为 200 个文件。
  • @PanagiotisKanavos :感谢您提供可能的解释-该论坛仅用于编程吗?我不确定这一点 - 观察:如果我从未注意到,或者不足以让像我这样的人注意到,它就不能非常突出地指定。标签上写着 sql-server 和 amazon - 他似乎说他也达到了他可以拆分多少文件的限制,所以他必须至少尝试过 - 谷歌回答了吗?
  • @BenDurkin 大小限制 is 5TB 不是 5GB。 5GB 是上传块大小。这意味着您可以上传最大为 5GB 的块。您如何尝试上传备份?也许您应该寻找一个不同的上传者,一个了解云存储的?

标签: sql-server amazon-s3


【解决方案1】:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2011-04-19
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多