Tüm Instance’lardaki Tüm Veritabanlarının Toplam Boyutu

13 Ara by NURULLAH ÇAKIR

Tüm Instance’lardaki Tüm Veritabanlarının Toplam Boyutu

Instance sayınız ve veritabanı sayınız arttığında tüm veritabanlarınızın toplam boyutunu bulmak biraz zorlaşabilir. Bazen yöneticiniz sql server veritabanlarının toplam boyutu hakkında sizden bilgi isteyebilirler. Böyle bir durumda eğer instance sayınız azsa ve high availability çözümlerinden birini kullanmıyorsanız aşağıdaki script’i kullanarak instance bazında tüm veritabanlarının toplam boyutunu bulabilirsiniz.

with fs
as
(
    select database_id, type, size * 8.0 / 1024/1024 size
    from sys.master_files
)
select
    name,
    (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) +
    (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) DBSizeGB
from sys.databases db
where (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) is not null
order by DBSizeGB desc

Mesela benim çalıştırdığım instance’da yukardaki script’in sonucunda 30 kayıt geldi. Ama unutmayalım bu script standalone ve always on’un secondary veritabanlarının hepsini içeriyor.

 

 

Bazı sistemlerde always on kullanan instance’ların içersinde always on’a dahil olmayan veritabanları da oluyor. Bu yüzden bu script’i hem primary hem de secondary instance’da çalıştırmanız gerekir. Böyle olduğunda da always on’a dahil veritabanlarının boyutunu 2 kere hesaplamış oluyorsunuz.

Script’i aşağıdaki şekle çevirince o instance üzerindeki aktif tüm veritabanlarının(always on’a dahil bir veritabanıysa primary olduğu takdirde listeye giriyor. Always On’a dahil olmayan(standalone) veritabanları da listeye giriyor.) isimleri ve büyüklüklerini listeliyor.

with fs
as
(
    select database_id, type, size * 8.0 / 1024/1024 size
    from sys.master_files where database_id IN
       (
       SELECT DISTINCT
DB_ID(dbcs.database_name) AS veritabaniid
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
   ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
   ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
   ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
   ON arstates.replica_id = dbcs.replica_id
LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
   ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id
WHERE ISNULL(arstates.role, 3) = 1
union all
select DB_ID(name) veritabaniid from sys.databases where replica_id is null and database_id >4
       )
)
select
    name,
    (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) +
    (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) DBSizeGB
from sys.databases db
where (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) is not null
order by DBSizeGB desc

Yukardaki script kısmen işimizi görür. Elimizde bütün instance’larda (içinde always on’a dahil olan veritabanı olsun olmasın) bu script’i çalıştırıp tüm veritabanlarının boyutunu toplayabiliriz. Yukardaki script’in çalışması sonucundaki ekran görüntüsünü aşağıda bulabilirsiniz. Gördüğünüz gibi 12 kayıt geldi. Demekki 30 veritabanından 18 tanesi ya always on’un secondary veritabanıymış ya da sistem veritabanıymış(bu script’te sistem veritabanlarını da çıkarıyoruz) Bu script’i always on kullanan instance’larda hem primary hem de secondary instance’da çalıştırıp çıkan sonucu toplamalısınız.

İşimizi biraz daha kolaylaştıralım. O instance üzerindeki veritabanlarını manual olarak toplamak yerine bir cursor içersinde döndürerek sql server’a toplattıralım. Aşağıdaki script yardımıyla da bir instance üzerindeki tüm veritabanlarının(always on’a dahil bir veritabanıysa primary olduğu takdirde listeye giriyor. Always On’a dahil olmayan(standalone) veritabanları da listeye giriyor.) toplam boyutunu veriyor.

DECLARE @size int
DECLARE @totalsize int
set @totalsize=0
DECLARE db_cursor CURSOR FOR 
with fs
as
(
    select database_id, type, size * 8.0 / 1024/1024 size
    from sys.master_files where database_id IN
       (
       SELECT DISTINCT
DB_ID(dbcs.database_name) AS veritabaniid
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
   ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
   ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
   ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
   ON arstates.replica_id = dbcs.replica_id
LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
   ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id
WHERE ISNULL(arstates.role, 3) = 1
union all
select DB_ID(name) veritabaniid from sys.databases where replica_id is null and database_id >4
       )
)
select    
    (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) +
    (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) DBSizeGB
from sys.databases db
where (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) is not null
order by DBSizeGB desc
OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @size  
WHILE @@FETCH_STATUS = 0  
BEGIN  
       SET @totalsize= @totalsize+@size
       FETCH NEXT FROM db_cursor INTO @size  
END  
CLOSE db_cursor  
DEALLOCATE db_cursor
select @totalsize

Yukardaki script’in sonucunun ekran çıktısınıda aşağıdaki ekran görüntüsünde görebilirsiniz. Bir önceki script’te çıkan sonuçları toplayarak o instance üzerindeki toplam boyutu GB türünden veriyor.

Peki benim birden fazla 10 tane ya da daha fazla instance’ım varsa tek tek bu instance’lara bağlanarak bu script’i çalıştırmam mı gerekiyor?

 

Hayır. Bütün instance’larınızı Registered Servers’a kaydererek tek bir seferde hepsi için hesaplatabilirsiniz. Registered Servers ile ilgili detaylara “Registered Server ile Birden Fazla Instance Üzerinde Aynı Script’i Çalıştırmak” isimli makalemden ulaşabilirsiniz.

 

Registered Servers’a aşağıdaki gibi sağ tıklayarak new query diyerek yukardaki sorguyu çalıştırdığınızda tek bir seferde tüm instance’larınızdaki veritabanı boyutlarınızın toplamını bulabilirsiniz. Tabi bu sorguyu registered server ile çalıştırdığınız da registered server’ınızda kaç tane instance varsa o kadar satır dönecektir. O satırların hepsini toplayarak toplam veritabanı boyutunuzu bulabilirsiniz.

 

Loading

Bir yanıt yazın

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