SQL Server 备份到 S3 兼容对象存储的 URL 的最佳做法和故障排除

适用于: SQL Server 2022 (16.x)

本文包括 SQL Server 备份和还原到 S3 兼容对象存储的最佳做法和故障排除提示。

有关将 Azure Blob 存储用于 SQL Server 备份或还原操作的详细信息,请参阅:

故障排除和常见错误原因

以下内容提供了在备份到 S3 兼容对象存储或从中还原时出现错误的一些快速解决方法。 为了避免由于不支持的选项或限制而导致错误,请参阅使用 S3 兼容对象存储进行 SQL 备份和还原

确保 URL 格式正确

以下是颁发 T-SQL 备份查询时格式正确的虚拟主机 URL 的示例,如下所示:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<bucketName>.<virtualHost>/<pathToBackup>/<backupFileName>' 

或针对 URL 路径样式:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<domainName>/<bucketName>/<pathToBackup>/<backupFileName>';

在 URL 中查看:

  1. URL 以 s3:// 开头。

  2. S3 存储虚拟主机 <virtualHost> 或服务器域 <domainName> 存在并正在使用 HTTPS 运行。 终结点将由安装在 SQL Server OS 主机上的 CA 进行验证。

  3. <bucketName> 是备份将写入到的存储桶的名称。 必须在运行备份 T-SQL 之前创建该桶。 备份 T-SQL 不会为客户创建该桶。 例如,如果用户未事先创建桶“nonExistingBucket”并运行如下 T-SQL 语句:

    BACKUP DATABASE AdventureWorks2022
    TO URL = 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak';
    

    格式不正确的 URL 可能会返回以下内容:

    Msg 3201, Level 16, State 1, Line 50
    Cannot open backup device 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
    Msg 3013, Level 16, State 1, Line 50
    BACKUP DATABASE is terminating abnormally.
    
  4. <pathToBackup> 在运行备份 T-SQL 之前不需要存在。 它在存储服务器中自动创建。 例如,如果用户事先创建桶“existingBucket”,而不是路径 'existingBucket/sqlbackups',则以下项仍将成功运行:

BACKUP DATABASE AdventureWorks2022
TO URL =  's3://<your-endpoint>/existingBucket/sqlbackups/AdventureWorks2022.bak';

在运行备份/还原之前创建服务器级凭据

在对 S3 兼容存储运行备份/还原 Transact-SQL 查询之前,必须先创建服务器级凭据。 在颁发备份/还原查询之前,此凭据需要包含客户在其 S3 兼容对象存储服务器上设置的访问密钥和密钥。

需要为 URL s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak 创建的凭据示例如下:

CREATE CREDENTIAL [s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak]
WITH IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';

在此语句中,<AccessKeyID> 不允许包含 : 字符。 如果在运行备份/还原查询之前未创建凭据,用户将看到以下错误消息:

Msg 3201, Level 16, State 1, Line 50
Cannot open backup device 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
Msg 3013, Level 16, State 1, Line 50
BACKUP DATABASE is terminating abnormally.

凭据的名称不需要与确切的 URL 路径匹配。 以下是凭据查找的工作原理示例。 如果需要查询路径 s3://10.193.16.183:9000/myS3Bucket/sqlbackups/AdventureWorks2022.bak,将尝试以下凭据名称:

  1. s3://10.193.16.183:8787/myS3Bucket/sqlbackups/AdventureWorks2022.bak
  2. s3://10.193.16.183:8787/myS3Bucket/sqlbackups
  3. s3://10.193.16.183:8787/myS3Bucket

如果有多个凭据匹配搜索,例如更具针对性的 s3://10.193.16.183:8787/myS3Bucket/sqlbackups 和更通用的 s3://10.193.16.183:8787/myS3Bucket,请选择最具针对性的凭据。 这样,你就可以在目录级别为哪些文件夹可通过 SQL Server 访问设置更精细的访问控制。

不受支持的选项 FILE_SNAPSHOT

目前,S3 兼容对象存储不支持 BACKUP TSQL 选项 FILE_SNAPSHOT。 这是特定于 Azure Blob 存储的选项。

如果用户运行以下 Transact-SQL,例如:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH FILE_SNAPSHOT;

返回以下错误消息:

