Microsoft 在将 S3 连接器和 Polybase 添加到 SQL Server 2022 时取得了重大飞跃。因此,企业可以利用他们保存到对象存储中的大量数据,并使用它来丰富 SQL Server 表。他们还可以利用对象存储来备份 SQL Server,这是开放性和云原生灵活性的又一次巨大飞跃。
对象存储在备份和恢复领域占据主导地位,因为它可靠、可扩展、高性能且不可变。Veeam Backup and Replication v12 将对象存储视为一等公民,Commvault 也是如此。所有主要的备份软件都采用了对象存储,因为它是一种经济高效且安全的备份存储,可以满足当今数据密集型 AI 应用程序的需求。NAS 和 SAN 无法提供相同的性能和效率,因此 MinIO 等对象存储成为本地 SQL Server 备份的唯一选择。
这篇博文将引导你完成实现和测试在 Microsoft Windows 上部署的 SQL Server 2022 的备份到 URL 功能的过程。您将学习如何部署 SQL Server、预置 MinIO 存储桶、创建 IAM 策略以保护对这些存储桶的访问,以及如何在 MinIO 中创建服务账户。我们将使用备份到 URL 来运行 SQL Server 备份和还原。最后,我们将设置 ILM 策略,将旧备份分层到另一个存储分段,并删除更旧的备份。
部署 SQL Server 2022 企业版
如果您部署了 SQL Server 2022,请随意使用它。
如果没有,请安装以下方法之一,并确保同时安装 Polybase:
- SQL Server 2022 for Docker
- SQL Server 2022 for Windows
- SQL Server 2022 for Linux
您还需要一种与 SQL Server 交互的方法:
- Microsoft SQL Server 管理工作室 (MSSMS)
- Microsoft sqlcmd 实用工具
确保 SQL Server 正在运行,并使用上述任一工具连接到它。
若要确保所有内容都已正确安装,请运行以下查询以获取 SQL Server 版本、版本和产品级别,如下所示。
SELECT SERVERPROPERTY('Edition') AS SQLEdition,SERVERPROPERTY('ProductVersion') AS ProductVersion,SERVERPROPERTY('ProductLevel') AS ProductLevel;
部署和配置 MinIO
如果您尚未运行它,请在裸机、Docker 或 Kubernetes 上安装 MinIO。
访问 MinIO 服务器需要 MinIO 客户端 (mc)。以下是在本地安装 mc 的方法。
记下首次运行 MinIO Server 时显示的凭据和 S3 终端节点,因为您将需要它们来为外部数据源配置 SQL Server。
创建 MinIO Bucket
使用 Web 浏览器登录 MinIO,其中包含上一步中提供的管理员凭据、IP 地址和端口。
登录后,单击 Create Bucket 并命名您的存储桶 sql-2022-backups
。确保启用版本控制。
重复上述步骤以创建名为 sql-2022-archives
的第二个存储桶。
配置 IAM 存储桶策略
创建 Identity and Access Management (IAM) 策略以定义与您在上一步中创建的存储桶交互所需的特定权限。下面的 JSON 提供了 s3:ListBucket
和 s3:PutObject
s3:GetObject
的权限。该语句定义应用策略的存储桶,尾随表示该 Resource 策略适用于所有存储桶和以 开头的前缀 sql-2022-backups 。 */*
在 MinIO 浏览器中,单击左侧菜单中的策略。然后单击创建策略。
将下面的 JSON 复制并粘贴到新策略中。为策略 Backup
命名,然后单击保存。
{"Version": "2012-10-17","Statement": [{"Action": ["admin:SetTier","admin:ListTier"],"Effect": "Allow","Sid": "EnableRemoteTierManagement"},{"Action": ["s3:PutLifecycleConfiguration","s3:GetLifecycleConfiguration"],"Resource": ["arn:aws:s3:::*"],"Effect": "Allow","Sid": "EnableLifecycleManagementRules"}]
}
创建 SQL Server 凭据
将 SQL Server 配置为使用上一步中的“访问密钥”和“密钥”来创建 SQL Server 凭据。
运行以下 T-SQL 查询,使用目标存储桶、访问密钥和私有密钥创建凭据。该 SECRET
参数包括之前创建的帐户的访问密钥和私有密钥,以冒号分隔。
CREATE CREDENTIAL [s3://<your-MinIO-server>:9000/sql-2022-backups]
WITH IDENTITY = 'S3 Access Key', SECRET = '<Access Key>:<Secret Key>';
将 SQL Server 2022 数据库备份到 MinIO
您将需要一个数据库来备份,任何数据库都可以。我正在使用 Microsoft 的 WideWorldImporters (WWI) 示例数据库。有关下载和安装 WWI 数据库的说明,请参阅使用 SQL Server 2022 数据湖屋的数据科学和 AI,有关其他信息,请参阅 Microsoft SQL 的广阔世界导入程序示例数据库。
T-SQL BACKUP DATABASE
命令需要多个参数:
-
TO URL = xxx 存储桶和备份文件的完整路径
-
WITH FORMAT 允许覆盖现有备份文件。如果没有此参数,如果文件已存在,则备份将失败。在存储桶上启用版本控制后,可以防止文件被删除
-
COMPRESSION 使 SQL Server Compression 能够创建和发送尽可能小的备份文件
-
MAXTRANSFERSIZE=20971520 (20 MB) 定义用于分段上传的最大备份文件的大小(以字节为单位)。
BACKUP DATABASE WideWorldImporters
TO URL = 's3://<your-minio-server>:9000/sql-2022-backups/WideWorldImporters.bak'
WITH FORMAT, COMPRESSION, MAXTRANSFERSIZE = 20971520;
WITH FORMAT, COMPRESSION, MAXTRANSFERSIZE = 20971520;
Processed 1608 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1.
Processed 53112 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1.
Processed 3865 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1.
Processed 347 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1.
BACKUP DATABASE successfully processed 58932 pages in 8.771 seconds (52.491 MB/sec).Completion time: 2024-01-10T17:04:36.6181820-08:00
版本控制备份
使用参数 FORMAT 时,现有备份将被新备份替换,但旧版本仍可通过 MinIO 版本控制使用。
再运行上述备份命令 2 次。MinIO 是不可变的,从不覆盖数据。因此,将保留以前的版本,并且您可以使用 --versions 该标志查看它们。
$ mc ls --versions myminio/sql-2022-backups/
[2024-01-11 17:39:03 PST] 1.3GiB STANDARD c635324e-e643-441c-970f-3da5308e8bbd v3 PUT WideWorldImporters.bak
[2024-01-11 17:33:33 PST] 1.3GiB STANDARD a5f73f90-eb68-4f09-b5eb-0643ca413ccf v2 PUT WideWorldImporters.bak
[2024-01-10 17:04:36 PST] 135MiB STANDARD f2d9a2b3-3d94-49a4-a835-d815a14fac32 v1 PUT WideWorldImporters.bak
有关使用版本化对象的更多信息,请参阅使用 MinIO 版本控制和倒带进行持续数据保护。
还原数据库
如果发生故障,则必须按逻辑顺序还原 SQL Server 备份,然后恢复数据库。您可以还原完整的数据库、数据文件或数据页。在 Microsoft 的说法中,还原是指将数据和日志从备份复制到数据库的多阶段过程,而恢复是指将数据库返回到稳定、一致和可用的状态。
在此示例中,我们将介绍完整的数据库备份和还原。这是最基本的备份策略。可以还原和恢复完整数据库备份。但是,可能需要还原完整数据库,然后还原差异备份。
还原数据库就像备份数据库一样简单。数据库引擎通过在数据库还原期间执行三个步骤来保证整个数据库可用且逻辑一致:
-
创建数据库和事务日志(如果尚不存在)
-
将所有数据、日志和索引页从备份复制到数据库文件
-
应用事务日志进行恢复
还原数据库时,有两个选项:
-
恢复。。。WITH REPLACE 在执行还原时覆盖现有数据库。SQL Server 将忽略事务日志中的任何活动内容,而只是还原数据库备份。
-
第二种选择是恢复为新数据库,保持原始数据库不变。
还原和替换数据库:
RESTORE DATABASE WideWorldImporters
FROM URL = 's3://minio.example.net:9000/sql-2022-backups/wideworldimporters.bak'
WITH REPLACE;
要将数据库还原为新数据库,请执行以下操作:
RESTORE DATABASE [WideWorldImporters-copy]
FROM URL = 's3://minio.example.net:9000/sql-2022-backups/WideWorldImporters.bak'
WITH FILE = 1,
MOVE N'WideWorldImporters' TO N'C:\SQL2022\Data\WideWorldImporters-copy.mdf',
MOVE N'WideWorldImporters_log' TO N'C:\SQL2022\Log\WideWorldImporters-copy_log.ldf'
SQL Server 2022 备份的生命周期管理
大多数企业不会简单地将所有数据库(并保留所有版本)备份到同一个存储桶中。将旧版本的备份存储在高性能热层上效率不高,因为它们可能只能在数据库恢复方案中访问。我们将根据保留策略将备份移动到备用存储层。
我们将利用 MinIO 的生命周期管理功能,将超过 10 天的备份的非当前版本从原始存储桶过渡到具有冷层(针对容量优化)存储的集群上的第二个存储桶。我们将使用免费的 MinIO Play。
在第二个 MinIO 集群上创建存储桶。
mc mb play/sql-2022-archives
创建用于生命周期管理的用户和策略。下载并自定义 JSON 示例策略,使用源集群的别名,并确保分配安全密钥。
get -O - https://min.io/docs/minio/linux/examples/LifecycleManagementAdmin.json | \
mc admin policy create myminio LifecycleAdminPolicy /dev/stdin
mc admin user add myminio myminioLifecycleAdmin jki234huihsdu23
mc admin policy attach myminio LifecycleAdminPolicy --user=myminioLifecycleAdmin
配置远程存储层
mc ilm tier add minio myminio ARCHIVE --endpoint https://play.min.io:9000 --access-key Q3AM3UQ867SPQQA43P2F --secret-key zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG --bucket sql-2022-backups --storage-class STANDARD --insecureAdded remote tier ARCHIVE of type minio
创建并应用转换规则。您将指定源集群和存储桶、要转换到的层以及转换规则。以下命令创建一个策略,用于将所有超过 10 天的非当前版本的备份转换为您刚刚创建的层。
mc ilm rule add myminio/sql-2022-backups --noncurrent-transition-days 10 --noncurrent-transition-tier ARCHIVELifecycle configuration rule added with ID `cmgr9qht2ketkof3o2h0` to myminio/sql-2022-backups.
最后,确保规则配置正确:
mc ilm rule ls myminio/sql-2022-backups┌─────────────────────────────────────────────────────────────────────────┐
│ Transition for older versions (NoncurrentVersionTransition) │
├──────────────────────┬─────────┬────────┬──────┬──────────────┬─────────┤
│ ID │ STATUS │ PREFIX │ TAGS │ DAYS TO TIER │ TIER │
├──────────────────────┼─────────┼────────┼──────┼──────────────┼─────────┤
│ cmgr9qht2ketkof3o2h0 │ Enabled │ - │ - │ 10 │ ARCHIVE │
└──────────────────────┴─────────┴────────┴──────┴──────────────┴─────────┘
有关更多详细信息,请参阅将对象转换为远程 MinIO 部署。
备份到多个 URL
Microsoft 指出,您可以通过跨多个对象条带化备份并使用多个 URL 并行写入来提高性能。您最多可以使用 64 个 URL,每个 URL 等同于作为备份一部分的对象。目前,单个备份文件的大小限制为 100GB;如果要备份的数据库超过 100GB,则需要使用多个 URL。
您需要做的就是添加与条带一样多 TO_URL 的参数,其余的由 SQL Server 处理。备份名称可以是您想要的任何名称,但部件需要按顺序编号。
下面是一个包含 6 个 URL 的示例
BACKUP DATABASE WideWorldImporters
TO URL = 's3://minio.example.net:9000/sql-2022-backups/wwi-part1.bak',URL = 's3://minio.example.net:9000/sql-2022-backups/wwi-part2.bak',URL = 's3://minio.example.net:9000/sql-2022-backups/wwi-part3.bak',URL = 's3://minio.example.net:9000/sql-2022-backups/wwi-part4.bak',URL = 's3://minio.example.net:9000/sql-2022-backups/wwi-part5.bak',URL = 's3://minio.example.net:9000/sql-2022-backups/wwi-part6.bak'
WITH FORMAT, COMPRESSION, MAXTRANSFERSIZE = 20971520;
成功完成后,查询将返回如下内容:
Processed 2032 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1.
Processed 324296 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1.
Processed 82130 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1.
Processed 43238 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1.
BACKUP DATABASE successfully processed 451696 pages in 67.187 seconds (52.523 MB/sec).Completion time: 2024-01-11T17:27:15.0091707-08:00
如您所见,在这种情况下,使用多个 URL 会减慢备份速度。
本地 SQL Server 2022 备份
性能和可靠性是决定灾难恢复工作成败的关键因素。SQL Server 2022 能够备份到对象存储并从对象存储还原,充分利用 MinIO 实现可扩展、快速且简单的备份存储。
MinIO 提供软件定义的备份目标,该目标操作简单,但性能高且可扩展。结果是,使用 MinIO 作为备份目标的 SQL Server 2022 客户实现了巨大的成本节约和本地备份的灵活性。
立即下载 MinIO,了解 SQL Server 2022 的对象存储集成。