将 SQL Server 2022 数据库备份到 MinIO

微软在 SQL Server 2022 中添加了 S3 连接器和 Polybase,实现了重大飞跃。因此,企业可以利用存储在对象存储中的海量数据来丰富 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 交互的方式
确保 SQL Server 正在运行,并使用上述任一工具连接到它。
为了确保一切正常安装,请运行以下查询以获取 SQL Server 版本、版本和产品级别,如下所示。
SELECT SERVERPROPERTY('Edition') AS SQLEdition,
SERVERPROPERTY('ProductVersion') AS ProductVersion,
SERVERPROPERTY('ProductLevel') AS ProductLevel;
部署和配置 MinIO
如果您尚未运行它,请在 裸机、Docker 或 Kubernetes 上安装 MinIO。
MinIO 客户端 (mc) 是访问 MinIO 服务器所必需的。以下是如何 在本地安装 mc。
记下您第一次运行 MinIO 服务器时显示的凭据和 S3 终结点,因为您需要它们来配置 SQL Server 的外部数据源。
创建 MinIO 存储桶
使用上一步中提供的管理员凭据、IP 地址和端口,通过 Web 浏览器登录 MinIO。
登录后,单击“创建存储桶”,并将存储桶命名为 sql-2022-backups
。确保启用版本控制。
重复上述步骤,创建另一个名为 sql-2022-archives
的存储桶。
配置 IAM 存储桶策略
创建一个 身份和访问管理 (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"
}
]
}
创建访问密钥
创建访问密钥并附加上一步中创建的 IAM 策略。您将创建一个名为 sql-2022-backups-user
的密钥。
从左侧菜单中,单击“访问密钥”,并创建一个新密钥。记下访问密钥和密钥 (单击眼睛图标以显示密钥)。
启用“限制超出用户策略”,然后将以下 JSON 复制并粘贴到策略编辑器窗口中。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::sql-2022-backups*/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::sql-2022-backups*/*"
]
}
]
}
创建 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) 示例数据库。请参阅 使用 SQL Server 2022 数据湖仓储进行数据科学和 AI 获取下载和安装 WWI 数据库的说明,以及 Microsoft SQL 的 Wide World Importers 示例数据库 以获取更多信息。
T-SQL BACKUP DATABASE
命令需要多个参数
- TO URL = xxx 存储桶和备份文件的完整路径
- WITH FORMAT 允许覆盖现有的备份文件。如果没有此参数,如果文件已存在,则备份将失败。在存储桶上启用版本控制后,文件将受到保护,不会被删除
- COMPRESSION 启用 SQL Server 压缩 以创建和发送尽可能小的备份文件
- MAXTRANSFERSIZE=20971520 (20 MB) 定义多部分上传中最大备份文件的大小(以字节为单位)。
BACKUP DATABASE WideWorldImporters
TO URL = 's3://<your-minio-server>:9000/sql-2022-backups/WideWorldImporters.bak'
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 版本控制获得。
运行上述备份命令两次。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 的术语中,还原是指将备份中的数据和日志复制到数据库的过程,而恢复是指将数据库恢复到稳定、一致且可用的状态。
在本示例中,我们将介绍完整的数据库备份和还原。这是最基本的备份策略。可以还原和恢复完整的数据库备份。但是,可能需要还原完整的数据库,然后还原差异备份。
还原数据库与备份数据库一样简单。数据库引擎通过在数据库还原期间执行三个步骤来保证整个数据库可用且逻辑一致
- 如果数据库不存在,则创建数据库和事务日志
- 将备份中的所有数据、日志和索引页复制到数据库文件
- 应用事务日志以进行恢复
还原数据库时,您有两个选择
- RESTORE…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 示例策略,使用源集群的别名,并确保分配安全的密钥。
wget -O - https://min-io.cn/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 --insecure
Added remote tier ARCHIVE of type minio
创建并应用迁移规则。您将指定源集群和存储桶、要迁移到的层以及迁移规则。以下命令创建一个策略,将比 10 天更旧的所有非当前版本的备份迁移到您刚刚创建的层。
mc ilm rule add myminio/sql-2022-backups --noncurrent-transition-days 10 --noncurrent-transition-tier ARCHIVE
Lifecycle 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
微软指出,您可以通过将备份条带化到多个对象中并使用多个 URL 并行写入来提高性能。您可以使用多达 64 个 URL,每个 URL 等于一个备份的一部分。目前,单个备份文件的大小限制为 100 GB;如果要备份的数据库超过 100 GB,则需要使用多个 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 的对象存储集成。如有任何问题,请随时联系我们 Slack。