4 Mayıs 2017 Perşembe

Bir Cumulative Update kazası

Bu sıralar bir müşterimin canlı veritabanı sunucusu için SQL Server 2012'den SQL Server 2016'ya sürüm yükseltme çalışmaları yapıyorum. Bu çalışmalar sırasında geçen sene de karşılaştığım, ama hakkında yazı yazamadığım bir sorun ile tekrar karşılaştım. Bu sefer bu sorunu günlüğüme kaydediyorum.

Bu çalışma kapsamında yeni bir Windows Server 2016 kurulumu ve üstüne de SQL Server 2016 kurulumu yaptık. Müşterim SQL Server Standard Edition kullandığı için, SQL Server 2016 Service Pack 1 ile gelen birçok Enterprise Edition özelliğinden faydalanabileceği gibi SQL Server 2016 ile gelen yeniliklerden de faydalanabilecek. Bu ortamdaki en büyük maliyet disklerden kaynaklanıyor. Bu sürüm yükseltme çalışmasıyla Data Compression ve Columnstore indeksler ile müşterimin disk maliyetlerini ciddi oranda düşürmeyi ve aynı zamanda performansın iyileşmesini hedefliyorum. Ayrıca dahili ve harici denetim firmaları hassas verilerin maskelenmesini ve nesne düzeyinde kayıt tutulmasını talep ediyor; Dynamic Data Masking ile verilerin maskelenmesini ve Database Level Auditing ile de nesne düzeyinde kayıt tutulmasını sağlayacağız. Tüm bu ihtiyaçlar ekstra bir ürün alıp hem karmaşaya hem de ekstra maliyete neden olmadan sağlanmış olacak.

Windows Server 2016'yı, SQL Server 2016'yı ve Service Pack 1'i kurduktan sonra en son Cumulative Update'i de kurarken, kurulumun sonunda gereğinden uzun süre bekleyince bir sorunun olduğunu anlamıştım. Tabii ki bekledim ve ardından beni bekleyen hata mesajıyla karşılaştım:


Cumulative Update (KB4013106) kurulumunda oluşan hata mesajı
Başlatılamayan tek servis "SQLSERVERAGENT" değildi, "MSSQLSERVER" yani Database Engine servisi de "Change Pending" durumunda kalmıştı. Windows Event Log'larını ve SQL Server Error Log'larını inceledim, şu mesajlar vardı:

"Script level upgrade for database 'master' failed because upgrade step 'msdb110_upgrade.sql' encountered error 226, state 6, severity 16. This is a serious error condition which might interfere with regular operation and the database will be taken offline. If the error happened during upgrade of the 'master' database, it will prevent the entire SQL Server instance from starting. Examine the previous errorlog entries for errors, take the appropriate corrective actions and re-start the database so that the script upgrade steps run to completion."

"Cannot recover the master database. SQL Server is unable to run. Restore master from a full backup, repair it, or rebuild it. For more information about how to rebuild the master database, see SQL Server Books Online."

Nasıl, mesajlar yeterince korkutucu mu? Bu sefer bu sorun ile yeni, geçiş sunucusunda karşılaştım; ama geçen sene bu sorunla karşılaştığımda ortam canlı ortamdı. Benzer hataları bir de canlı bir ortamda aldığınızı düşünün...

SQL Error Log'da aşağıdaki mesaj öbeğine odaklandım:


SQL Server Error Log'tan bir görüntü

Mesajlardan da görebileceğiniz üzere haliyle önce replikasyondan şüphelendim, bu sunucuda 70 küsur veritabanı var ve canlıda 2 tanesi Transactional Replication ile raporlama sunucusuna replike ediliyor. Önce bu 2 veritabanındaki replikasyon artıklarını kaldırmayı düşündüm ve bunu yapmam için de [sp_removedbreplication] sistem SP'sini çalıştırmam gerekiyor, ama Database Engine servisi hiç açılmıyor, bunu nasıl yapacağım?

Neyse ki böyle durumlarda kullanabileceğimiz bir Trace Flag var, T902. Database Engine servisini Trace Flag 902 ile başlatırsanız, Service Pack veya Cumulative Update Script'leri servis açılışında çalıştırılmaz ve böylece Database Engine servisiniz açılabilir. Ben de böyle yaptım ve Database Engine servisini T902 ile çalıştırdım ve ardından ilgili 2 veritabanı için [sp_removedbreplication] komutunu çalıştırıp veritabanlarındaki replikasyon artıklarını temizledim ve Database Engine servisini T902'siz çalıştırdım. Maalesef sorun çözülmemişti.

Not: Unutmayın, Trace Flag'leri bilinçli bir şekilde kullanmalısınız. Örneğin Trace Flag 902 sadece böyle bir durumda ve geçici olarak kullanılmalıdır. Canlı ortamınızı sürekli Trace Flag 902 çalıştırmamalısınız.

Bu sefer hata mesajının oluştuğu silsileye odaklandım ve tam olarak her seferinde Upgrade Script'inin belli bir veritabanı adından sonra hata aldığını fark ettim. Bu veritabanı da önceden replike ediliyordu, ama uzun süre önce ilgili arkadaşların talebiyle replikasyondan çıkartmıştım. Database Engine servisini yine T902 ile çalıştırdım ve bu veritabanını bu SQL Server Instance'ından Detach ettim, yani bu veritabanının ilişiğini kestim. Daha sonra Upgrade Script'i olan [sp_vupgrade_replication] isimli Script'i Query Editor'den elle çalıştırınca hata oluşmadığını gördüm. Database Engine servisini T902'siz tekrar çalıştırdım ve Viola! Database Engine servisim artık sorunsuz çalışıyordu. Demek ki bir şekilde, kim bilir neden, ama bu veritabanımın içinde eski replikasyon kurulumuyla ilgili bazı sıkıntılar/artıklar vs kalmıştı ve Service Pack 1 kurulumunda değil, ama Cumulative Update kurulumunda hataya neden olmuştu.

Tabii ki konuyu burada bırakamazdım, sonuçta bu veritabanının da Upgrade işlemini tamamlatmam ve taşımam gerekiyordu. İçimden bir ses veritabanını tekrar Attach edince, yani tekrar SQL Server Instance'ına bağlayınca sorunun kendiliğinden çözüleceğini söylüyordu ve aynen öyle de oldu. Cumulative Update ve Upgrade Script'lerinin çalıştırılması sırasında hataya neden olan veritabanı, tekrar Attach edilince herhangi bir sıkıntıya neden olmamıştı.

Böylece bir güncelleme sürecini daha kazalı belalı da olsa atlatmış oldum. Olur da benzer bir sorun ile karşılaşırsınız ve faydası olabilir diye sizlerle de paylaşmak istedim.

Kazasız, belasız günler dilerim!

--
Ekrem Önsoy
Microsoft SQL Server Danışmanı
www.ekremonsoy.com



Hiç yorum yok: