AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 257236
Accepted
Pure.Krome
Pure.Krome
Asked: 2020-01-13 21:58:54 +0800 CST2020-01-13 21:58:54 +0800 CST 2020-01-13 21:58:54 +0800 CST

MS SQL 磁盘空间不足 - 可以使用 FileGroups 来释放一些空间吗?

  • 772

问题

我们有一个带有 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

这是此数据库的当前文件的屏幕截图。

在此处输入图像描述

disk-space sql-server-2014
  • 2 2 个回答
  • 775 Views

2 个回答

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2020-01-14T10:02:24+08:002020-01-14T10:02:24+08:00

    虽然它可以工作,但没有必要将表移动到新的文件组。

    如果您只是将文件添加到数据库的现有文件组中,SQL Server 将开始使用新文件。

    当文件组有多个文件时,SQL Server 使用“比例填充算法”。因此,如果您将新文件(可能在不同的卷上)添加到文件组,SQL Server 会将新数据写入该文件组,直到它与当前文件的填充百分比相同。

    • 2
  2. Josh Darnell
    2020-01-14T09:02:01+08:002020-01-14T09:02:01+08:00

    您将表移动到新文件组的想法应该可行。它将在移动期间使这些表脱机,但随后它们将再次可用于查询。您可以通过策略性地一次一个地执行它们来潜在地限制停机时间。

    请注意,如果您使用的是 Enterprise Edition,则可以利用此版本的ONLINE索引操作版本来保持表可用于查询。由于您使用的是网络版,所以这不是一个选项。

    在这里,我将创建一个数据库,其中包含一个 1GB 的表:

    USE [master];
    GO
    CREATE DATABASE [257236];
    GO
    USE [257236];
    GO
    
    CREATE TABLE dbo.OneGigTable
    (
        Id int IDENTITY(1,1) NOT NULL,
        [BigColumn] nvarchar(max) NOT NULL,
    
        CONSTRAINT PK_OneGigTable PRIMARY KEY (Id)
    );
    GO
    
    INSERT INTO dbo.OneGigTable
    SELECT TOP (16777216) 
        N'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
    FROM master.dbo.spt_values v1
    CROSS JOIN master.dbo.spt_values v2
    CROSS JOIN master.dbo.spt_values v3;
    GO
    

    你可以看到这个数据文件(在默认的主文件组上)大部分都是满的:

    SSMS 中磁盘使用情况报告的屏幕截图

    接下来,我将添加一个新文件组,并将一个文件添加到该组。请注意,您需要将 设置为FILENAME新磁盘上的路径。您还应该根据您希望移入其中的数据量适当调整其大小:

    ALTER DATABASE [257236]
    ADD FILEGROUP NewFileGroup;
    GO
    
    ALTER DATABASE [257236]
    ADD FILE
    (
        NAME = NewFile_1,
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\NewFile_1.ndf',
        SIZE = 1024MB
    )
    TO FILEGROUP NewFileGroup;
    GO
    

    现在,在 SSMS 中运行“磁盘使用情况”报告,我可以看到新文件大部分是空的:

    在此处输入图像描述

    现在我将在新文件组上重建表:

    CREATE UNIQUE CLUSTERED INDEX PK_OneGigTable
    ON dbo.OneGigTable (Id)
    WITH (DROP_EXISTING = ON)
    ON NewFileGroup;
    

    现在您可以看到主文件组大部分是空的,并且所有数据都已移动到新文件组:

    SSMS 磁盘使用报告截图

    • 1

相关问题

  • 测量 PostgreSQL 表行的大小

  • 什么时候可以收缩数据库?

  • 了解块大小

  • PostgreSQL:查询全局表空间的位置?

  • 为什么一个表的数据空间可能会占用原始数据大小的 4 倍?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve