MSSQL Server Dataları Yeni FileGroup Üzerinde Büyütme

Bu makalede mevcut filegroup üzerinde büyüyen bir veritabanının başka bir file group üzerinde büyüme işlemini ele almış olacağız. Şimdi uygulamalı bir şekilde işlemlerimize başlayalım.

Aşağıdaki komut İlgili filegroup’un yüzde kaç boş olduğunu hakkında bilgi vermektedir.

SELECT
FILEGROUP_NAME(data_space_id) as FilegroupName,
SUM(size/128.0) AS CurrentSizeMB, 
SUM(size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0) AS FreeSpaceMB,
(
    SUM(size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0) / -- FreeSpaceMB
    (SUM(size/128.0))  -- CurrentSizeMB
    * 100 -- Convert to percentage
) AS FilegroupPercentFree,
COUNT(*) as NumberOfFilesInFilegroup
FROM sys.database_files
WHERE data_space_id <> 0
GROUP BY FILEGROUP_NAME(data_space_id);

Verilerimiz FG2024’e gelmektedir. Bakalım gerçekten FG2024’denmi büyüyor. İçerisine veriler kaydettikten sonra  yukarıdaki komutu çalıştırarak FG2024 filegroup’un büyüdüğünü görmüş oluyoruz. Dikkat ederseniz FreeSpaceMB alanı değişmektedir.

Şimdi ise filegroup’lardaki autogrowth değerini disable ediyorum. İlgili filegroup’u disable etmeden kullanıcıların sadece okuma işlemi yapması için read-only moduna alıyorum.

Not: Backup işlemlerinde disk tasarrufu ve partition işlemlerinde ilgili filegroup’a veri yazılmayacağı için read only moda alırız.

İlk başta verimizin büyüdüğü FG2024 filegroup’u read-only moda alalım.

Filegroup’ların  en son görüntüsü aşağıda gösterilmektedir.

Tekrar yukarıdaki komutla kontrol ettiğimde ilgili filegroup’larda verilerin insert edildiğini ve ne kadar alan kaldığını görebiliyoruz. Bazı değerlere dikkat edersek veritabanımız Primary file group üzerinde büyümektedir. Sebebi herhangi bir nesnenin önceden oluşturulmuş olan primary file group üzerinde oluşturulmasıdır.

Burada aktif olan filegroup’lar FG2024 ve PRIMARY diğer filegroup’larımız boş bir şekilde durmaktadır.

Veritabanı üzerine sağ tıklayıp properties ekranından data file bölümüne girilir.

Burada hangi file group’un pasif edilmesi için aşağıdaki Autogrowth/Maxsize kısmının  sağında bulunan 3 noktaya tıklanır.

PRIMARY filegroup’u disable yapacağımız için  ilgili ilk satırdaki 3 noktaya tıklanır.

Gelen ekranda aktif olan filegroup’u disable hale çekeriz. Burada amacımız şu kapandığı zaman ilgili filegroup veri geldiğinde hangi filegroup üzerinde büyüyecek.

None yaptıktan sonra Ok deyip işlemlerimi tamamlıyorum.

En son filegroup’ların kapladığı alan ve  boş alanı aşağıdaki resimde görülmektedir.

Şimdi primary filegroup olan tabloya 10000 kayıt atıyorum. Bakalım hangi filegroup büyüme işlemi yapacak.

Büyüme işlemine  ilgili filegroup’u kapatmama rağmen büyümeye devam etti. En son PRIMARY file group’un veritabanı için tahsis ettiği Allocated alanı kadar ondan sonra ilgili filegroup üzerinde bir işlem yapılmadı tekrar dan autogrowth’u enable yapıp yeni veri insert edince işletim sisteminden  10 MB alan tahsis etmiş oldu. Aşağıdaki resimlerde boyutunun 18 MB’a çıktığını görmüş oluyoruz.

Not: Bir tablo’nun bağlı olduğu filegroup Enable Autogrowth değeri disable yapılırsa tablo Allocated ettiği Size değeri kadar büyür ama autogrowth’u none olduğu için işletim siteminden yeni alan alamaz. Hata mesajı üretmektedir. KENDİ FILEGROUP’u DISINDA BASKA BIR FILE GROUP’DA BUYUMEZ TABLOMUZ.

İlgili tablonun filegroup’u None olsa bile tabloya select çektiğimizde veriler gelmektedir.