Msg 3073, Level 16, State 1, Line 62
The option WITH FILE_SNAPSHOT is only permitted if all database files are in Azure Storage.
Msg 3013, Level 16, State 1, Line 62
BACKUP DATABASE is terminating abnormally.

备份条带超过 100 GB

目前,在备份期间,客户在 S3 兼容对象存储中创建的单一备份文件的大小不能超过每个文件 100 GB,使用默认值 MAXTRANSFERSIZE。 如果备份条带超过 100 GB,则备份 T-SQL 语法语句会引发以下错误消息:

Msg 3202, Level 16, State 1, Line 161
Write on 's3://<endpoint>:<port>/<bucket>/<path>/<db_name>.bak' failed: 87(The parameter is incorrect.)
Msg 3013, Level 16, State 1, Line 161
BACKUP DATABASE is terminating abnormally.

针对用户的备份大型数据库,当前指南规定可使用多个条带进行数据库备份,每个条带允许大小不超过 100 GB。 BACKUP T-SQL 支持条带化为最多 64 个 URL,例如:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_1.bak',
URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_2.bak';

用户的替代选项是使用“COMPRESSION”选项:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH COMPRESSION;

URL 的最大长度

备份和还原引擎将 URL 总长度限制在 259 个字符。 这意味着 s3://hostname/objectkey 不应超过 259 个字符。 不考虑 s3://,用户可输入的路径长度(主机名 + 对象键)为 259 – 5 = 254 个字符。 请参阅 SQL Server 备份到 URL - SQL Server。 备份 T-SQL 语法语句会引发以下错误消息:

SQL Server has a maximum limit of 259 characters for a backup device name. The BACKUP TO URL consumes 36 characters for the required elements used to specify the URL - 'https://.blob.core.windows.net//.bak', leaving 223 characters for account, container, and blob names put together'

时钟偏差更正

每当 SQL 主机和 S3 服务器之间的时间差大于 15 分钟时,S3 存储可能会拒绝连接,将“InvalidSignatureException”错误返回 SQL Server。 在 SQL Server 上,它显示为:

Msg 3201, Level 16, State 1, Line 28
Cannot open backup device '<path>'. Operating system error 5(Access is denied.).
Msg 3013, Level 16, State 1, Line 28
BACKUP DATABASE is terminating abnormally.

Linux 上的 SQL Server 支持

SQL Server 使用 WinHttp 来实现其使用的 HTTP REST API 的客户端。 它依赖 OS 证书存储来验证由 HTTP(S) 端点提供的 TLS 证书。 但是,Linux 上的 SQL Server 将证书验证委托给 SQLPAL,然后,SQLPAL 使用 PAL 随附的证书来验证端点的 HTTPS 证书。 因此,无法在 Linux 上使用客户提供的自签名证书进行 HTTPS 验证。

在备份/还原期间,客户将在 Linux 上收到以下错误消息:

Msg 3201, Level 16, State 1, Line 20
Cannot open backup device 's3://<endpoint>/<bucket>/testingDB.bak'. Operating system error 12175(failed to retrieve text for this error. Reason: 15105).
Msg 3013, Level 16, State 1, Line 20
BACKUP DATABASE is terminating abnormally.

若要解决此问题,必须创建以下预定义位置:/var/opt/mssql/security/ca-certificates。 将自签名证书或未随 PAL 一起随附的证书放置在此位置。 SQL Server 会在启动时从文件夹中读取证书,并将其添加到 PAL 信任存储中。

如果文件夹未创建,则此位置最多可存储 50 个文件,当启动 SQL Server 时,将显示 SQL Server 错误日志:

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

对象锁定 - 不支持删除保留

SQL Server 备份到 S3 兼容的对象存储功能不支持对象锁定,也称为“删除保留”功能。 对象锁定可防止在保留期内删除或覆盖文件。

备份操作所针对的存储桶和文件夹位置不得启用对象锁定。 如果在与 S3 兼容的对象存储中启用和配置此功能,则备份操作将会失败并显示以下消息:

Msg 3202, Level 16, State 1, Line 13
Write on 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak' failed: 87 (The parameter is incorrect).
Msg 3013, Level 16, State 1, Line 13
BACKUP DATABASE is terminating abnormally.