







本文介绍将S3兼容的对象存储用作数据库备份目标所需的概念、要求和组件。 数据库备份和恢复功能在概念上类似于使用SQL Server备份到Azure Blob存储的URL作为备份设备类型。
要注意的是,不只是Amazon S3对象存储,实际上可以备份到任何兼容S3协议的对象存储。
SQL Server 2022(16.x)引入了对象存储集成功能,使您可以将SQL Server与S3兼容的对象存储集成。为了提供这种集成,SQL Server提供了一个S3连接器,它使用S3 REST API连接到任何S3兼容的对象存储提供商。SQL Server 2022(16.x)通过增加对使用REST API的新S3连接器的支持,扩展了现有的BACKUP TO /RESTORE FROM URL命令的语法。
指向S3兼容资源的URL以s3://为前缀,表示正在使用S3连接器。以s3://开头的URL始终假定底层传输协议为https。
文件编号和文件大小限制 为了存储数据,S3兼容对象存储提供商必须将文件分割成多个称为“Block”的块,这类似于微软Azure Blob存储中的块Blob。
单个 URL 支持的备份文件大小为 200GB(当 MAXTRANSFERSIZE 设置为 20 MB 时)。单个备份文件最多可拆分到最多 64 个 URL,意味着通过备份分块功能,可拆分备份集以支持最大单个数据库 12.8 TB 的备份文件大小(https://www.cnblogs.com/lyhabc/p/4173903.html)。
S3端点必须按以下方式配置:
1、必须配置TLS。假定所有连接将通过HTTPS而非HTTP进行安全传输。端点通过安装在SQL Server所在操作系统主机上的证书进行验证。
2、在S3兼容的对象存储中创建凭据,具有执行该操作所需的适当权限。在存储层上创建的用户和密码被称为访问密钥ID(Access Key ID)和秘密密钥ID(Secret Key ID)。我们需要这两个密钥才能对S3端点进行身份验证。
3、至少配置了一个存储桶bucket,也就是在对象存储提供商的配置界面上提前创建好存储桶 ,不能在SQL Server里创建存储桶bucket.
SQL Server使用 WinHttp 实现其所使用的HTTP REST API客户端。它依赖Windows平台的证书存储来验证由HTTP(S)端点提供的TLS证书。然而,在Linux平台上运行的SQL Server的CA证书必须放置在一个预定义的位置,即/var/opt/mssql/security/ca-certificates 文件夹中,且该文件夹最多只能存储和支持前50个证书。在启动SQL Server进程之前,必须将CA证书放置在该位置。SQL Server在启动时从该文件夹读取证书,并将它们添加到信任存储中。
Linux 上的 SQL Server 会将证书验证委托给 SQLPAL,SQLPAL会通过自身附带的证书验证端点的 HTTPS 证书。
SQL Server 会在启动时读取该文件夹中的证书,并将其添加到PAL信任存储。如果 /var/opt/mssql/security/ca-certificates路径下没有任何证书,数据库启动时会如下错误:
2022-02-05 00:32:10.86 Server Installing Client TLS certificates to the store. 2022-02-05 00:32:10.88 Server Error searching first file in /var/opt/mssql/security/ca-certificates: 3(The system cannot find the path specified.)
凭据的名称尽量使用存储路径,以更好的进行区分,并且根据存储平台的不同有多个标准。
当使用S3连接器时,IDENTITY参数应始终为 'S3 Access Key'。 Access Key ID和Secret Key ID中不得包含冒号。 Access Key ID和Secret Key ID相当于在S3兼容的对象存储上的用户名和密码,用来识别单一用户。 Access Key ID 必须具有适当的权限来访问S3兼容的对象存储中的数据。 使用CREATE CREDENTIAL命令创建服务器级别凭据以进行与S3兼容的对象存储端点的身份验证。
AWS S3 支持两种不同的 URL 形式。
S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER>(默认)
S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>
示例代码如下:
USE [master];
GO
CREATE CREDENTIAL [s3://<endpoint>:<port>/<bucket>]
WITH
IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';
GO
BACKUP DATABASE [SQLTestDB]
TO URL = 's3://<endpoint>:<port>/<bucket>/SQLTestDB.bak'
WITH FORMAT ,STATS = 10, COMPRESSION;
有多种方法可以为AWS云上的S3对象存储创建凭据。
CREATE CREDENTIAL [s3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup]
WITH
IDENTITY = 'S3 Access Key'
, SECRET = 'accesskey:secretkey';
GO
BACKUP DATABASE [AdventureWorks2022]
TO URL = 's3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO
--或者
CREATE CREDENTIAL [s3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup]
WITH
IDENTITY = 'S3 Access Key'
, SECRET = 'accesskey:secretkey';
GO
BACKUP DATABASE [AdventureWorks2022]
TO URL = 's3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO
备份到 URL
--以下示例将执行完整备份文件进行分割,然后备份到对象存储端点:
BACKUP DATABASE <db_name>
TO URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
, URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
, URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
WITH FORMAT ,STATS = 10, COMPRESSION;
从 URL 恢复
--以下示例将从对象存储端点位置执行备份恢复:
RESTORE DATABASE <db_name>
FROM URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
, URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
, URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
WITH REPLACE , STATS = 10;


以下示例展示如何使用加密和压缩来备份和恢复 AdventureWorks2022 数据库:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = <password>;
GO
CREATE CERTIFICATE AdventureWorks2022Cert
WITH SUBJECT = 'AdventureWorks2022 Backup Certificate';
GO
-- 备份数据库
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH FORMAT, COMPRESSION,
ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = AdventureWorks2022Cert)
GO
-- 恢复数据库
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH REPLACE
以下示例展示如何使用REGION_OPTIONS选项进行备份和恢复 AdventureWorks2022 数据库:
您可以在每个BACKUP / RESTORE命令中添加区域参数。 请注意,在BACKUP_OPTIONS和RESTORE_OPTIONS中使用了S3存储特定的区域字符串, 例如 '{"s3": {"region":"us-west-2"}}'。默认区域是 us-east-1。
-- 备份数据库
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}'
-- 恢复数据库
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'
SQL Server 2008的压缩备份是一个新特性,根据实际使用中的观察,压缩比至少在1:5左右,也就是备份时增加了压缩选项(COMPRESSION)后可以至少压缩到数据文件大小的20%甚至更低,
可以很大程度上加快备份执行时间,减轻IO压力和节省备份服务器的磁盘存储空间。
-- 备份数据库
BACKUP DATABASE SQLTestDB TO DISK = 'c:\tmp\SQLTestDB.bak' WITH stats =5 , COMPRESSION
GO
SQL Server 2022通过新引入的S3连接器,SQL Server能够支持通过REST API与S3兼容的对象存储集成。用户可以配置存储桶和凭据,通过URL指向存储位置进行备份和恢复。此外,备份命令依然支持SQL2014的加密和SQL2008的压缩等备份选项,以及在Linux平台上的特殊配置要求。示例展示了如何创建凭据、执行数据库备份和恢复操作,支持区域参数指定备份和恢复的地域。
参考文章
https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/sql-server-backup-to-url-s3-compatible-object-storage?view=sql-server-ver16&viewFallbackFrom=sql-server-ver15
https://aws.amazon.com/cn/blogs/modernizing-with-aws/backup-sql-server-to-amazon-s3/
https://www.mssqltips.com/sqlservertip/7302/backup-sql-server-2022-database-aws-s3-storage/

本文版权归作者所有,未经作者同意不得转载。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。