Veritabanı üzerinde sağ tıklayarak properties diyoruz ve filegroups sekmesine gelip aşağıdaki gibi istediğimiz filegroup’u read-only mode’a alıyoruz.

 Yukarıdaki işlemin script’ini alıp çalıştırmak istediğimde hata mesajıyla karşılaştım.

Bu hatayı almamak için ilgili arayüzün script’ini aldığımızda sadece yapmamız gereken veritabanını single user moda almak. Eklenecek kod bloğu:

ALTER DATABASE [FILEGROUP] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
USE [FILEGROUP]
GO
ALTER DATABASE [FILEGROUP] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
declare @readonly bit
SELECT @readonly=convert(bit, (status & 0x08)) FROM sysfilegroups WHERE groupname=N'FG2024'
if(@readonly=0)
ALTER DATABASE [FILEGROUP] MODIFY FILEGROUP [FG2024] READONLY
GO
USE [master]
GO
declare @readonly bit
SELECT @readonly=convert(bit, (status & 0x08)) FROM sysfilegroups WHERE groupname=N'FG2024'
if(@readonly=0)
ALTER DATABASE [FILEGROUP] MODIFY FILEGROUP [FG2024] READONLY
GO

İlgili veritabanı üzerinde bulunan kullanıcılar disable moduna alınırsa veritabanında read only modu rahatlıkla değiştirebiliriz.

Artık ilgili filegroup’u read-only mod da kullanabiliriz. Yeni bir tablo oluşturduğumuz zaman read only olan  filegroup’a  tablo üzerinde oluşturmak istersek hata mesajıyla karşılaşırız. Read only filegrouplar yeni oluşturulan herhangi bir eylem üzerinde yetki verilemez.

Aşağıdaki komut ile veritabanı altında belirtilen  tablonun hangi filegroup’a bağlı olduğunu görebiliriz.

Not:select into New_Table from OLD_TABLE” bu komut ile yeni oluşturacağımız tablo içerisine  var olan tablodaki verileri atabiliriz.

Yeni oluşturulan tablonun  yeni bir filegroup üzerinde büyütebiliriz. Sql server 2017 den itibaren gelmiştir.

SELECT *  INTO [dbo].[yenitablo] ON FG2 from [dbo].[aktarilacaktablo] 

Hangi tablo’nun hangi Filegroupaltında olduğunu bulan script:

use FILEGROUP
  go
  SELECT OBJECT_NAME(t.object_id) AS [Table Name], d.name AS [Filegroup Name]  FROM sys.data_spaces d 
  JOIN sys.indexes i on i.data_space_id = d.data_space_id
  JOIN sys.tables t on t.object_id = i.object_id
  WHERE i.index_id<2
  AND t.type = 'U'
  AND OBJECT_NAME(t.object_id) ='TABLEE'

Bir diğer komut ise veritabanı altında bulunan tablolardan hangi tablonun hangi file group’a ait olduğunu bulan script:

SELECT 
    s.name AS SchemaName,
    o.name AS TableName,
    i.name AS IndexName,
    i.type_desc AS IndexType,
    fg.name AS FilegroupName
FROM 
    sys.indexes i
INNER JOIN 
    sys.objects o ON i.object_id = o.object_id
INNER JOIN 
    sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN 
    sys.data_spaces ds ON i.data_space_id = ds.data_space_id
LEFT JOIN 
    sys.filegroups fg ON ds.data_space_id = fg.data_space_id
WHERE 
    o.type = 'U' -- Yalnızca user tabloları
ORDER BY 
    fg.name, s.name, o.name, i.name;

Bu makalede görmüş olduğumuz işlem şu aslında veritabanı primary filegroup üzerinde büyür. Primary filegroup disable edilirse veritabanı yeni filegroup üzerinde otomatik büyümez. Ancak biz kendimiz yeni filegroup altında bir tablo oluştursak oluşan bu tablo yeni filegroup altında büyümektedir. Ayrıca yeni filegroup’un default file group olarak seçilmesi gerekmektedir. Read-only  Autogrowth değeri None yapılmış filegroupların okunabilir olduğunu yukarıda görmüş olduk.

Bu makalede Filegroup yapısında read_only ifadesini veritabanının yeni filegroup altında nasıl büyümesi gerektiğini görmüş olduk.

Başka bir makalede görüşmek dileğiyle..

“Allah, gökten su indirir de onunla ölümünden, kuruyup katılaştıktan sonra yeryüzünü diriltir. Elbette bunda gerçeğe kulak verecek bir toplum için açık bir işaret ve mühim bir ders vardır.” Nahl-65

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir