问题
我们有一个带有 1TB 附加磁盘(在 Azure 上)的 Sql Server 2014,磁盘空间不足。我们还剩下大约 20GB(可能还有几周的空间)。因此,我们需要将一些数据从 CURRENT 磁盘移到 NEW 磁盘上。
细节
服务器:
Microsoft SQL Server 2014 - 12.0.2548.0 (X64)
Jun 8 2015 11:08:03
Copyright (c) Microsoft Corporation
Web Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
MS-SQL 2014 安装在经典Azure VM 上。此 VM 位于经典VNET 中。存储盘也很经典。因此,我们不能只扩展现有磁盘。MS-Support 表示,如果我们希望利用现代 Azure 存储允许调整磁盘大小、使用更新的 SSD 磁盘等,我们需要更新所有这些。TL;DR; 我们不能让这个离线几个小时,包括通过 IP 地址与 VM 通信的所有其他子系统。现在,不要把这变成一场盛大的狂欢......这是我们被赋予的工作,并且需要稍后解决所有这些问题。
所以现在,一个想法尝试和利用 FILEGROUPS 并将一个或多个表移动到 FILEGROUP 并将这个 FILEGROUP 推送到我们附加的另一个 DISK 上。
所以这里的问题是:
- 首先,这真的是一个非常疯狂和蹩脚的想法吗?
- 如果它是废话但没问题,那么使用 FILEGROUPS 实际上会将数据从当前磁盘移动到新磁盘(这会释放几乎已满的当前磁盘上的一些磁盘空间)?
- 如果这仍然可能,移动这些表是否意味着数据被锁定/不可用......这意味着仍然回到我们最初的问题:(
- 日志呢?移动这些数据意味着日志只是得到这个的副本?(我相信我们正在做每小时和每周的备份)。
如果数据很小也没关系,但这里快速浏览一下我们的一些表......
第一个表很大(相对于其余数据)。750GB左右。
我正在考虑在结果图像中移动第 4 行的第 2 行、第 3 行。还记得我说过的基础设施都是旧经典的东西吗?这意味着 HD 既旧又慢,因此复制数据也可能需要一些时间。
例如,我只是尝试将.mdf
's(此数据库有 1 个主 mdf 和 2 个其他小 mdf)从 OLD 复制到新磁盘。有一个 24 小时的快速 ETA。
让网站离线几个小时是完全可以接受的。当我们的客户睡着时,我们可以将东西离线。但是...... 24小时......那很痛。24 小时的想法是一个简单的测试:
- 创建新的 2TB 磁盘(如果可能)
- 关闭sql服务器。
- 将 mdf + 日志文件复制到新磁盘。(24小时左右)
- 将文件组从旧位置指向新位置
- 再次启动sql server。
现在,我们对想法持开放态度,我知道堆栈交换不是“意见”的网站,所以我试图通过建议的答案来保持目标并获得反馈......但我们是开放的其他解决方案以减少离线时间。
所以 - 任何人都可以帮忙吗?
更新 1
这是此数据库的当前文件的屏幕截图。
虽然它可以工作,但没有必要将表移动到新的文件组。
如果您只是将文件添加到数据库的现有文件组中,SQL Server 将开始使用新文件。
当文件组有多个文件时,SQL Server 使用“比例填充算法”。因此,如果您将新文件(可能在不同的卷上)添加到文件组,SQL Server 会将新数据写入该文件组,直到它与当前文件的填充百分比相同。
您将表移动到新文件组的想法应该可行。它将在移动期间使这些表脱机,但随后它们将再次可用于查询。您可以通过策略性地一次一个地执行它们来潜在地限制停机时间。
在这里,我将创建一个数据库,其中包含一个 1GB 的表:
你可以看到这个数据文件(在默认的主文件组上)大部分都是满的:
接下来,我将添加一个新文件组,并将一个文件添加到该组。请注意,您需要将 设置为
FILENAME
新磁盘上的路径。您还应该根据您希望移入其中的数据量适当调整其大小:现在,在 SSMS 中运行“磁盘使用情况”报告,我可以看到新文件大部分是空的:
现在我将在新文件组上重建表:
现在您可以看到主文件组大部分是空的,并且所有数据都已移动到新文件组: