Müşterimin SQL sunucusunda çok sayıda veritabanı var. Bu veritabanları geliştirilme aşamasındadır, bu nedenle geliştiriciler tasarlayabilir, yeniden düzenleyebilir, veri değişiklikleri yapabilir vb. Nadiren değişen bazı veritabanları vardır. Müşterim hepsini güvende tutmak (yedeklemek) ve çevreyi yönetmek için biraz zaman harcamak zorunda. (Şirkette DB yöneticisi konumu yoktur.) Uzun süren tartışmalardan sonra, müşteri geri yükleme kolaylığı nedeniyle günlük tam yedekleme stratejisi kullanmaya karar verdi.
İşte durumun özeti:
- Veritabanı sayısı her gün değişebilir.
- Değiştirilen veritabanları (yani veriler ve / veya yapı değiştirilmiştir) yedeklenecektir.
- Değiştirilmeyen veritabanları yedeklenmeyecektir.
- Çözüm veritabanı yapısını etkilemeyecektir (kısıtlı bir gereklilik değildir)
- Bu "yedek motor" otomatik olarak çalışacaktır.
Ana sorun: bir veritabanının değiştirildiğini algılama. Sorunun ilk kısmı (DDL değişiklikleri) DDL tetikleyicileri kullanılarak çözülebilir . Ancak veri değişiklikleri (DML değişiklikleri) bir sorundur. Değişiklikleri (performans, genişletilmiş nesnelerin yönetimi ...) izlemek için tüm veritabanlarının tüm tablolarına DML tetikleyicileri uygulamak imkansızdır. Yedekleme altyapısı, her veritabanını yedeklemeye hazır olarak işaretlemek için tüm değişiklikleri izlemelidir.
Veri Yakalama Değiştir bir çözümdür ama çok ağır görünüyor (SQL Server Enterprise Edition da gerektirir).
Başka bir yol, veritabanı dosyası değişikliklerini (boyut veya son değişiklik zamanı) izlemektir, ancak düzgün çalışmaz: Bir veritabanı, ayrılmış tüm boş alanı aştığında ve sp_spaceused bir çözüm olmadığında boyutunu değiştirebilir .
İzleme bir çözümdür, ancak performans sorunlarına neden olur ve ek yönetim gerektirir.
Diğer veritabanı yönetimi nesnelerini (istatistikler gibi) etkilemeden gerçek veritabanı kullanım boyutunu hesaplamak için herhangi bir çözüm var mı? Bir tablonun verilerinde tablonun boyutunu değiştirmeyen bir değişikliğin tetiklenmeyeceğini (sanırım), ama hiç yoktan iyidir. Gerçekten SQL Server 2008 için doğrudan veya dolaylı bir çözüm arıyorum.
Yorumlarınız, çözümleriniz ve düşünceleriniz için teşekkür ederiz.
KATMA:
İşte çözüm ( Marian sayesinde ):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)