9 Mart 2014 Pazar

DMV: sys.dm_db_persisted_sku_features

Bazı projelerde veya senaryolarda bazı veritabanlarını değişik SQL Server Edition'ları arasında taşımamız gerekiyor. Örneğin bazı kurumlarda bilinçsiz bir şekilde SQL Server Evaluation Edition, Enterprise Edition veya Datacenter Edition (2008 R2) Instance'ları kurulmuş olabiliyor. Bu sistemleri incelediğimizde ve ilgili yöneticilere bu konuda bilgi verdiğimizde, lisans maliyetlerini duyduklarında "bizim buna ihtiyacımız yok, daha düşük bir Edition da kullanabiliriz eğer işimizi görecekse" diyebiliyorlar. Çünkü Enterprise Edition ile örneğin Standard Edition arasındaki lisans maliyetleri arasında çok fark var ve bazı şirketler için bu farkı her ay gereksiz bir yere ödemek mantıksız geliyor, haklı olarak...

Böyle durumlarda, yani daha yüksek seviyedeki bir Edition'daki bir Instance'tan daha düşük seviyedeki bir Edition'daki Instance'a veritabanı taşıyacakken dikkat etmemiz gereken çok kritik bir konu var. Taşıyacağımız veritabanında sadece yüksek seviyedeki bir Edition'da kullanılabilecek bir özellik kullanılmışsa, bu veritabanını bu haliyle daha düşük bir seviyedeki bir Edition'a taşıyamayız. Bir örnekle devam edelim.

Örneğin ISTANBUL\Marketim isimli bir SQL Server 2012 Enterprise Edition Instance'ımızdaki Table Partitioning özelliğini de barındıran Arsiv_2013 isimli veritabanımızı bir başka SQL Server 2012 Standard Edition Instance'ımıza taşıyamayız. Çünkü Table Partitioning sadece Enterprise Edition'larda olan bir özelliktir ve Standard Edition'larda bu özellik kullanılamamaktadır.

SQL Server bize bunu, Database Restore'un bitirilme, yani Database Recovery aşamasında bildirecektir. Yani siz ilgili veritabanının, yine örneğimiz üstünden gidersek Enterprise Edition Instance'ından yedeğini alırsınız ve hedef SQL Server Instance'ında Restore etmeye de başlayabilirsiniz. Recovery aşamasına kadar sorun da çıkmaz, fakat Recovery aşamasında SQL Server, veritabanının herhangi bir üst Edition özelliği taşıyıp taşımadığına bakar ve eğer böyle bir şey varsa, o zaman Restore'unuz hata verir ve tamamlanamaz.

Bu kontrolü en son aşamada yapmasının nedeni ise, örneğin bir Enterprise Edition özelliğini Database Backup aldıktan sonra yapabileceğiniz gerçeğidir. Şöyle düşünün, bir Enterprise Edition, Evaluation Edition veya Developer Edition Instance'ında bir veritabanı oluşturuyorsunuz, bunun Full Database Backup'ını alıyorsunuz, sonra bir tablodaki veriyi sıkıştırıyorsunuz (ki bu da Enterprise Edition özelliğidir) ve sonra bu değişikliği de barındıracak bir Transaction Log yedeği alıyorsunuz. Bu Full Database Backup'ı hedef Standard Edition Instance'ınıza NORECOVERY modunda Restore ettiğinizde, henüz Recovery işlemi tamamlanmadığından sorun olmayacaktır; o son aldığınız Transaction Log yedeğini de NORECOVERY modunda Restore ettiğinizde yine hata almazsınız, çünkü veritabanı hala Recovery işlemini yapmadı; fakat veritabanını RESTORE DATABASE dba_test komutuyla Recover etmeye kalktığınız anda aşağıdaki hataları alacaksınız.


Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
Msg 909, Level 21, State 1, Line 1
Database 'dba_test' cannot be started in this edition of SQL Server because part or all of object 'table_adi' is enabled with data compression or vardecimal storage format. Data compression and vardecimal storage format are only supported on SQL Server Enterprise Edition.
Msg 933, Level 21, State 1, Line 1
Database 'dba_test' cannot be started because some of the database functionality is not available in the current edition of SQL Server.


İşte böyle bir senaryoda, yani bir üst Edition'dan alt bir Edition'a veritabanı taşıma işiniz olduğunda, özellikle de boyut olarak büyük veritabanlarında, taşıma işlemi öncesinde ilgili veritabanlarını sys.dm_db_persisted_sku_features isimli DMV ile sorgulamanızda fayda var. Bu DMV size, diğer Edition'larda olmayıp ilgili veritabanında kullanılmış olan özellikleri raporlayacaktır. Bu sayede, özellikle de gerçekten aktif olarak kullanmadığınız bir özellik varsa, bu özelliği kapatıp taşıma işleminizi  başarıyla gerçekleştirebilirsiniz. Eğer gerçekten vazgeçemeyeceğiniz bir özellik mevzu bahis ise de, o zaman ilgili yöneticilerle bunu masaya yatırmanız gerekecek.

Örnek sorgu:
SELECT * FROM sys.dm_db_persisted_sku_features

Ekrem Önsoy

Hiç yorum yok: