web-dev-qa-db-ja.com

MS SQLでディスク領域が不足しています-ファイルグループを使用して領域を解放できますか?

問題

1TBのディスクが接続された(Azure上の)SQL Server 2014があり、ディスク領域が不足しています。残りは約20GBです(おそらく数週間分の空き容量があります)。したがって、現在のディスクから新しいディスクにデータを移動する必要があります。

細部

サーバー

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はclassicAzure VMにインストールされます。このVMはclassicVNETにあります。ストレージDISKSもclassicです。 MS-Supportは、最新のAzure Storageを利用してディスクのサイズ変更や新しいSSDディスクの使用などを可能にする場合は、これらすべてを更新する必要があるとMS-Supportは言いました。TL; DR; IPアドレスを介してVMと通信する他のすべてのサブシステムを含めて、これを数時間オフラインにすることはできません。これをフレームフェストにしないでください。これがで動作するように与えられており、後でこれをすべて修正する必要があります。

だから今、何を試してFILEGROUPSを活用し、1つ以上のテーブルをFILEGROUPに移動し、このFILEGROUPを、アタッチした別のDISKにプッシュするかというアイデア。

したがって、ここでの質問は次のとおりです。

  • まず、これは本当にクレイジーでラメなアイデアですか?
  • がらくたでも大丈夫な場合、FILEGROUPSを使用すると、実際にデータが現在のディスクから新しいディスクに移動します(これにより、ほぼ完全な現在のディスクのディスク領域が解放されます)。
  • これがまだ可能である場合、これらのテーブルを移動することは、データがロックされている/利用できないことを意味しますか?これは、最初の問題に戻ったことを意味します
  • ログはどうですか?このデータを移動すると、ログはこのコピーを取得するだけですか? (私たちは時間ごとと週ごとのバックアップを行っていると思います)。

データが小さければ問題ありませんが、ここにいくつかのテーブルを簡単に見てみましょう...

enter image description here

その最初のテーブルは巨大です(残りのデータに関して)。 750GB ish。

結果の画像で、4行目の2行目、3行目を移動することを考えていました。インフラストラクチャはすべてOLDクラシックのものにあると私が言った方法を覚えていますか?つまり、HDは古くて遅いため、データのコピーにも時間がかかる可能性があります。

例として、.mdf(このDBには1つのメインmdfと2つの他の小さなmdfがある)を古いディスクから新しいディスクにコピーしようとしました。 24時間という短いETAがありました。

サイトを数時間オフラインにしてもまったく問題ありません。私たちは、お客様が眠っているときに、物をオフラインにすることができます。しかし... 24時間..痛いです。 24時間のアイデアは、以下の簡単なテストでした。

  • 新しい2TBディスクを作成(可能な場合)
  • sQLサーバーをオフにします。
  • mdf +ログファイルを新しいディスクにコピーします。 (24時間程度)
  • ファイルグループを古い​​場所から新しい場所にポイントする
  • sQLサーバーを再起動します。

現在、私たちはアイデアを受け入れており、スタック交換は「意見」のサイトではないことを知っているので、これを提案された回答でターゲットに保ち、それについてフィードバックを得ようとしています...しかし、私たちはオープンですオフライン時間を短縮する他のソリューションに。

だから-誰か助けてくれますか?

アップデート1

これは、このDBの現在のファイルのスクリーンショットです。

enter image description here

2
Pure.Krome

機能しますが、テーブルを新しいファイルグループに移動する必要はありません。

データベースの既存のファイルグループにファイルを追加するだけで、SQL Serverは新しいファイルの使用を開始します。

SQL Serverは、ファイルグループに複数のファイルがある場合、「比例充填アルゴリズム」を使用します。したがって、新しいファイルを(おそらく別のボリューム上に)ファイルグループに追加すると、SQL Serverは、現在のファイルと同じ割合でいっぱいになるまで、そのファイルグループに新しいデータを書き込みます。

テーブルを新しいファイルグループに移動するという考えは機能するはずです。 moveの間、これらのテーブルをオフラインにしますが、クエリで再び使用できるようになります。戦略的に一度に1つずつ行うことで、ダウンタイムを制限することができます。

Enterprise Editionを使用している場合は、これのONLINEインデックス操作バージョンを利用して、クエリでテーブルを使用できるようにすることができます。 Web Editionを使用しているため、これはオプションではありません。

ここでは、1 GBのテーブルを含むデータベースを作成します。

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

そして、このデータファイル(デフォルトでは、プライマリファイルグループ)がほぼいっぱいであることがわかります。

screenshot of disk usage report in 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で「ディスク使用量」レポートを実行すると、新しいファイルがほとんど空であることがわかります。

enter image description here

次に、テーブルを新しいファイルグループに再構築します。

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

これで、プライマリファイルグループがほとんど空になり、すべてのデータが新しいファイルグループに移動したことがわかります。

screenshot of SSMS disk usage report

1
Josh Darnell